<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-05-01T00:39:13.452630" rpa="false" schemaversion="5">
<suite id="s1" name="bgpcep-userfeatures.txt">
<suite id="s1-s1" name="050 Bmp Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/050_bmp_basic.robot">
<kw name="Set_It_Up" type="SETUP">
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:13.955960" level="INFO">${odl_connection} = 1</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:13.955481" elapsed="0.000519"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:13.958598" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:13.958694" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:13.958153" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:13.958878" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:13.960886" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:14.286505" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:11 UTC 2026

  System load:  0.72               Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:13.959946" elapsed="0.326653"/>
</kw>
<msg time="2026-05-01T00:39:14.286674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:13.959416" elapsed="0.327333"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:13.957687" elapsed="0.329162"/>
</kw>
<msg time="2026-05-01T00:39:14.286902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:13.957153" elapsed="0.329807"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:39:13.956604" elapsed="0.330441"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:39:14.287102" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:39:14.287300" level="INFO">${odl} = 1</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:13.955063" elapsed="0.332265"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:39:14.296009" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:39:14.306191" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:39:14.287503" elapsed="0.018823"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:39:14.306691" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-05-01T00:39:14.307784" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:14.307475" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:14.307392" elapsed="0.000547"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:14.315266" level="INFO">${tools_connection} = 2</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:14.314687" elapsed="0.000619"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:14.317757" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:14.317876" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:14.317307" elapsed="0.000605"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:14.318117" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:14.319850" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:15.009856" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:14 UTC 2026

  System load:  0.06               Processes:             117
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:14.319350" elapsed="0.690704"/>
</kw>
<msg time="2026-05-01T00:39:15.010126" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:14.318840" elapsed="0.691361"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:14.316669" elapsed="0.693635"/>
</kw>
<msg time="2026-05-01T00:39:15.010356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:14.316054" elapsed="0.694351"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:39:14.315575" elapsed="0.694923"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-05-01T00:39:15.010549" elapsed="0.000041"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:14.314154" elapsed="0.696559"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-05-01T00:39:13.951295" elapsed="1.059472"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:15.011327" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1c40b790&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:39:15.011009" elapsed="0.000545"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.026952" level="INFO">${name_prefix} = bgp-bmp-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.026612" elapsed="0.000368"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.027507" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.027128" elapsed="0.000405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.028086" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.027683" elapsed="0.000430"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.029323" elapsed="0.000338"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-05-01T00:39:15.030085" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.029869" elapsed="0.000243"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.030662" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.030255" elapsed="0.000434"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.047306" elapsed="0.000426"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.046913" elapsed="0.000892"/>
</kw>
<msg time="2026-05-01T00:39:15.047853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.039428" elapsed="0.008477"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to vanadium and in case vanadium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.039090" elapsed="0.008892"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.063848" elapsed="0.000411"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.063444" elapsed="0.000884"/>
</kw>
<msg time="2026-05-01T00:39:15.064374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.056016" elapsed="0.008414"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to vanadium and in case vanadium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.055698" elapsed="0.008826"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.080552" elapsed="0.000404"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.080148" elapsed="0.000901"/>
</kw>
<msg time="2026-05-01T00:39:15.081099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.072642" elapsed="0.008507"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to vanadium and in case vanadium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.072307" elapsed="0.008918"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.083895" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.084636" elapsed="0.000179"/>
</kw>
<msg time="2026-05-01T00:39:15.084863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.084291" elapsed="0.000622"/>
</kw>
<msg time="2026-05-01T00:39:15.085026" level="INFO">${itemlist} = pcep-impl</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-05-01T00:39:15.083564" elapsed="0.001487"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.085323" level="INFO">index=2
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:39:15.085429" level="INFO">${current_ssh_connection} = index=2
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:39:15.085190" elapsed="0.000281"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.089730" level="INFO">${odl_connection} = 3</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.089323" elapsed="0.000433"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.091303" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:15.091379" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:15.091021" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.091554" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.093150" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:15.400261" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:11 UTC 2026

  System load:  0.72               Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:14 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:15.092347" elapsed="0.308013"/>
</kw>
<msg time="2026-05-01T00:39:15.400422" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.092017" elapsed="0.308481"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:15.090611" elapsed="0.309976"/>
</kw>
<msg time="2026-05-01T00:39:15.400634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.090224" elapsed="0.310456"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:39:15.089915" elapsed="0.310892"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:39:15.400868" elapsed="0.000040"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:15.089037" elapsed="0.311986"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.401419" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.2/system pcep-impl'.</msg>
<msg time="2026-05-01T00:39:15.444335" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:15.444627" level="INFO">${version} = 1.0.1
org/opendaylight/bgpcep</msg>
<msg time="2026-05-01T00:39:15.444729" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:15.401174" elapsed="0.043604"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:39:15.445143" elapsed="0.000535"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:39:15.451591" elapsed="0.000316"/>
</kw>
<msg time="2026-05-01T00:39:15.452002" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.450349" elapsed="0.001764"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.452422" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.452785" elapsed="0.000091"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:39:15.446178" elapsed="0.006842"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.453628" level="INFO">1.0.1
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.453305" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.453951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.453750" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.453727" elapsed="0.000303"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:39:15.454386" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:39:15.454431" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:39:15.454154" elapsed="0.000314"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-05-01T00:39:15.454520" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:39:15.454718" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:39:15.454761" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-05-01T00:39:15.083202" elapsed="0.371581"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:15.081307" elapsed="0.373516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.454981" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.454850" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.081285" elapsed="0.373778"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.455317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.455124" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.455107" elapsed="0.000293"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.455932" level="INFO">${is_staged} = "TRUE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.455559" elapsed="0.000399"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.456509" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.456103" elapsed="0.000507"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.457177" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.456764" elapsed="0.000440"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.457728" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.457344" elapsed="0.000411"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.459529" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml'.</msg>
<msg time="2026-05-01T00:39:15.593781" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:15.594044" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorel...</msg>
<msg time="2026-05-01T00:39:15.594149" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-05-01T00:39:15.594242" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:15.459300" elapsed="0.134992"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.596695" level="INFO">Length is 316.</msg>
<msg time="2026-05-01T00:39:15.596939" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1095    0  1095    0     0  10083      0 --:--:-- --:--:-- --:--:-- 10138' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.595410" elapsed="0.001709">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1095    0  1095    0     0  10083      0 --:--:-- --:--:-- --:--:-- 10138' should be empty.</status>
</kw>
<msg time="2026-05-01T00:39:15.597368" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:39:15.597498" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:15.594700" elapsed="0.002856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.598847" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.597888" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.601151" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.600579" elapsed="0.000703"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.602138" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1095    0  1095    0     0  10083      0 --:--:-- --:--:-- --:--:-- 10138</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.601605" elapsed="0.000634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.603087" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.602561" elapsed="0.000622"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:39:15.599827" elapsed="0.003475"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:15.599086" elapsed="0.004293"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.599041" elapsed="0.004398"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.603833" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:15.603606" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.603566" elapsed="0.000417"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:39:15.604311" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:39:15.604103" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.604066" elapsed="0.000475"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.604865" elapsed="0.000050"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:39:15.458775" elapsed="0.146356"/>
</kw>
<msg time="2026-05-01T00:39:15.605262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.458254" elapsed="0.147112"/>
</kw>
<msg time="2026-05-01T00:39:15.605596" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorel...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-05-01T00:39:15.457939" elapsed="0.147685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.607730" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-05-01T00:39:15.655588" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:15.655839" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorel...</msg>
<msg time="2026-05-01T00:39:15.655943" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-05-01T00:39:15.656039" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:15.607552" elapsed="0.048538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.657868" level="INFO">Length is 253.</msg>
<msg time="2026-05-01T00:39:15.658055" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.657234" elapsed="0.000974">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-05-01T00:39:15.658447" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:39:15.658580" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:15.656439" elapsed="0.002197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.660011" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.659015" elapsed="0.001056"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.662343" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.661782" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.663684" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.662770" elapsed="0.001022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.664645" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.664082" elapsed="0.000702"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:39:15.661029" elapsed="0.003880"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:15.660252" elapsed="0.004734"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.660205" elapsed="0.004838"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.665401" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:15.665174" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.665137" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.665727" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:15.665601" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.665578" elapsed="0.000240"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.666488" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.665984" elapsed="0.000654">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-05-01T00:39:15.607025" elapsed="0.059793">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:39:15.666900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.606537" elapsed="0.060429"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-05-01T00:39:15.606138" elapsed="0.060972">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:39:15.667263" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:39:15.667324" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:15.605765" elapsed="0.061593"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.667945" level="INFO">Length is 288.</msg>
<msg time="2026-05-01T00:39:15.668049" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:15.667577" elapsed="0.000505"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.668868" level="INFO">${namepart} = 1.0.1</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.668280" elapsed="0.000625"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.669597" level="INFO">${filename} = bgp-bmp-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.669101" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.670158" level="INFO">bgp-bmp-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.669820" elapsed="0.000398"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.670858" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/bgp-bmp-mock-1.0.1-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.670398" elapsed="0.000497"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.671312" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/bgp-bmp-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:15.731951" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-05-01T00:39:15.732188" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:39:15.732287" level="INFO">${result} = 8</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:15.671086" elapsed="0.061252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.733281" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.732725" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.733806" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:15.733562" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.733516" elapsed="0.000442"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:39:15.735002" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/bgp-bmp-mock-1.0.1-executable.jar</msg>
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.734236" elapsed="0.000827"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:15.735799" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.1/bgp-bmp-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:15.934021" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:15.934279" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:39:15.934383" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:15.735384" elapsed="0.199050"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.935129" elapsed="0.000119"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.934665" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.934619" elapsed="0.000768"/>
</if>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:39:15.935498" elapsed="0.000068"/>
</return>
<msg time="2026-05-01T00:39:15.935867" level="INFO">${filename} = bgp-bmp-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
bgpcep is a name part of an artifact present in system/ of ODl installation with the same version as bgp-bmp-mock should have.
Must have https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/integration/karaf/0.23.2/karaf-0.23.2.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-05-01T00:39:15.028716" elapsed="0.907209"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:39:15.936074" elapsed="0.000058"/>
</return>
<msg time="2026-05-01T00:39:15.936401" level="INFO">${name} = bgp-bmp-mock-1.0.1-executable.jar</msg>
<var>${name}</var>
<arg>bgpcep</arg>
<arg>bgp-bmp-mock</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-05-01T00:39:15.021622" elapsed="0.914863"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.944959" level="INFO">${filename} = bgp-bmp-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:39:15.936845" elapsed="0.008216"/>
</kw>
<doc>Create SSH session to ToolsVm, prepare HTTP client session to Controller.
Figure out latest pcc-mock version and download it from Nexus to ToolsVm.</doc>
<status status="PASS" start="2026-05-01T00:39:13.950838" elapsed="1.994360"/>
</kw>
<test id="s1-s1-t1" name="Verify BMP Feature" line="39">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.946246" level="INFO">&amp;{mapping} = { TOOL_IP=10.30.170.157 }</msg>
<var>&amp;{mapping}</var>
<arg>TOOL_IP=${TOOLS_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.945840" elapsed="0.000434"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.981287" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.980910" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:15.982195" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.981914" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:15.982384" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.981480" elapsed="0.000929"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.982966" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.982570" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:15.983276" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:15.983445" level="INFO">${template} = /rests/data/bmp-monitor:bmp-monitor
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:15.983133" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.983872" level="INFO">/rests/data/bmp-monitor:bmp-monitor
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.983621" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.984874" level="INFO">mapping: {'TOOL_IP': '10.30.170.157'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:15.984616" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.985332" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.985056" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.986112" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:39:15.985766" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:39:15.987103" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.986705" elapsed="0.000425"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:39:15.987186" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:39:15.987347" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:39:15.986355" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:15.987522" elapsed="0.000353"/>
</kw>
<var name="${key}">TOOL_IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:39:15.985641" elapsed="0.002277"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:39:15.985422" elapsed="0.002538"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:39:15.988008" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:39:15.988168" level="INFO">${mapping_to_use} = {'TOOL_IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:39:15.984282" elapsed="0.003912"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:15.983990" elapsed="0.004235"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.988379" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.988250" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.983968" elapsed="0.004517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.989250" level="INFO">${final_text} = /rests/data/bmp-monitor:bmp-monitor</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:15.988650" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:15.989328" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:15.980291" elapsed="0.009181"/>
</kw>
<msg time="2026-05-01T00:39:15.989527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:15.979386" elapsed="0.010190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.990054" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.990556" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.991038" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.991203" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.991354" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.991765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.991606" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:15.991591" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.991971" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.992121" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.992266" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:15.991559" elapsed="0.000760"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.991430" elapsed="0.000917"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.992492" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.992602" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:39:15.992716" level="INFO">${uri} = /rests/data/bmp-monitor:bmp-monitor</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:15.975476" elapsed="0.017266"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:15.993921" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.993675" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:15.994093" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.993343" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.994419" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:15.994193" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.995163" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:15.994868" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:15.994518" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.994171" elapsed="0.001075"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:15.997379" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:15.995375" elapsed="0.002030"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:39:15.997477" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:39:15.997645" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:39:15.993043" elapsed="0.004627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:15.998829" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:15.998586" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:15.998998" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:15.998252" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:39:15.999233" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:39:15.999097" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:15.999078" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.999464" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:15.999619" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:39:15.999687" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:39:16.001622" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:39:15.997955" elapsed="0.003695"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.002993" level="INFO">/rests/data/bmp-monitor:bmp-monitor</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.002745" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.003414" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.003173" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:16.809798" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bmp-monitor:bmp-monitor 
 path_url=/rests/data/bmp-monitor:bmp-monitor 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:16.810905" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bmp-monitor:bmp-monitor 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0cut8a5sb6vej8vh74dnsaru80.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:39:16 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"bmp-monitor:bmp-monitor":{"monitor":[{"monitor-id":"example-bmp-monitor"}]}} 
 </msg>
<msg time="2026-05-01T00:39:16.811147" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:16.005356" elapsed="0.805849"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.003544" elapsed="0.807762"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.811708" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.811366" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.003525" elapsed="0.808376"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.817804" level="INFO">{"bmp-monitor:bmp-monitor":{"monitor":[{"monitor-id":"example-bmp-monitor"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.814135" elapsed="0.003717"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.813691" elapsed="0.004195"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.813649" elapsed="0.004263"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.820127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.818167" elapsed="0.002019"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.817969" elapsed="0.002252"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.817952" elapsed="0.002294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.823766" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:16.820385" elapsed="0.003410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.824084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.823869" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.824640" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.824317" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.824181" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.823850" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.825228" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:16.824858" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.825546" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.825326" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.826056" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.825763" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.825629" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.825309" elapsed="0.000829"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.826266" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:39:16.827153" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:16.826775" elapsed="0.000404"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:39:16.827313" elapsed="0.002049"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:39:16.812714" elapsed="0.016776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.829683" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:16.829574" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.829555" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:16.832295" level="INFO">${text_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor"
   }
  ]
 }
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:16.829877" elapsed="0.002446"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:39:16.832375" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:39:16.832550" level="INFO">${response_text} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor"
   }
  ]
 }
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:39:16.001946" elapsed="0.830629"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:39:16.832639" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:39:16.832795" level="INFO">${response_text} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor"
   }
  ]
 }
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:39:15.954807" elapsed="0.878013"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.848388" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.847991" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:16.849155" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:16.848883" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:16.849322" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:16.848572" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.849893" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:16.849510" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:16.850195" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/empty_structure/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:16.850333" level="INFO">${template} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor"
            }
        ]
    }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:16.850058" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.850753" level="INFO">{
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.850510" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:39:16.851136" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.850865" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.851652" level="INFO">${mapping_to_use} = {'TOOL_IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.851342" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.851219" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.850846" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.852302" level="INFO">${final_text} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor"
            }
        ]
    }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:16.851860" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:16.852383" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:16.847390" elapsed="0.005171"/>
</kw>
<msg time="2026-05-01T00:39:16.852615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.846635" elapsed="0.006029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.853136" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.853637" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/empty_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.854115" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.854277" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.854427" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.854802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.854681" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:16.854667" elapsed="0.000213"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.854998" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.855143" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.855287" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:16.854634" elapsed="0.000705"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.854525" elapsed="0.000844"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.855515" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.855592" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:39:16.855707" level="INFO">${expected_text} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor"
            }
        ]
    }
}</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:16.843089" elapsed="0.012645"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.855919" elapsed="0.002113"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:16.859017" level="INFO">${expected_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor"
   }
  ]
 }
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:16.858739" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:16.859463" level="INFO">${actual_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor"
   }
  ]
 }
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:16.859177" elapsed="0.000315"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:39:16.859626" elapsed="0.000330"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:39:16.858333" elapsed="0.001684"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.858113" elapsed="0.001937"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.860226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:16.860075" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.858094" elapsed="0.002209"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:39:16.833903" elapsed="0.026449"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:39:16.833119" elapsed="0.027306"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:16.832901" elapsed="0.027585"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.832884" elapsed="0.027627"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:39:16.860545" elapsed="0.000028"/>
</return>
<arg>folder=${BGP_BMP_FEAT_DIR}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:39:15.950105" elapsed="0.910566"/>
</kw>
<arg>180s</arg>
<arg>5s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>folder=${BGP_BMP_FEAT_DIR}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:39:15.946421" elapsed="0.914306"/>
</kw>
<doc>Verifies if feature is up</doc>
<status status="PASS" start="2026-05-01T00:39:15.945335" elapsed="0.915527"/>
</test>
<test id="s1-s1-t2" name="Start_Bmp_Mock" line="51">
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.862525" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.862985" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.863429" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:16.864939" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:16.878202" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:16.878351" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jul 16  2025 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-05-01T00:39:16.878416" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:16.864758" elapsed="0.013716"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-05-01T00:39:16.878744" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:39:16.878592" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:16.878562" elapsed="0.000316"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.878928" elapsed="0.000020"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-05-01T00:39:16.864369" elapsed="0.014714"/>
</kw>
<msg time="2026-05-01T00:39:16.879143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:16.863888" elapsed="0.015320"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.879418" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.879677" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:16.879624" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:16.879599" elapsed="0.000168"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.879944" elapsed="0.000029"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.880198" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.880385" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:16.880330" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:16.880307" elapsed="0.000188"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.880664" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.880987" elapsed="0.000046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.881336" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:39:16.881648" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:16.881569" elapsed="0.000172"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:16.881531" elapsed="0.000260"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:16.882052" elapsed="0.000046"/>
</kw>
<msg time="2026-05-01T00:39:16.882323" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-05-01T00:39:16.862170" elapsed="0.020210"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.883487" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar bgp-bmp-mock-1.0.1-executable.jar --local_address 10.30.170.157 --remote_address 10.30.170.185:12345 --routers_count 1 --peers_count 1 --log_level DEBU...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.882712" elapsed="0.000841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.884419" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar bgp-bmp-mock-1.0.1-executable.jar --local_address 10.30.170.157 --remote_address 10.30.170.185:12345 --routers_count 1 --peers_count 1 --log_level DEBUG 2&gt;&amp;1 | tee bmpmock.log</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.883856" elapsed="0.000700"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-05-01T00:39:16.884652" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:39:16.884992" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar bgp-bmp-mock-1.0.1-executable.jar --local_address 10.30.170.157 --remote_address 10.30.170.185:12345 --routers_count 1 --peers_count 1 --log_level DEBU...</msg>
<var>${command}</var>
<arg>-jar ${filename} --local_address ${TOOLS_SYSTEM_IP} --remote_address ${ODL_SYSTEM_IP}:12345 --routers_count 1 --peers_count 1 --log_level DEBUG 2&gt;&amp;1 | tee ${BMP_LOG_FILE}</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-05-01T00:39:16.861550" elapsed="0.023501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.885935" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar bgp-bmp-mock-1.0.1-executable.jar --local_address 10.30.170.157 --remote_address 10.30.170.185:12345 --routers_count 1 --peers_count 1 --log_level DEBUG 2&gt;&amp;1 | tee bmpmock.log</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:16.885355" elapsed="0.000685"/>
</kw>
<kw name="Set Client Configuration" owner="SSHLibrary">
<arg>timeout=30s</arg>
<doc>Update the `configuration` of the current connection.</doc>
<status status="PASS" start="2026-05-01T00:39:16.886327" elapsed="0.000411"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:39:16.924569" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar bgp-bmp-mock-1.0.1-executable.jar --local_address 10.30.170.157 --remote_address 10.30.170.185:12345 --routers_count 1 --peers_count 1 --log_level DEBUG 2&gt;&amp;1 | tee bmpmock.log</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:39:16.887025" elapsed="0.037604"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:16.925049" level="INFO">${until_phrase} = successfully established.</msg>
<var>${until_phrase}</var>
<arg>successfully established.</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:16.924788" elapsed="0.000286"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-05-01T00:39:18.620869" level="INFO">[?2004l00:39:17.332 [main] INFO org.opendaylight.protocol.bmp.mock.BmpMock -- Starting BMP test tool.
00:39:17.515 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.522 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC, preferring the latter
00:39:17.522 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC@5af97850
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC@5af97850
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler@4b168fa9
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler@4b168fa9
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler@55a561cf
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler, preferring the latter
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler@55a561cf
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC, preferring the latter
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC@6295d394
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC@6295d394
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler@2aa5fe93
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler@2aa5fe93
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler@3e3047e6
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler@3e3047e6
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler@6ab7a896
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler@6ab7a896
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler@d83da2e
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler@d83da2e
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler@4f638935
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler@4f638935
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler@7ff95560
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler@7ff95560
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler@78dd667e
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler@78dd667e
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler, preferring the latter
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler@6293abcc
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler, preferring the latter
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler@6293abcc
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler@23986957
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler@23986957
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser@6b19b79
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser@6b19b79
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler@4fe767f3
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler@4fe767f3
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser, preferring the latter
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser@ec756bd
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser, preferring the latter
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser@ec756bd
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser, preferring the latter
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser@5dd6264
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser, preferring the latter
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser@5dd6264
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser, preferring the latter
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser@6ac13091
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser, preferring the latter
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser@6ac13091
00:39:17.540 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser, preferring the latter
00:39:17.540 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser@1ed1993a
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser@1ed1993a
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser@60d8c9b7
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser@60d8c9b7
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser@65466a6a
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser@65466a6a
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser@79b06cab
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser@79b06cab
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser, preferring the latter
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser@7880cdf3
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser, preferring the latter
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser@7880cdf3
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser, preferring the latter
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser@22a637e7
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser, preferring the latter
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser@22a637e7
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser, preferring the latter
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser@5ae50ce6
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser, preferring the latter
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser@5ae50ce6
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser, preferring the latter
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser@418e7838
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser, preferring the latter
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser@418e7838
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser, preferring the latter
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser@5a63f509
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser, preferring the latter
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser@5a63f509
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser@a9cd3b1
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser@a9cd3b1
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser@63355449
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser@63355449
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser@5c30a9b0
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser@5c30a9b0
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser@3f197a46
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser@6ca8564a
00:39:17.550 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer, preferring the latter
00:39:17.550 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer@76508ed1
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser, preferring the latter
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser@481a996b
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser, preferring the latter
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser@481a996b
00:39:17.552 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser, preferring the latter
00:39:17.552 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser@708f5957
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser@708f5957
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser@1ea9f6af
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser@1ea9f6af
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser, preferring the latter
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser@62ddbd7e
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser, preferring the latter
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser@62ddbd7e
00:39:17.616 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser, preferring the latter
00:39:17.616 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser@15de0b3c
00:39:17.617 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser, preferring the latter
00:39:17.617 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser@15de0b3c
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler@c86b9e3
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler@c86b9e3
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler@ed7f8b4
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler@ed7f8b4
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler@5c90e579
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler@5c90e579
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler@63070bab
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler@63070bab
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler@762ef0ea
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler@762ef0ea
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler@5f8edcc5
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler@5f8edcc5
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler@15ca7889
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler@15ca7889
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler@2898ac89
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler@2898ac89
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler@6ff29830
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler@6ff29830
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler@548e6d58
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler@548e6d58
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler@3098cf3b
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler@3098cf3b
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler@57250572
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler@57250572
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler@11fc564b
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler@11fc564b
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler@fa36558
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler@fa36558
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler@3571b748
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler@3571b748
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler@7c83dc97
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler@7c83dc97
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler@55740540
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler@55740540
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler@65b3f4a4
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler@65b3f4a4
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.InitiationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.InitiationHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.InitiationHandler@2a266d09
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.InitiationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.InitiationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.InitiationHandler@2a266d09
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.TerminationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.TerminationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.TerminationHandler@757acd7b
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.TerminationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.TerminationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.TerminationHandler@757acd7b
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerUpHandler@343570b7
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerUpHandler@343570b7
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerDownHandler@69fb6037
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerDownHandler@69fb6037
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler@609db43b
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler@609db43b
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler@41c2284a
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler@41c2284a
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler@4f67eb2a
00:39:17.635 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler, preferring the latter
00:39:17.635 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler@4f67eb2a
00:39:17.789 [main] INFO  o.o.p.b.m.BmpMockDispatcher - BMP client /10.30.170.157:0 &lt;--&gt; /10.30.170.185:12345 deployed
00:39:17.814 [bmp-worker-0] DEBUG o.o.p.b.m.BmpMockDispatcher - Connection AbstractBootstrap$PendingRegistrationPromise@742fb606(success) succeeded!
00:39:17.814 [bmp-worker-0] INFO  o.o.p.b.m.BmpMockSession - BMP session [id: 0x3407beba, L:/10.30.170.157:36311 - R:10.30.170.185/10.30.170.185:12345] successfully established.</msg>
<arg>${until_phrase}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-05-01T00:39:16.925206" elapsed="1.696875"/>
</kw>
<doc>Starts bmp-mock on tools vm</doc>
<status status="PASS" start="2026-05-01T00:39:16.861084" elapsed="1.761171"/>
</test>
<test id="s1-s1-t3" name="Verify Data Reported" line="61">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.623483" level="INFO">&amp;{mapping} = { TOOL_IP=10.30.170.157 }</msg>
<var>&amp;{mapping}</var>
<arg>TOOL_IP=${TOOLS_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:18.622963" elapsed="0.000550"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.656198" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.655825" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.656970" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:18.656704" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:18.657171" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:18.656367" elapsed="0.000828"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.657771" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:18.657339" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.658100" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:18.658255" level="INFO">${template} = /rests/data/bmp-monitor:bmp-monitor
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:18.657955" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.658676" level="INFO">/rests/data/bmp-monitor:bmp-monitor
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.658413" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.659661" level="INFO">mapping: {'TOOL_IP': '10.30.170.157'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.659386" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.660102" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:18.659841" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.660840" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:39:18.660499" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:39:18.661881" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:39:18.661505" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:39:18.661962" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:39:18.662126" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:39:18.661035" elapsed="0.001116"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:18.662284" elapsed="0.000305"/>
</kw>
<var name="${key}">TOOL_IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:39:18.660367" elapsed="0.002263"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:39:18.660183" elapsed="0.002487"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:39:18.662713" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:39:18.662871" level="INFO">${mapping_to_use} = {'TOOL_IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:39:18.659074" elapsed="0.003822"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.658796" elapsed="0.004132"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.663082" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.662953" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.658772" elapsed="0.004385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.663762" level="INFO">${final_text} = /rests/data/bmp-monitor:bmp-monitor</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.663279" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:18.663838" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:18.655194" elapsed="0.008806"/>
</kw>
<msg time="2026-05-01T00:39:18.664054" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:18.654412" elapsed="0.009690"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.664594" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.665085" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.665583" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.665748" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.665898" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.666249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.666125" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:18.666111" elapsed="0.000216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.666444" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.666614" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.666761" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:18.666081" elapsed="0.000734"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.665972" elapsed="0.000870"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.666966" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.667042" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:39:18.667150" level="INFO">${uri} = /rests/data/bmp-monitor:bmp-monitor</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:18.650723" elapsed="0.016452"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.668404" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:18.668166" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:18.668577" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:18.667851" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.668894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.668672" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.669415" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.669126" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.668975" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.668654" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.671801" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:18.669642" elapsed="0.002186"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:39:18.671880" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:39:18.672033" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:39:18.667551" elapsed="0.004507"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.673211" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:18.672967" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:18.673366" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:18.672655" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:39:18.673613" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:39:18.673476" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.673443" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.673821" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.673969" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.674034" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:39:18.675735" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:39:18.672340" elapsed="0.003421"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.677111" level="INFO">/rests/data/bmp-monitor:bmp-monitor</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.676863" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.677542" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.677286" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:18.696265" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bmp-monitor:bmp-monitor 
 path_url=/rests/data/bmp-monitor:bmp-monitor 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0cut8a5sb6vej8vh74dnsaru80.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:18.696977" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bmp-monitor:bmp-monitor 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '882'} 
 body={"bmp-monitor:bmp-monitor":{"monitor":[{"monitor-id":"example-bmp-monitor","router":[{"router-id":"10.30.170.157","peer":[{"peer-id":"1.1.1.1","pre-policy-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"type":"global","bgp-id":"1.1.1.1","address":"1.1.1.1","post-policy-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-session":{"remote-port":179,"local-address":"10.30.170.157","status":"up","sent-open":{"hold-timer":180,"my-as-number":65431,"bgp-identifier":"10.30.170.157"},"timestamp-sec":0,"local-port":179,"received-open":{"hold-timer":180,"my-as-number":65431,"bgp-identifier":"1.1.1.1"}},"as":65431}],"status":"up","description":"OpenDaylight","name":"BMP mock","info":""}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:18.697097" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:18.679490" elapsed="0.017668"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.677652" elapsed="0.019551"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.697365" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.697230" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.677634" elapsed="0.019833"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.702073" level="INFO">{"bmp-monitor:bmp-monitor":{"monitor":[{"monitor-id":"example-bmp-monitor","router":[{"router-id":"10.30.170.157","peer":[{"peer-id":"1.1.1.1","pre-policy-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"type":"global","bgp-id":"1.1.1.1","address":"1.1.1.1","post-policy-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-session":{"remote-port":179,"local-address":"10.30.170.157","status":"up","sent-open":{"hold-timer":180,"my-as-number":65431,"bgp-identifier":"10.30.170.157"},"timestamp-sec":0,"local-port":179,"received-open":{"hold-timer":180,"my-as-number":65431,"bgp-identifier":"1.1.1.1"}},"as":65431}],"status":"up","description":"OpenDaylight","name":"BMP mock","info":""}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.698431" elapsed="0.003762"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.698231" elapsed="0.004043"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.698213" elapsed="0.004117"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.707534" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.702974" elapsed="0.004665"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.702486" elapsed="0.005230"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.702418" elapsed="0.005356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.708967" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.708081" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.709692" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.709189" elapsed="0.000635"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.710894" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.710188" elapsed="0.000766"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.709880" elapsed="0.001156"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.709149" elapsed="0.001936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.711900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.711437" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.712207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.711998" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.712734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.712423" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.712288" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.711981" elapsed="0.000838"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:18.712955" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:39:18.713740" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.713441" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:39:18.713900" elapsed="0.002174"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:39:18.697810" elapsed="0.018327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.716313" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:18.716207" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.716189" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:18.719328" level="INFO">${text_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor",
    "router": [
     {
      "description": "OpenDaylight",
      "info": "",
      "name": "BMP mock",
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:18.716522" elapsed="0.002837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:39:18.719412" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:39:18.719623" level="INFO">${response_text} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor",
    "router": [
     {
      "description": "OpenDaylight",
      "info": "",
      "name": "BMP mock",
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:39:18.676052" elapsed="0.043600"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:39:18.719716" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:39:18.719868" level="INFO">${response_text} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor",
    "router": [
     {
      "description": "OpenDaylight",
      "info": "",
      "name": "BMP mock",
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:39:18.631412" elapsed="0.088483"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.734394" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.734016" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.735153" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:18.734893" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:18.735328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:18.734584" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.735910" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:18.735521" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:18.736211" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bmp_basic/filled_structure/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:18.736348" level="INFO">${template} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor",
                "router": [
                    {
                        "ro...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:18.736076" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.736771" level="INFO">{
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor",
                "router": [
                    {
                        "router-id": "$TOOL_IP",
                        "peer": [
                            {
                                "peer-id": "1.1.1.1",
                                "as": 65431,
                                "address": "1.1.1.1",
                                "bgp-id": "1.1.1.1",
                                "pre-policy-rib": {
                                    "tables": [
                                        {
                                            "afi": "bgp-types:ipv4-address-family",
                                            "safi": "bgp-types:unicast-subsequent-address-family",
                                            "attributes": {
                                                "uptodate": false
                                            }
                                        }
                                    ]
                                },
                                "peer-session": {
                                    "received-open": {
                                        "hold-timer": 180,
                                        "bgp-identifier": "1.1.1.1",
                                        "my-as-number": 65431
                                    },
                                    "remote-port": 179,
                                    "status": "up",
                                    "local-address": "$TOOL_IP",
                                    "timestamp-sec": 0,
                                    "sent-open": {
                                        "hold-timer": 180,
                                        "bgp-identifier": "$TOOL_IP",
                                        "my-as-number": 65431
                                    },
                                    "local-port": 179
                                },
                                "post-policy-rib": {
                                    "tables": [
                                        {
                                            "afi": "bgp-types:ipv4-address-family",
                                            "safi": "bgp-types:unicast-subsequent-address-family",
                                            "attributes": {
                                                "uptodate": false
                                            }
                                        }
                                    ]
                                },
                                "type": "global"
                            }
                        ],
                        "status": "up",
                        "info": "",
                        "description": "OpenDaylight",
                        "name": "BMP mock"
                    }
                ]
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.736527" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:39:18.737210" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.736936" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.737727" level="INFO">${mapping_to_use} = {'TOOL_IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:18.737417" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.737293" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.736917" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.738928" level="INFO">${final_text} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor",
                "router": [
                    {
                        "ro...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.737933" elapsed="0.001025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:18.739007" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:18.733284" elapsed="0.005850"/>
</kw>
<msg time="2026-05-01T00:39:18.739200" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:18.732532" elapsed="0.006726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.739746" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.740398" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure.vanadium/bgp-bmp-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bmp_basic/filled_structure/bgp-bmp-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.740920" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.741084" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.741236" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.741607" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.741484" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:18.741467" elapsed="0.000218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.741804" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.741949" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.742090" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:18.741420" elapsed="0.000752"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.741314" elapsed="0.000887"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.742327" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:18.742403" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:39:18.742542" level="INFO">${expected_text} = {
    "bmp-monitor:bmp-monitor": {
        "monitor": [
            {
                "monitor-id": "example-bmp-monitor",
                "router": [
                    {
                        "ro...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:18.730142" elapsed="0.012428"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:18.742725" elapsed="0.001989"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:18.746200" level="INFO">${expected_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor",
    "router": [
     {
      "description": "OpenDaylight",
      "info": "",
      "name": "BMP mock",
   ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:18.745394" elapsed="0.000835"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:18.747142" level="INFO">${actual_normalized} = {
 "bmp-monitor:bmp-monitor": {
  "monitor": [
   {
    "monitor-id": "example-bmp-monitor",
    "router": [
     {
      "description": "OpenDaylight",
      "info": "",
      "name": "BMP mock",
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:18.746362" elapsed="0.000809"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:39:18.747316" elapsed="0.000347"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:39:18.745012" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.744795" elapsed="0.002963"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:18.747909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:18.747784" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.744777" elapsed="0.003206"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:39:18.720995" elapsed="0.027035"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:39:18.720198" elapsed="0.027905"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:18.719978" elapsed="0.028170"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:18.719961" elapsed="0.028210"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:39:18.748206" elapsed="0.000028"/>
</return>
<arg>folder=${BGP_BMP_DIR}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:39:18.627428" elapsed="0.120903"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>folder=${BGP_BMP_DIR}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:39:18.623660" elapsed="0.124728"/>
</kw>
<doc>Verifies if the tool reported expected data</doc>
<status status="PASS" start="2026-05-01T00:39:18.622498" elapsed="0.126024"/>
</test>
<test id="s1-s1-t4" name="Stop_Bmp_Mock" line="73">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.749931" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:18.749618" elapsed="0.000341"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:39:18.750090" elapsed="0.000250"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:39:18.749253" elapsed="0.001144"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:39:18.979296" level="INFO">00:39:17.948 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: InitiationMessage{tlvs=Tlvs{descriptionTlv=DescriptionTlv{description=OpenDaylight}, nameTlv=NameTlv{name=BMP mock}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: PeerUpNotification{localAddress=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=10.30.170.157}}, localPort=PortNumber{value=179}, peerHeader=PeerHeader{address=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=1.1.1.1}}, adjRibInType=PrePolicy, as=AsNumber{value=65431}, bgpId=Ipv4Address{value=1.1.1.1}, ipv4=true, type=Global}, receivedOpen=ReceivedOpen{bgpIdentifier=Ipv4Address{value=1.1.1.1}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}, remotePort=PortNumber{value=179}, sentOpen=SentOpen{bgpIdentifier=Ipv4Address{value=10.30.170.157}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.m.BmpMockSession - BMP router /10.30.170.157:36311 advertized peer Ipv4Address{value=1.1.1.1}
^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:39:18.979446" level="INFO">${output} = 
00:39:17.948 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: InitiationMessage{tlvs=Tlvs{descriptionTlv=DescriptionTlv{description=OpenDaylight}, nameTlv=NameTlv{nam...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:39:18.750550" elapsed="0.228945"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:18.979896" level="INFO">
00:39:17.948 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: InitiationMessage{tlvs=Tlvs{descriptionTlv=DescriptionTlv{description=OpenDaylight}, nameTlv=NameTlv{name=BMP mock}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: PeerUpNotification{localAddress=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=10.30.170.157}}, localPort=PortNumber{value=179}, peerHeader=PeerHeader{address=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=1.1.1.1}}, adjRibInType=PrePolicy, as=AsNumber{value=65431}, bgpId=Ipv4Address{value=1.1.1.1}, ipv4=true, type=Global}, receivedOpen=ReceivedOpen{bgpIdentifier=Ipv4Address{value=1.1.1.1}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}, remotePort=PortNumber{value=179}, sentOpen=SentOpen{bgpIdentifier=Ipv4Address{value=10.30.170.157}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.m.BmpMockSession - BMP router /10.30.170.157:36311 advertized peer Ipv4Address{value=1.1.1.1}
^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:18.979636" elapsed="0.000317"/>
</kw>
<doc>Send ctrl+c to bmp-mock to stop it</doc>
<status status="PASS" start="2026-05-01T00:39:18.748847" elapsed="0.231210"/>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-05-01T00:39:18.989441" level="INFO">[chan 6] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:39:18.999919" level="INFO">'bmpmock.log' -&gt; '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log'</msg>
<arg>${BMP_LOG_FILE}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-05-01T00:39:18.980841" elapsed="0.019220"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:19.000781" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:19.001235" level="INFO">${cnt} = 00:39:17.332 [main] INFO org.opendaylight.protocol.bmp.mock.BmpMock -- Starting BMP test tool.
00:39:17.515 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message...</msg>
<var>${cnt}</var>
<arg>${BMP_LOG_FILE}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:19.000390" elapsed="0.000908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.002266" level="INFO">00:39:17.332 [main] INFO org.opendaylight.protocol.bmp.mock.BmpMock -- Starting BMP test tool.
00:39:17.515 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.516 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.AsTwoOctetSpecificEcHandler@448ff1a8
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler, preferring the latter
00:39:17.517 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.Ipv4SpecificEcHandler@36f0f1be
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler, preferring the latter
00:39:17.518 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.OpaqueEcHandler@4de5031f
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginAsTwoOctetEcHandler@568bf312
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.519 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetAsTwoOctetEcHandler@35083305
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.520 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.RouteOriginIpv4EcHandler@3ec300f1
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler, preferring the latter
00:39:17.521 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTargetIpv4EcHandler@25b485ba
00:39:17.522 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC, preferring the latter
00:39:17.522 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC@5af97850
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.LinkBandwidthEC@5af97850
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.523 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.Generic4OctASEcHandler@4034c28c
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler@4b168fa9
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.route.target.RouteTarget4OctectASEcHandler@4b168fa9
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler, preferring the latter
00:39:17.524 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler@55a561cf
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler, preferring the latter
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.RouteOrigin4OctectASEcHandler@55a561cf
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC, preferring the latter
00:39:17.525 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC@6295d394
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.EncapsulationEC@6295d394
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler@2aa5fe93
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler, preferring the latter
00:39:17.526 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.VrfRouteImportHandler@2aa5fe93
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler@3e3047e6
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.four.octect.as.specific.SourceAS4OctectHandler@3e3047e6
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler, preferring the latter
00:39:17.527 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler@6ab7a896
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.extended.communities.SourceASHandler@6ab7a896
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler@d83da2e
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler, preferring the latter
00:39:17.528 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler@d83da2e
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler@4f638935
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler@4f638935
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler, preferring the latter
00:39:17.529 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler@7ff95560
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler@7ff95560
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler@78dd667e
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler, preferring the latter
00:39:17.530 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler@78dd667e
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler, preferring the latter
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler@6293abcc
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler, preferring the latter
00:39:17.531 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler@6293abcc
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler@23986957
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler@23986957
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser, preferring the latter
00:39:17.532 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser@6b19b79
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser@6b19b79
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler@4fe767f3
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler, preferring the latter
00:39:17.533 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler@4fe767f3
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser, preferring the latter
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser@ec756bd
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser, preferring the latter
00:39:17.534 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser@ec756bd
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser, preferring the latter
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser@5dd6264
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser, preferring the latter
00:39:17.538 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginAttributeParser@5dd6264
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser, preferring the latter
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser@6ac13091
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser, preferring the latter
00:39:17.539 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser@6ac13091
00:39:17.540 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser, preferring the latter
00:39:17.540 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser@1ed1993a
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser@1ed1993a
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser@60d8c9b7
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser, preferring the latter
00:39:17.541 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.NextHopAttributeParser@60d8c9b7
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser@65466a6a
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MultiExitDiscriminatorAttributeParser@65466a6a
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser@79b06cab
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser, preferring the latter
00:39:17.542 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser@79b06cab
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser, preferring the latter
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser@7880cdf3
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser, preferring the latter
00:39:17.543 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser@7880cdf3
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser, preferring the latter
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser@22a637e7
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser, preferring the latter
00:39:17.544 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttributeParser@22a637e7
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser, preferring the latter
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser@5ae50ce6
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser, preferring the latter
00:39:17.545 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser@5ae50ce6
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser, preferring the latter
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser@418e7838
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser, preferring the latter
00:39:17.546 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.OriginatorIdAttributeParser@418e7838
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser, preferring the latter
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser@5a63f509
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser, preferring the latter
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser@5a63f509
00:39:17.547 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser@a9cd3b1
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPReachAttributeParser@a9cd3b1
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser@63355449
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser, preferring the latter
00:39:17.548 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.MPUnreachAttributeParser@63355449
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser@5c30a9b0
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser@5c30a9b0
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser@3f197a46
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser, preferring the latter
00:39:17.549 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser@6ca8564a
00:39:17.550 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer, preferring the latter
00:39:17.550 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.update.UnrecognizedAttributesSerializer@76508ed1
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser, preferring the latter
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser@481a996b
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser, preferring the latter
00:39:17.551 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser@481a996b
00:39:17.552 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser, preferring the latter
00:39:17.552 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser@708f5957
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser@708f5957
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser@1ea9f6af
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser, preferring the latter
00:39:17.553 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPNotificationMessageParser@1ea9f6af
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser, preferring the latter
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser@62ddbd7e
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser, preferring the latter
00:39:17.615 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPKeepAliveMessageParser@62ddbd7e
00:39:17.616 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser, preferring the latter
00:39:17.616 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser@15de0b3c
00:39:17.617 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser is superclass of class org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser, preferring the latter
00:39:17.617 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bgp.parser.impl.message.BGPRouteRefreshMessageParser@15de0b3c
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler@c86b9e3
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.DescriptionTlvHandler@c86b9e3
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler@ed7f8b4
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.NameTlvHandler@ed7f8b4
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.624 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StringTlvHandler@6ab778a
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler@5c90e579
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.ReasonTlvHandler@5c90e579
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler, preferring the latter
00:39:17.625 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler@63070bab
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.MirrorInformationTlvHandler@63070bab
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler@762ef0ea
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler, preferring the latter
00:39:17.626 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType000TlvHandler@762ef0ea
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler@5f8edcc5
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType001TlvHandler@5f8edcc5
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler@15ca7889
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType002TlvHandler@15ca7889
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler@2898ac89
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType003TlvHandler@2898ac89
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler, preferring the latter
00:39:17.627 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler@6ff29830
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType004TlvHandler@6ff29830
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler@548e6d58
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType005TlvHandler@548e6d58
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler@3098cf3b
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler, preferring the latter
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType006TlvHandler@3098cf3b
00:39:17.628 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler@57250572
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType007TlvHandler@57250572
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler@11fc564b
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType008TlvHandler@11fc564b
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler, preferring the latter
00:39:17.629 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler@fa36558
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType009TlvHandler@fa36558
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler@3571b748
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType010TlvHandler@3571b748
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler@7c83dc97
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType011TlvHandler@7c83dc97
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler, preferring the latter
00:39:17.630 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler@55740540
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType012TlvHandler@55740540
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler@65b3f4a4
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler is superclass of class org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.tlv.StatType013TlvHandler@65b3f4a4
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.InitiationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.InitiationHandler, preferring the latter
00:39:17.631 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.InitiationHandler@2a266d09
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.InitiationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.InitiationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.InitiationHandler@2a266d09
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.TerminationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.TerminationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.TerminationHandler@757acd7b
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.TerminationHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.TerminationHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.TerminationHandler@757acd7b
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler, preferring the latter
00:39:17.632 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerUpHandler@343570b7
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerUpHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerUpHandler@343570b7
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerDownHandler@69fb6037
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.PeerDownHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.PeerDownHandler@69fb6037
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler, preferring the latter
00:39:17.633 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler@609db43b
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.StatisticsReportHandler@609db43b
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler@41c2284a
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMonitoringMessageHandler@41c2284a
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler, preferring the latter
00:39:17.634 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler@4f67eb2a
00:39:17.635 [main] DEBUG o.o.p.c.MultiRegistry - class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler is superclass of class org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler, preferring the latter
00:39:17.635 [main] DEBUG o.o.p.c.MultiRegistry - New best value org.opendaylight.protocol.bmp.parser.message.RouteMirroringMessageHandler@4f67eb2a
00:39:17.789 [main] INFO  o.o.p.b.m.BmpMockDispatcher - BMP client /10.30.170.157:0 &lt;--&gt; /10.30.170.185:12345 deployed
00:39:17.814 [bmp-worker-0] DEBUG o.o.p.b.m.BmpMockDispatcher - Connection AbstractBootstrap$PendingRegistrationPromise@742fb606(success) succeeded!
00:39:17.814 [bmp-worker-0] INFO  o.o.p.b.m.BmpMockSession - BMP session [id: 0x3407beba, L:/10.30.170.157:36311 - R:10.30.170.185/10.30.170.185:12345] successfully established.
00:39:17.948 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: InitiationMessage{tlvs=Tlvs{descriptionTlv=DescriptionTlv{description=OpenDaylight}, nameTlv=NameTlv{name=BMP mock}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.i.BmpMessageToByteEncoder - Message sent to output: PeerUpNotification{localAddress=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=10.30.170.157}}, localPort=PortNumber{value=179}, peerHeader=PeerHeader{address=IpAddressNoZone{ipv4AddressNoZone=Ipv4Address{value=1.1.1.1}}, adjRibInType=PrePolicy, as=AsNumber{value=65431}, bgpId=Ipv4Address{value=1.1.1.1}, ipv4=true, type=Global}, receivedOpen=ReceivedOpen{bgpIdentifier=Ipv4Address{value=1.1.1.1}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}, remotePort=PortNumber{value=179}, sentOpen=SentOpen{bgpIdentifier=Ipv4Address{value=10.30.170.157}, holdTimer=180, myAsNumber=65431, version=ProtocolVersion{value=4}}}
00:39:17.964 [bmp-worker-0] DEBUG o.o.p.b.m.BmpMockSession - BMP router /10.30.170.157:36311 advertized peer Ipv4Address{value=1.1.1.1}
</msg>
<arg>${cnt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:19.001695" elapsed="0.002109"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:19.004203" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:39:19.004094" elapsed="0.000215"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:39:19.004535" elapsed="0.000401"/>
</kw>
<doc>Download bmpmock.log and Log its contents.
Compute and Log the diff between expected and actual normalized responses.
Close both HTTP client session and SSH connection to Mininet.</doc>
<status status="PASS" start="2026-05-01T00:39:18.980642" elapsed="0.024378"/>
</kw>
<doc>Basic tests for odl-bgpcep-bmp feature

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This is a basic suite for bgp monitoring protocol feature.
After the feature odl-bgpcep-bmp installation the port 12345 should be
bound for listening,
To test this feature bgp-bmp-mock tool is used. It is a part of the
bgpcep project. It is a java tool which simulates more peers and more
routers.
In this particular test suite it simulates 1 peer with 1 router, which
means it advertizes one peer ipv4 address towards odl. As a result one
route should appear in the rests/data/bmp-monitor:bmp-monitor?content=nonconfig.</doc>
<status status="PASS" start="2026-05-01T00:39:13.494323" elapsed="5.510744"/>
</suite>
<suite id="s1-s2" name="Pcepuser" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/pcepuser.robot">
<kw name="Set_It_Up" type="SETUP">
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.078858" level="INFO">${odl_connection} = 1</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.078438" elapsed="0.000449"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.080506" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:19.080585" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:19.080215" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.080750" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.081907" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:19.395652" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:11 UTC 2026

  System load:  0.72               Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:15 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:19.081587" elapsed="0.314150"/>
</kw>
<msg time="2026-05-01T00:39:19.395797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.081229" elapsed="0.314633"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:19.079801" elapsed="0.316146"/>
</kw>
<msg time="2026-05-01T00:39:19.395996" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.079407" elapsed="0.316633"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:39:19.079080" elapsed="0.317034"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:39:19.396157" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:39:19.396329" level="INFO">${odl} = 1</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:19.078153" elapsed="0.318203"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.406586" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:39:19.414659" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:39:19.396521" elapsed="0.018272"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:39:19.415138" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-05-01T00:39:19.416164" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:19.415886" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:19.415839" elapsed="0.000474"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.424768" level="INFO">${tools_connection} = 2</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.424373" elapsed="0.000422"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.426399" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:19.426493" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:19.426129" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.426660" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.427871" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:19.751305" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:14 UTC 2026

  System load:  0.06               Processes:             117
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:14 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:19.427550" elapsed="0.323837"/>
</kw>
<msg time="2026-05-01T00:39:19.751446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.427138" elapsed="0.324382"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:19.425715" elapsed="0.325891"/>
</kw>
<msg time="2026-05-01T00:39:19.751654" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.425319" elapsed="0.326380"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:39:19.425002" elapsed="0.326769"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-05-01T00:39:19.751811" elapsed="0.000031"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:19.424048" elapsed="0.327897"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-05-01T00:39:19.074381" elapsed="0.677615"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:19.752419" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a14aa50&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:39:19.752138" elapsed="0.000476"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.768593" level="INFO">${name_prefix} = pcep-pcc-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:19.768268" elapsed="0.000353"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.769108" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:19.768768" elapsed="0.000368"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.769689" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:19.769285" elapsed="0.000430"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.770905" elapsed="0.000307"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-05-01T00:39:19.771576" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.771355" elapsed="0.000252"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.772131" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:19.771750" elapsed="0.000408"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.788542" elapsed="0.000400"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.788143" elapsed="0.000867"/>
</kw>
<msg time="2026-05-01T00:39:19.789091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.780459" elapsed="0.008685"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to vanadium and in case vanadium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.780128" elapsed="0.009092"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.805474" elapsed="0.000398"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.805074" elapsed="0.000866"/>
</kw>
<msg time="2026-05-01T00:39:19.805986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.797475" elapsed="0.008558"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to vanadium and in case vanadium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.797145" elapsed="0.008961"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.823760" elapsed="0.000401"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.823352" elapsed="0.000878"/>
</kw>
<msg time="2026-05-01T00:39:19.824276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.814336" elapsed="0.009987"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to vanadium and in case vanadium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:39:19.814019" elapsed="0.010379"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.827176" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.827909" elapsed="0.000179"/>
</kw>
<msg time="2026-05-01T00:39:19.828132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.827582" elapsed="0.000599"/>
</kw>
<msg time="2026-05-01T00:39:19.828283" level="INFO">${itemlist} = pcep-impl</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-05-01T00:39:19.826931" elapsed="0.001377"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.828587" level="INFO">index=2
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:39:19.828689" level="INFO">${current_ssh_connection} = index=2
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:39:19.828462" elapsed="0.000254"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.833051" level="INFO">${odl_connection} = 3</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:39:19.832679" elapsed="0.000398"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:19.834610" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:39:19.834686" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:19.834332" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.834872" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:39:19.836408" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:39:20.144405" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:39:11 UTC 2026

  System load:  0.72               Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:19 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:39:19.835681" elapsed="0.308872"/>
</kw>
<msg time="2026-05-01T00:39:20.144615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.835332" elapsed="0.309338"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:39:19.833924" elapsed="0.310829"/>
</kw>
<msg time="2026-05-01T00:39:20.144801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:19.833560" elapsed="0.311286"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:39:19.833237" elapsed="0.311677"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:39:20.144953" elapsed="0.000031"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:39:19.832390" elapsed="0.312697"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.145488" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.2/system pcep-impl'.</msg>
<msg time="2026-05-01T00:39:20.187968" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:20.188216" level="INFO">${version} = 1.0.1
org/opendaylight/bgpcep</msg>
<msg time="2026-05-01T00:39:20.188315" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.145235" elapsed="0.043131"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:39:20.188727" elapsed="0.000454"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:39:20.195237" elapsed="0.000364"/>
</kw>
<msg time="2026-05-01T00:39:20.195662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.193947" elapsed="0.001784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.195934" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.196161" elapsed="0.000041"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:39:20.189722" elapsed="0.006593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.196929" level="INFO">1.0.1
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.196558" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.197365" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:20.197088" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.197062" elapsed="0.000441"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:39:20.198004" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:39:20.198067" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:39:20.197687" elapsed="0.000411"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-05-01T00:39:20.198167" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:39:20.198433" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:39:20.198533" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-05-01T00:39:19.826569" elapsed="0.372013"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:19.824489" elapsed="0.374152"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.198862" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:20.198676" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:19.824468" elapsed="0.374506"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.199346" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:20.199051" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.199030" elapsed="0.000473"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.200214" level="INFO">${is_staged} = "TRUE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.199696" elapsed="0.000555"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.201016" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.200478" elapsed="0.000575"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.201891" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.201311" elapsed="0.000617"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.202670" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:20.202127" elapsed="0.000580"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.205158" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml'.</msg>
<msg time="2026-05-01T00:39:20.288283" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:20.288588" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-05-01T00:39:20.288703" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-05-01T00:39:20.288798" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.204908" elapsed="0.083939"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.290594" level="INFO">Length is 316.</msg>
<msg time="2026-05-01T00:39:20.290781" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  16908      0 --:--:-- --:--:-- --:--:-- 17156' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:39:20.289962" elapsed="0.000971">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  16908      0 --:--:-- --:--:-- --:--:-- 17156' should be empty.</status>
</kw>
<msg time="2026-05-01T00:39:20.291163" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:39:20.291261" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:20.289209" elapsed="0.002104"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.292633" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.291678" elapsed="0.001016"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.295363" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.294343" elapsed="0.001187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.296381" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  16908      0 --:--:-- --:--:-- --:--:-- 17156</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.295840" elapsed="0.000676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.297399" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.296855" elapsed="0.000678"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:39:20.293609" elapsed="0.004053"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:20.292867" elapsed="0.004873"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.292824" elapsed="0.004974"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.298149" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.297924" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.297887" elapsed="0.000414"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:39:20.298715" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:39:20.298415" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.298382" elapsed="0.000528"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.299265" elapsed="0.000050"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:39:20.204153" elapsed="0.095417"/>
</kw>
<msg time="2026-05-01T00:39:20.299652" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.203409" elapsed="0.096290"/>
</kw>
<msg time="2026-05-01T00:39:20.299845" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-05-01T00:39:20.202964" elapsed="0.096908"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.302026" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-05-01T00:39:20.340846" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:20.340999" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-05-01T00:39:20.341065" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-05-01T00:39:20.341124" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.301850" elapsed="0.039306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.342701" level="INFO">Length is 253.</msg>
<msg time="2026-05-01T00:39:20.342876" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:39:20.342059" elapsed="0.000953">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-05-01T00:39:20.343245" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:39:20.343341" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:20.341374" elapsed="0.002023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.344713" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.343762" elapsed="0.001009"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.347055" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.346416" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.348037" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.347503" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.348992" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.348433" elapsed="0.000654"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:39:20.345688" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:20.344942" elapsed="0.004420"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.344901" elapsed="0.004517"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.349803" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.349578" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.349539" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.350264" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.350069" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.350036" elapsed="0.000371"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.351546" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:39:20.350752" elapsed="0.000905">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-05-01T00:39:20.301310" elapsed="0.050472">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:39:20.351839" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:39:20.300812" elapsed="0.051073"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-05-01T00:39:20.300382" elapsed="0.051607">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:39:20.352097" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:39:20.352140" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:39:20.300014" elapsed="0.052151"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.352585" level="INFO">Length is 288.</msg>
<msg time="2026-05-01T00:39:20.352658" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:39:20.352309" elapsed="0.000372"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.353212" level="INFO">${namepart} = 1.0.1</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.352824" elapsed="0.000414"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.353732" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:20.353379" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.354128" level="INFO">pcep-pcc-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.353893" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.354638" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:20.354302" elapsed="0.000363"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.354965" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:20.423283" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-05-01T00:39:20.423581" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:39:20.423689" level="INFO">${result} = 8</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.354804" elapsed="0.068936"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.424658" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.424070" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.425160" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.424905" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.424864" elapsed="0.000449"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:39:20.426673" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:39:20.425705" elapsed="0.001030"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.427603" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:20.581541" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:20.581799" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:39:20.581903" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.427065" elapsed="0.154890"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.582657" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:20.582142" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.582097" elapsed="0.000745"/>
</if>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:39:20.582917" elapsed="0.000063"/>
</return>
<msg time="2026-05-01T00:39:20.583260" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
bgpcep is a name part of an artifact present in system/ of ODl installation with the same version as pcep-pcc-mock should have.
Must have https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/integration/karaf/0.23.2/karaf-0.23.2.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-05-01T00:39:19.770294" elapsed="0.813022"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:39:20.583492" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:39:20.583826" level="INFO">${name} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${name}</var>
<arg>bgpcep</arg>
<arg>pcep-pcc-mock</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-05-01T00:39:19.763166" elapsed="0.820716"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.591537" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:39:20.584219" elapsed="0.007367"/>
</kw>
<kw name="Setup_Pcep_Operations" owner="PcepOperations">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:20.592309" level="INFO">Creating Session using : alias=pcep_session, url=http://10.30.170.185:8181, headers={'Content-Type': 'application/xml'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1ba75f50&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>pcep_session</arg>
<arg>url=http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:39:20.591969" elapsed="0.000521"/>
</kw>
<doc>Creates Requests session to be used by subsequent keywords.</doc>
<status status="PASS" start="2026-05-01T00:39:20.591774" elapsed="0.000784"/>
</kw>
<doc>Create SSH session to Mininet machine, prepare HTTP client session to Controller.
Figure out latest pcc-mock version and download it from Nexus to Mininet.</doc>
<status status="PASS" start="2026-05-01T00:39:19.074056" elapsed="1.518550"/>
</kw>
<test id="s1-s2-t1" name="Topology_Precondition" line="33">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.597825" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:20.595826" elapsed="0.002026"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:20.612164" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:20.612681" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:39:20 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:39:20.613116" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:20.597995" elapsed="0.015184"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:20.619812" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:20.619084" elapsed="0.000864"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:20.620967" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:20.620267" elapsed="0.000763"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:39:20.621338" elapsed="0.000806"/>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:39:20.613697" elapsed="0.008585"/>
</kw>
<arg>${off_json}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="PASS" start="2026-05-01T00:39:20.593863" elapsed="0.028616"/>
</kw>
<arg>300s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${off_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:39:20.593378" elapsed="0.029212"/>
</kw>
<doc>Compare current pcep-topology to off_json variable.
Timeout is long enough to ODL boot, to see that pcep is ready, with no PCC is connected.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:39:20.592679" elapsed="0.030032"/>
</test>
<test id="s1-s2-t2" name="Start_Pcc_Mock" line="39">
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.624535" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.625030" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.625500" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.626996" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:39:20.673615" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:39:20.673854" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jul 16  2025 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-05-01T00:39:20.673954" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.626824" elapsed="0.047181"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-05-01T00:39:20.674752" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-05-01T00:39:20.674186" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:20.674140" elapsed="0.000823"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.675042" elapsed="0.000033"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-05-01T00:39:20.626438" elapsed="0.048857"/>
</kw>
<msg time="2026-05-01T00:39:20.675391" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:20.625959" elapsed="0.049566"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.675865" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.676157" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.676076" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:20.676038" elapsed="0.000261"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.676611" elapsed="0.000051"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.676959" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.677235" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.677158" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:20.677122" elapsed="0.000253"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.677674" elapsed="0.000048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.678029" elapsed="0.000045"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.678400" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:39:20.678710" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:20.678630" elapsed="0.000172"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:20.678593" elapsed="0.000257"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:20.679114" elapsed="0.000045"/>
</kw>
<msg time="2026-05-01T00:39:20.679508" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-05-01T00:39:20.624173" elapsed="0.055395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.680651" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:20.679870" elapsed="0.000845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.681594" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.681015" elapsed="0.000682"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-05-01T00:39:20.681793" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:39:20.682133" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<var>${command}</var>
<arg>-jar ${filename} --reconnect 1 --local-address ${TOOLS_SYSTEM_IP} --remote-address ${ODL_SYSTEM_IP} 2&gt;&amp;1 | tee pccmock.log</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-05-01T00:39:20.623555" elapsed="0.058637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:20.683114" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:20.682574" elapsed="0.000643"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:39:20.712071" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:39:20.683558" elapsed="0.028572"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-05-01T00:39:21.329113" level="INFO">[?2004l00:39:21.215 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189]
00:39:21.326 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP session with [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189] started, sent proposal Open</msg>
<arg>started, sent proposal Open</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-05-01T00:39:20.712282" elapsed="0.616903"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.329892" level="INFO">Slept 1 second.</msg>
<arg>1s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-05-01T00:39:21.329346" elapsed="1.000708"/>
</kw>
<doc>Execute pcc-mock on Mininet, fail is Open is not sent, keep it running for next tests.</doc>
<status status="PASS" start="2026-05-01T00:39:20.622974" elapsed="1.707387"/>
</test>
<test id="s1-s2-t3" name="Configure_Speaker_Entity_Identifier" line="49">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.334424" level="INFO">&amp;{mapping} = { IP=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:22.333289" elapsed="0.001230"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.358619" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:22.358228" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:22.359377" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.359106" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:22.359565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:22.358791" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.360118" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:22.359736" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:22.360434" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:22.360655" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:22.360293" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.361070" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.360822" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.362431" level="INFO">mapping: {'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.362171" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.362906" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:39:22.362636" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.363618" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:39:22.363304" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:39:22.364333" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:39:22.364113" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:39:22.364412" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:39:22.364591" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:39:22.363816" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:22.364749" elapsed="0.000258"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:39:22.363184" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:39:22.362993" elapsed="0.002093"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:39:22.365131" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:39:22.365287" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:39:22.361717" elapsed="0.003596"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:22.361194" elapsed="0.004151"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.365515" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.365370" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:22.361171" elapsed="0.004444"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.366301" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:22.365743" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:22.366378" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:22.357642" elapsed="0.008882"/>
</kw>
<msg time="2026-05-01T00:39:22.366579" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:22.356823" elapsed="0.009809"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.367121" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.367625" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.368149" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.368318" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.368488" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.368852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.368726" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:22.368711" elapsed="0.000220"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.369053" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.369207" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.369354" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:22.368680" elapsed="0.000727"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.368570" elapsed="0.000865"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.369591" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.369674" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:39:22.369793" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:22.352994" elapsed="0.016825"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.382791" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:22.382403" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:22.383490" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.383270" elapsed="0.000284">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:22.383648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:22.382960" elapsed="0.000718"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.384407" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:22.383822" elapsed="0.000613"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:39:22.384739" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:39:22.384869" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-id-value xm...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:39:22.384596" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.385283" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-id-value xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep:sync:optimizations:config"&gt;
            AQIDBA==
        &lt;/speaker-entity-id-value&gt;
    &lt;/session-config&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.385037" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:39:22.385748" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.385438" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.386260" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:22.385964" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:22.385834" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:22.385419" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.387039" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.185&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-i...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:39:22.386490" elapsed="0.000579"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:39:22.387121" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:39:22.381819" elapsed="0.005429"/>
</kw>
<msg time="2026-05-01T00:39:22.387304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:39:22.381034" elapsed="0.006317"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.387850" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.388345" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.388861" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.389031" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.389185" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.389598" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.389423" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:22.389408" elapsed="0.000284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.389816" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.389967" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.390116" elapsed="0.000056"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:39:22.389377" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.389260" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.390376" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.390473" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:39:22.390602" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.185&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-i...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:39:22.378637" elapsed="0.011993"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:39:22.391819" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.391575" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/pcepuser/vanadium/node_speaker_entity_identifier/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:39:22.391981" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:39:22.391243" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.392305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.392075" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.392843" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:22.392553" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:39:22.392386" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:39:22.392057" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.395027" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:22.393056" elapsed="0.001998"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:39:22.395105" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:39:22.395258" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/pcepuser/../../../variables/pcepuser/vanadium/node_speaker_entity_identifier/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:39:22.390941" elapsed="0.004342"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.396636" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.396374" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.397147" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.185&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-id-value xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep:sync:optimizations:config"&gt;
            AQIDBA==
        &lt;/speaker-entity-id-value&gt;
    &lt;/session-config&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.396813" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.397621" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.397328" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.398031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.397796" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:39:22.399022" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:39:22.398815" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:39:22.399359" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:39:22.399183" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:39:22.399531" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.400119" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:22.399870" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:39:22.400238" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:39:22.400399" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:39:22.398253" elapsed="0.002172"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:22.430527" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Content-Length': '378', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.185&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;speaker-entity-id-value xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep:sync:optimizations:config"&gt;
            AQIDBA==
        &lt;/speaker-entity-id-value&gt;
    &lt;/session-config&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-05-01T00:39:22.433975" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185 
 status=400, reason=Bad Request 
 headers={'Content-Type': 'application/xml', 'Content-Length': '581'} 
 body=&lt;?xml version='1.0' encoding='UTF-8'?&gt;&lt;errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"&gt;&lt;error&gt;&lt;error-type&gt;protocol&lt;/error-type&gt;&lt;error-message&gt;Error parsing input: ParseError at [row,col]:[-1,-1]
Message: Schema for node with name speaker-entity-id-value and namespace urn:opendaylight:params:xml:ns:yang:topology:pcep:sync:optimizations:config does not exist in parent RegularContainerEffectiveStatement{argument=(urn:opendaylight:params:xml:ns:yang:topology:pcep?revision=2025-03-28)session-config}&lt;/error-message&gt;&lt;error-tag&gt;malformed-message&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-05-01T00:39:22.434151" level="FAIL">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.402362" elapsed="0.032959">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</kw>
<status status="FAIL" start="2026-05-01T00:39:22.400513" elapsed="0.034929">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.435708" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.435513" elapsed="0.000290"/>
</branch>
<status status="FAIL" start="2026-05-01T00:39:22.400494" elapsed="0.035343">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.436349" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.436560" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:39:22.436507" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:22.436481" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.436829" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.436932" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.395608" elapsed="0.041473">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.437190" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.343359" elapsed="0.093980">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:39:22.437781" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:39:22.437546" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:39:22.437489" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:22.437963" elapsed="0.000021"/>
</return>
<arg>${PCEP_VARIABLES_FOLDER}${/}node_speaker_entity_identifier</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.335173" elapsed="0.102926">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</kw>
<doc>Additional PCEP Speaker configuration for at least oxygen streams.
Allows PCEP speaker to determine if state synchronization can be skipped when a PCEP session is restarted.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.331383" elapsed="0.106977">HTTPError: 400 Client Error: Bad Request for url: http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.185</status>
</test>
<test id="s1-s2-t4" name="Topology_Default" line="58">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.443849" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:22.440924" elapsed="0.002964"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:22.457385" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:22.458940" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:22.459179" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:22.444091" elapsed="0.015148"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:22.466752" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:22.465321" elapsed="0.001461"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:22.467524" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:22.466919" elapsed="0.000633"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:22.468025" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:22.468439" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.467689" elapsed="0.000842">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.459726" elapsed="0.008968">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.440358" elapsed="0.028482">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:23.475169" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:23.470448" elapsed="0.004787"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:23.487525" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:23.487667" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:23.487773" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:23.475600" elapsed="0.012199"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:23.492711" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:23.491269" elapsed="0.001507"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:23.494493" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:23.493108" elapsed="0.001451"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:23.495617" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:23.496439" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:23.494865" elapsed="0.001771">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:23.488038" elapsed="0.008954">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:23.469564" elapsed="0.027805">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:24.504578" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:24.499320" elapsed="0.005331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:24.517928" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:24.518383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:24.518780" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:24.504995" elapsed="0.013843"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:24.525014" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:24.523757" elapsed="0.001305"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:24.525872" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:24.525236" elapsed="0.000666"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:24.526530" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:24.526977" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:24.526054" elapsed="0.001134">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:24.519496" elapsed="0.007887">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:24.498238" elapsed="0.029322">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:25.534657" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:25.530030" elapsed="0.004681"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:25.548419" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:25.549032" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:25.549426" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:25.534974" elapsed="0.014556"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:25.556648" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:25.555390" elapsed="0.001314"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:25.557871" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:25.556944" elapsed="0.000971"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:25.558777" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:25.559575" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:25.558132" elapsed="0.001586">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:25.550242" elapsed="0.009835">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:25.528558" elapsed="0.031765">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:26.568175" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:26.563118" elapsed="0.005133"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:26.577790" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:26.577979" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:26.578111" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:26.568633" elapsed="0.009504"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:26.581416" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:26.580747" elapsed="0.000698"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:26.582194" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:26.581599" elapsed="0.000623"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:26.582723" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:26.583127" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:26.582359" elapsed="0.000862">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:26.578411" elapsed="0.004987">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:26.561200" elapsed="0.022388">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:27.590636" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:27.585616" elapsed="0.005095"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:27.600436" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:27.600733" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:27.600892" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:27.591145" elapsed="0.009782"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:27.605444" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:27.604502" elapsed="0.001002"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:27.606550" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:27.605698" elapsed="0.000892"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:27.607271" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:27.607837" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:27.606782" elapsed="0.001248">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:27.601220" elapsed="0.007054">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:27.584357" elapsed="0.024141">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:28.615916" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:28.611351" elapsed="0.004617"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:28.626295" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:28.626592" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:28.626774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:28.616214" elapsed="0.010596"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:28.631305" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:28.630347" elapsed="0.000998"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:28.632394" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:28.631558" elapsed="0.000876"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:28.633114" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:28.633736" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:28.632648" elapsed="0.001213">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:28.627109" elapsed="0.007000">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:28.609354" elapsed="0.024959">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:29.640972" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:29.636548" elapsed="0.004476"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:29.651738" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:29.651981" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:29.652136" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:29.641260" elapsed="0.010911"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:29.656817" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:29.655817" elapsed="0.001041"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:29.657904" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:29.657057" elapsed="0.000886"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:29.658639" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:29.659187" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:29.658149" elapsed="0.001162">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:29.652557" elapsed="0.007018">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:29.635141" elapsed="0.024640">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:30.668727" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:30.665400" elapsed="0.003375"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:30.678308" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:30.678567" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:30.678734" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:30.669000" elapsed="0.009770"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:30.683206" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:30.682295" elapsed="0.000951"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:30.684294" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:30.683439" elapsed="0.000895"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:30.685007" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:30.685550" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:30.684550" elapsed="0.001228">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:30.679063" elapsed="0.006954">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:30.664242" elapsed="0.021977">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:31.692885" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:31.688054" elapsed="0.004899"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:31.704001" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:31.704256" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:31.704432" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:31.693404" elapsed="0.011100"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:31.709558" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:31.708545" elapsed="0.001056"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:31.710717" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:31.709808" elapsed="0.000950"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:31.711510" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:31.712152" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:31.710967" elapsed="0.001306">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:31.704875" elapsed="0.007667">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:31.686984" elapsed="0.025780">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.745128" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:32.742918" elapsed="0.002243"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:32.754575" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:32.754787" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:32.754950" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:32.745320" elapsed="0.009668"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:32.759575" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:32.758664" elapsed="0.000952"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:32.760701" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:32.759812" elapsed="0.000935"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.761396" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:32.761926" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -44,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.760943" elapsed="0.001094">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.755358" elapsed="0.006913">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.713438" elapsed="0.049058">Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:39:32.762739" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:39:22.439684" elapsed="10.323241">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes a tunnel from pcc-mock.
Timeout is lower than in Precondition, as state from pcc-mock should be updated quickly.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:22.438783" elapsed="10.324418">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -18,18 +18,19 @@
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t5" name="Update_Delegated" line="64">
<kw name="Update_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Operate_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.765953" level="INFO">${uri_path} = /rests/operations/network-topology-pcep:update-lsp</msg>
<var>${uri_path}</var>
<arg>/rests/operations/${uri_part}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:32.765338" elapsed="0.000653"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:32.786590" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:update-lsp 
 path_url=/rests/operations/network-topology-pcep:update-lsp 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '752', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;pcc_10.30.170.157_tunnel_1&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;2.2.2.2/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
 
 </msg>
<msg time="2026-05-01T00:39:32.787437" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:update-lsp 
 status=400, reason=Bad Request 
 headers={'Set-Cookie': 'JSESSIONID=node01qgdre48pmmq91sz6sdv8qsjfc2.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:39:32 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Type': 'application/yang-data+json', 'Content-Length': '462'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "malformed-message",
        "error-message": "Invalid XML: ParseError at [row,col]:[6,3]\nMessage: Schema for node with name lsp and namespace urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful does not exist in parent EmptyContainerEffectiveStatement{argument=(urn:opendaylight:params:xml:ns:yang:topology:pcep?revision=2025-03-28)arguments}",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:39:32.787712" level="INFO">${response} = &lt;Response [400]&gt;</msg>
<var>${response}</var>
<arg>pcep_session</arg>
<arg>url=${uri_path}</arg>
<arg>data=${xml_data}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:32.766190" elapsed="0.021581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.788764" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;pcc_10.30.170.157_tunnel_1&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;2.2.2.2/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
</msg>
<arg>${xml_data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:32.788140" elapsed="0.000815"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.794301" level="FAIL">'[200, 201, 204]' does not contain '400'</msg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.789289" elapsed="0.005150">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:32.794607" elapsed="0.000046"/>
</return>
<var>${response}</var>
<arg>network-topology-pcep:update-lsp</arg>
<arg>${xml_data}</arg>
<doc>Post XML data to given pcep-operations URI, check status_code is 200 and return response text (JSON).</doc>
<status status="FAIL" start="2026-05-01T00:39:32.764896" elapsed="0.029954">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-01T00:39:32.794975" elapsed="0.000034"/>
</return>
<var>${text}</var>
<arg>${update_delegated_xml}</arg>
<doc>Update LSP according to XML data and return response (json) text.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.764366" elapsed="0.030815">'[200, 201, 204]' does not contain '400'</status>
</kw>
<doc>Perform update-lsp on the mocked tunnel, check response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:32.763582" elapsed="0.031929">'[200, 201, 204]' does not contain '400'</status>
</test>
<test id="s1-s2-t6" name="Topology_Updated" line="69">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.800144" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:32.798071" elapsed="0.002101"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:32.809406" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:32.809621" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:32.809765" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:32.800319" elapsed="0.009482"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:32.814295" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:32.813349" elapsed="0.000987"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:32.815382" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:32.814550" elapsed="0.000872"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:32.816079" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:32.816730" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.815635" elapsed="0.001204">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.810095" elapsed="0.006968">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.797689" elapsed="0.019578">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:33.823286" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:33.819140" elapsed="0.004192"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:33.834213" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:33.834433" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:33.834628" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:33.823576" elapsed="0.011089"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:33.839308" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:33.838332" elapsed="0.001017"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:33.840423" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:33.839569" elapsed="0.000914"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:33.841136" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:33.841723" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:33.840682" elapsed="0.001157">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:33.835028" elapsed="0.007042">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:33.818029" elapsed="0.024246">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:34.848840" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:34.844272" elapsed="0.004613"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:34.858650" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:34.858872" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:34.859024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:34.849108" elapsed="0.009953"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:34.863708" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:34.862723" elapsed="0.001026"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:34.864878" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:34.863971" elapsed="0.000947"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:34.865591" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:34.866239" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:34.865114" elapsed="0.001265">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:34.859359" elapsed="0.007282">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:34.843019" elapsed="0.023831">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:35.874257" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:35.870290" elapsed="0.004019"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:35.884922" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:35.885223" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:35.885497" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:35.874676" elapsed="0.010858"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:35.889885" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:35.888913" elapsed="0.001012"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:35.891047" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:35.890120" elapsed="0.000970"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:35.891916" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:35.892526" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:35.891341" elapsed="0.001314">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:35.886013" elapsed="0.006942">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:35.867866" elapsed="0.025331">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:36.900603" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:36.895271" elapsed="0.005407"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:36.910857" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:36.911026" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:36.911136" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:36.901044" elapsed="0.010118"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:36.919030" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:36.917351" elapsed="0.001748"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:36.921504" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:36.919434" elapsed="0.002143"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:36.922776" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:36.923505" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:36.921918" elapsed="0.001678">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:36.911603" elapsed="0.012162">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:36.894021" elapsed="0.029890">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:37.930580" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:37.925684" elapsed="0.004968"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:37.941369" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:37.941574" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:37.941715" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:37.931004" elapsed="0.010739"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:37.945112" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:37.944407" elapsed="0.000735"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:37.945903" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:37.945283" elapsed="0.000650"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:37.946447" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:37.946879" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:37.946073" elapsed="0.000891">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:37.942038" elapsed="0.005094">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:37.924617" elapsed="0.022682">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:38.954225" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:38.949051" elapsed="0.005242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:38.964850" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:38.965009" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:38.965127" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:38.954664" elapsed="0.010490"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:38.968404" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:38.967730" elapsed="0.000703"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:38.969186" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:38.968588" elapsed="0.000627"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:38.969717" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:38.970170" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:38.969353" elapsed="0.000901">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:38.965372" elapsed="0.005047">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:38.948022" elapsed="0.022568">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:39.977391" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:39.972318" elapsed="0.005170"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:39.986782" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:39.986998" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:39.987144" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:39.977835" elapsed="0.009345"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:39.991794" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:39.990840" elapsed="0.000995"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:39.992890" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:39.992028" elapsed="0.000903"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:39.993633" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:39.994192" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:39.993125" elapsed="0.001181">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:39.987562" elapsed="0.007002">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:39.971253" elapsed="0.023518">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:41.001994" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:40.997208" elapsed="0.004831"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:41.010702" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:41.010915" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:41.011076" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:41.002252" elapsed="0.008861"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:41.015852" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:41.014863" elapsed="0.001030"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:41.016964" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:41.016088" elapsed="0.000916"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:41.017681" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:41.018304" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:41.017199" elapsed="0.001227">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:41.011415" elapsed="0.007262">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:40.995607" elapsed="0.023278">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:42.025850" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:42.021221" elapsed="0.004675"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:42.035553" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:42.035766" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:42.035914" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:42.026110" elapsed="0.009841"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:42.040572" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:42.039606" elapsed="0.001007"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:42.041972" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:42.040805" elapsed="0.001209"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:42.042693" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:42.043255" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:42.042209" elapsed="0.001160">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:42.036339" elapsed="0.007278">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:42.019597" elapsed="0.024228">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.049693" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:43.045638" elapsed="0.004100"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:43.058619" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:43.058833" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:43.058984" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:43.049951" elapsed="0.009070"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.063596" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.062643" elapsed="0.000994"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.064692" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.063840" elapsed="0.000892"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.065381" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:43.066019" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.064924" elapsed="0.001211">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.059318" elapsed="0.007047">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.044601" elapsed="0.021993">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:39:43.066795" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:39:32.797124" elapsed="10.269876">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes the updated tunnel.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:32.796038" elapsed="10.271231">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t7" name="Refuse_Remove_Delegated" line="74">
<kw name="Remove_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Operate_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.069642" level="INFO">${uri_path} = /rests/operations/network-topology-pcep:remove-lsp</msg>
<var>${uri_path}</var>
<arg>/rests/operations/${uri_part}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:43.069313" elapsed="0.000357"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:43.142824" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:remove-lsp 
 path_url=/rests/operations/network-topology-pcep:remove-lsp 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01qgdre48pmmq91sz6sdv8qsjfc2.node0', 'Content-Length': '324', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;pcc_10.30.170.157_tunnel_1&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
&lt;/input&gt;
 
 </msg>
<msg time="2026-05-01T00:39:43.143721" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:remove-lsp 
 status=200, reason=OK 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '141'} 
 body={"network-topology-pcep:output":{"failure":"failed","error":[{"error-object":{"ignore":false,"processing-rule":false,"value":9,"type":19}}]}} 
 </msg>
<msg time="2026-05-01T00:39:43.143971" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>pcep_session</arg>
<arg>url=${uri_path}</arg>
<arg>data=${xml_data}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:43.069810" elapsed="0.074219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.145041" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;pcc_10.30.170.157_tunnel_1&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
&lt;/input&gt;
</msg>
<arg>${xml_data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:43.144403" elapsed="0.000749"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:39:43.145504" elapsed="0.004854"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:39:43.150505" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T00:39:43.153705" level="INFO">${response} = {"network-topology-pcep:output":{"failure":"failed","error":[{"error-object":{"ignore":false,"processing-rule":false,"value":9,"type":19}}]}}</msg>
<var>${response}</var>
<arg>network-topology-pcep:remove-lsp</arg>
<arg>${xml_data}</arg>
<doc>Post XML data to given pcep-operations URI, check status_code is 200 and return response text (JSON).</doc>
<status status="PASS" start="2026-05-01T00:39:43.068996" elapsed="0.084738"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-01T00:39:43.153784" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:39:43.153935" level="INFO">${text} = {"network-topology-pcep:output":{"failure":"failed","error":[{"error-object":{"ignore":false,"processing-rule":false,"value":9,"type":19}}]}}</msg>
<var>${text}</var>
<arg>${remove_delegated_xml}</arg>
<doc>Remove LSP according to XML data and return response (json) text.</doc>
<status status="PASS" start="2026-05-01T00:39:43.068632" elapsed="0.085328"/>
</kw>
<kw name="Pcep_Json_Is_Refused" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.154746" level="INFO">${expected_raw} = {"network-topology-pcep:output":{"error":[{"error-object":{"ignore":false,"processing-rule":false,"type":19,"value":9}}],"failure":"failed"}}</msg>
<var>${expected_raw}</var>
<arg>{"network-topology-pcep:output":{"error":[{"error-object":{"ignore":false,"processing-rule":false,"type":19,"value":9}}],"failure":"failed"}}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:43.154477" elapsed="0.000297"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.155216" level="INFO">${expected_normalized} = {
 "network-topology-pcep:output": {
  "error": [
   {
    "error-object": {
     "ignore": false,
     "processing-rule": false,
     "type": 19,
     "value": 9
    }
   }
  ],
  "failure": "failed"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.154909" elapsed="0.000336"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.155709" level="INFO">${actual_normalized} = {
 "network-topology-pcep:output": {
  "error": [
   {
    "error-object": {
     "ignore": false,
     "processing-rule": false,
     "type": 19,
     "value": 9
    }
   }
  ],
  "failure": "failed"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.155379" elapsed="0.000359"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${actual_normalized}</arg>
<arg>${expected_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:39:43.155875" elapsed="0.000319"/>
</kw>
<arg>${text}</arg>
<doc>Given text should be equal to json response when device refuses tunnel removal.</doc>
<status status="PASS" start="2026-05-01T00:39:43.154147" elapsed="0.002108"/>
</kw>
<doc>Perform remove-lsp on the mocked tunnel, check that mock-pcc has refused to remove it.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:39:43.067907" elapsed="0.088454"/>
</test>
<test id="s1-s2-t8" name="Topology_Still_Updated" line="80">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.160150" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:43.158089" elapsed="0.002089"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:43.167270" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:43.167470" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:43.167576" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:43.160323" elapsed="0.007278"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.170825" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.170149" elapsed="0.000705"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:43.171769" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:43.170989" elapsed="0.000809"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:43.172251" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:43.172832" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.171936" elapsed="0.001009">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.167847" elapsed="0.005360">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.157716" elapsed="0.015696">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:44.179946" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:44.175157" elapsed="0.004835"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:44.188832" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:44.189042" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:44.189189" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:44.180208" elapsed="0.009017"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:44.193805" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:44.192855" elapsed="0.000991"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:44.194889" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:44.194038" elapsed="0.000890"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:44.195862" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:44.196537" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:44.195119" elapsed="0.001533">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:44.189579" elapsed="0.007302">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:44.174098" elapsed="0.022990">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:45.204256" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:45.199083" elapsed="0.005242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:45.214628" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:45.214814" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:45.214934" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:45.204698" elapsed="0.010262"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:45.218234" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:45.217567" elapsed="0.000696"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:45.219039" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:45.218401" elapsed="0.000667"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:45.219548" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:45.220100" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:45.219205" elapsed="0.001008">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:45.215235" elapsed="0.005203">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:45.198006" elapsed="0.022690">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:46.224324" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:46.222111" elapsed="0.002246"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:46.233141" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:46.233419" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:46.233641" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:46.224530" elapsed="0.009138"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:46.236909" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:46.236220" elapsed="0.000718"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:46.237691" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:46.237078" elapsed="0.000642"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:46.238186" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:46.238678" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:46.237858" elapsed="0.000906">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:46.233883" elapsed="0.005045">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:46.221571" elapsed="0.017505">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:47.246334" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:47.241580" elapsed="0.004823"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:47.256961" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:47.257124" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:47.257245" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:47.246779" elapsed="0.010493"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:47.263117" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:47.261571" elapsed="0.001612"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:47.264879" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:47.263525" elapsed="0.001419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:47.266060" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:47.266968" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:47.265255" elapsed="0.001890">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:47.257584" elapsed="0.009953">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:47.239953" elapsed="0.027918">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:48.274707" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:48.269874" elapsed="0.004887"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:48.283021" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:48.283265" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:48.283429" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:48.275022" elapsed="0.008475"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:48.288496" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:48.287430" elapsed="0.001110"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:48.291907" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:48.288749" elapsed="0.003200"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:48.292669" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:48.293357" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:48.292148" elapsed="0.001357">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:48.283838" elapsed="0.009879">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:48.268727" elapsed="0.025137">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:49.298266" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:49.295209" elapsed="0.003104"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:49.307843" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:49.308030" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:49.308146" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:49.298554" elapsed="0.009619"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:49.313529" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:49.312136" elapsed="0.001450"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:49.315046" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:49.313860" elapsed="0.001240"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:49.316044" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:49.316860" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:49.315358" elapsed="0.001678">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:49.308480" elapsed="0.008862">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:49.294398" elapsed="0.023239">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:50.325385" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:50.319487" elapsed="0.005994"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:50.336055" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:50.336435" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:50.336738" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:50.325832" elapsed="0.010965"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:50.344128" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:50.342630" elapsed="0.001561"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:50.345880" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:50.344536" elapsed="0.001406"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:50.347030" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:50.348040" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:50.346247" elapsed="0.001976">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:50.337292" elapsed="0.011397">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:50.318379" elapsed="0.030556">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:51.355574" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:51.350694" elapsed="0.004949"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:51.367438" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:51.367748" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:51.367970" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:51.355998" elapsed="0.012014"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:51.373349" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:51.372309" elapsed="0.001084"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:51.374525" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:51.373618" elapsed="0.000950"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:51.375297" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:51.375994" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:51.374772" elapsed="0.001351">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:51.368520" elapsed="0.007851">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:51.349651" elapsed="0.026962">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:52.383802" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:52.378385" elapsed="0.005486"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:52.394476" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:52.394651" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:52.394774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:52.384212" elapsed="0.010589"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:52.398135" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:52.397431" elapsed="0.000733"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:52.398912" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:52.398301" elapsed="0.000640"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:52.399479" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:52.399997" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:52.399081" elapsed="0.001038">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:52.395032" elapsed="0.005332">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:52.377353" elapsed="0.023253">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.407272" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:53.402382" elapsed="0.004959"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:53.417901" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:53.418083" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:53.418199" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:53.407722" elapsed="0.010503"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:53.421717" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:53.420989" elapsed="0.000758"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:53.422503" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:53.421884" elapsed="0.000649"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.423111" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:53.423561" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.422672" elapsed="0.000984">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.418551" elapsed="0.005290">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.401313" elapsed="0.022747">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:39:53.424316" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:39:43.157228" elapsed="10.267294">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes the updated tunnel, to verify that refusal did not break topology.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:43.156650" elapsed="10.268206">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t9" name="Add_Instantiated" line="85">
<kw name="Add_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Operate_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.428005" level="INFO">${uri_path} = /rests/operations/network-topology-pcep:add-lsp</msg>
<var>${uri_path}</var>
<arg>/rests/operations/${uri_part}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:39:53.427551" elapsed="0.000495"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:53.437433" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:add-lsp 
 path_url=/rests/operations/network-topology-pcep:add-lsp 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01qgdre48pmmq91sz6sdv8qsjfc2.node0', 'Content-Length': '812', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;endpoints-obj&gt;
   &lt;ipv4&gt;
    &lt;source-ipv4-address&gt;10.30.170.157&lt;/source-ipv4-address&gt;
    &lt;destination-ipv4-address&gt;1.1.1.1&lt;/destination-ipv4-address&gt;
   &lt;/ipv4&gt;
  &lt;/endpoints-obj&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
 
 </msg>
<msg time="2026-05-01T00:39:53.437679" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:add-lsp 
 status=400, reason=Bad Request 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '462'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "malformed-message",
        "error-message": "Invalid XML: ParseError at [row,col]:[6,3]\nMessage: Schema for node with name lsp and namespace urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful does not exist in parent EmptyContainerEffectiveStatement{argument=(urn:opendaylight:params:xml:ns:yang:topology:pcep?revision=2025-03-28)arguments}",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:39:53.437846" level="INFO">${response} = &lt;Response [400]&gt;</msg>
<var>${response}</var>
<arg>pcep_session</arg>
<arg>url=${uri_path}</arg>
<arg>data=${xml_data}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:53.428250" elapsed="0.009634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.438575" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;endpoints-obj&gt;
   &lt;ipv4&gt;
    &lt;source-ipv4-address&gt;10.30.170.157&lt;/source-ipv4-address&gt;
    &lt;destination-ipv4-address&gt;1.1.1.1&lt;/destination-ipv4-address&gt;
   &lt;/ipv4&gt;
  &lt;/endpoints-obj&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
</msg>
<arg>${xml_data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:39:53.438153" elapsed="0.000566"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.442400" level="FAIL">'[200, 201, 204]' does not contain '400'</msg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.438958" elapsed="0.003566">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:39:53.442617" elapsed="0.000065"/>
</return>
<var>${response}</var>
<arg>network-topology-pcep:add-lsp</arg>
<arg>${xml_data}</arg>
<doc>Post XML data to given pcep-operations URI, check status_code is 200 and return response text (JSON).</doc>
<status status="FAIL" start="2026-05-01T00:39:53.427058" elapsed="0.015801">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-01T00:39:53.442957" elapsed="0.000025"/>
</return>
<var>${text}</var>
<arg>${add_instantiated_xml}</arg>
<doc>Instantiate LSP according to XML data and return response (json) text.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.426162" elapsed="0.016937">'[200, 201, 204]' does not contain '400'</status>
</kw>
<doc>Perform add-lsp to create new tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:53.425356" elapsed="0.017964">'[200, 201, 204]' does not contain '400'</status>
</test>
<test id="s1-s2-t10" name="Topology_Second_Default" line="90">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.449248" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:53.445964" elapsed="0.003327"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:53.458077" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:53.458303" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:53.458491" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:53.449530" elapsed="0.009002"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:53.463914" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:53.462397" elapsed="0.001561"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:53.465073" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:53.464165" elapsed="0.000950"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:53.465848" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:53.466811" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.465318" elapsed="0.001667">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.458878" elapsed="0.008358">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.445362" elapsed="0.022114">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:54.473501" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:54.469299" elapsed="0.004253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:54.482732" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:54.482969" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:54.483239" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:54.473792" elapsed="0.009487"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:54.488805" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:54.487302" elapsed="0.001547"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:54.489970" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:54.489057" elapsed="0.000956"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:54.490822" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:54.491471" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:54.490219" elapsed="0.001404">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:54.483657" elapsed="0.008144">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:54.468206" elapsed="0.023745">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:55.499070" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:55.493817" elapsed="0.005324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:55.510006" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:55.510236" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:55.510379" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:55.499526" elapsed="0.010882"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:55.514449" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:55.513288" elapsed="0.001208"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:55.515473" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:55.514645" elapsed="0.000874"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:55.516271" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:55.517254" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:55.515730" elapsed="0.001666">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:55.510732" elapsed="0.006946">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:55.492704" elapsed="0.025239">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:56.525367" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:56.519751" elapsed="0.005797"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:56.534607" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:56.534791" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:56.535003" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:56.525965" elapsed="0.009068"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:56.539415" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:56.537902" elapsed="0.001577"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:56.540633" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:56.539697" elapsed="0.000979"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:56.541503" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:56.542375" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:56.540887" elapsed="0.001723">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:56.535324" elapsed="0.007550">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:56.518688" elapsed="0.024412">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:57.549756" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:57.544835" elapsed="0.004990"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:57.558957" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:57.559141" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:57.559271" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:57.550174" elapsed="0.009125"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:57.563160" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:57.562140" elapsed="0.001051"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:57.563952" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:57.563333" elapsed="0.000648"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:57.564519" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:57.565219" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:57.564121" elapsed="0.001197">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:57.559609" elapsed="0.005900">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:57.543763" elapsed="0.021899">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:58.573281" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:58.567483" elapsed="0.005869"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:58.583438" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:58.583737" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:58.584023" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:58.573737" elapsed="0.010323"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:58.592245" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:58.591158" elapsed="0.001120"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:58.593090" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:58.592472" elapsed="0.000648"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:58.593682" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:58.594311" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:58.593263" elapsed="0.001253">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:58.584492" elapsed="0.010202">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:58.566372" elapsed="0.028473">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:39:59.601426" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:39:59.596684" elapsed="0.004810"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:39:59.611183" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:39:59.611486" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:39:59.611682" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:39:59.601740" elapsed="0.009983"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:59.617305" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:59.615776" elapsed="0.001575"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:39:59.618486" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:39:59.617580" elapsed="0.000949"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:39:59.619279" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:39:59.620298" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:39:59.618731" elapsed="0.001708">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:39:59.612122" elapsed="0.008587">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:39:59.595581" elapsed="0.025350">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:00.628179" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:00.622716" elapsed="0.005550"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:00.637336" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:00.637528" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:00.637711" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:00.628688" elapsed="0.009051"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:00.641403" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:00.640390" elapsed="0.001043"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:00.642197" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:00.641589" elapsed="0.000637"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:00.642743" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:00.643330" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:00.642366" elapsed="0.001141">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:00.637978" elapsed="0.005705">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:00.621655" elapsed="0.022179">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:01.650510" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:01.645644" elapsed="0.004936"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:01.660906" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:01.661077" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:01.661190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:01.650922" elapsed="0.010295"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:01.665944" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:01.663930" elapsed="0.002078"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:01.667743" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:01.666313" elapsed="0.001493"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:01.668890" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:01.670294" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:01.668112" elapsed="0.002410">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:01.661448" elapsed="0.009439">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:01.644585" elapsed="0.026647">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:02.678398" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:02.673614" elapsed="0.004901"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:02.688538" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:02.688715" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:02.688911" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:02.678863" elapsed="0.010075"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:02.693075" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:02.691712" elapsed="0.001403"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:02.694162" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:02.693308" elapsed="0.000893"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:02.694886" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:02.695715" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:02.694392" elapsed="0.001491">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:02.689166" elapsed="0.006958">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:02.671987" elapsed="0.024345">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.703132" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:03.698260" elapsed="0.004942"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:03.712911" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:03.713082" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:03.713190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:03.703610" elapsed="0.009605"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:03.717423" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:03.716427" elapsed="0.001038"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:03.718266" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:03.717606" elapsed="0.000709"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.719023" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:03.719922" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
-   {
-    "name": "pcc_10.30.170.157_tunnel_1",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -96,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.718555" elapsed="0.001503">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.713428" elapsed="0.006865">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.697071" elapsed="0.023445">Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:40:03.720718" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${updated_default_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:39:53.444625" elapsed="10.276264">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes the updated delegated and default instantiated tunnel.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:39:53.443747" elapsed="10.277460">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -3,7 +3,7 @@
   "ip-address": "10.30.170.157",
   "reported-lsp": [
    {
-    "name": "Instantiated tunnel",
+    "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
      {
       "ero": {
@@ -18,70 +18,19 @@
         }
        ]
       },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t11" name="Update_Instantiated" line="95">
<kw name="Update_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Operate_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.724350" level="INFO">${uri_path} = /rests/operations/network-topology-pcep:update-lsp</msg>
<var>${uri_path}</var>
<arg>/rests/operations/${uri_part}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:03.723903" elapsed="0.000487"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:03.732943" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:update-lsp 
 path_url=/rests/operations/network-topology-pcep:update-lsp 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01qgdre48pmmq91sz6sdv8qsjfc2.node0', 'Content-Length': '745', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;2.2.2.2/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
 
 </msg>
<msg time="2026-05-01T00:40:03.733081" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:update-lsp 
 status=400, reason=Bad Request 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '462'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "malformed-message",
        "error-message": "Invalid XML: ParseError at [row,col]:[6,3]\nMessage: Schema for node with name lsp and namespace urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful does not exist in parent EmptyContainerEffectiveStatement{argument=(urn:opendaylight:params:xml:ns:yang:topology:pcep?revision=2025-03-28)arguments}",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:03.733186" level="INFO">${response} = &lt;Response [400]&gt;</msg>
<var>${response}</var>
<arg>pcep_session</arg>
<arg>url=${uri_path}</arg>
<arg>data=${xml_data}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:03.724614" elapsed="0.008599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.733669" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
 &lt;arguments&gt;
  &lt;lsp xmlns="urn:opendaylight:params:xml:ns:yang:pcep:ietf:stateful"&gt;
   &lt;delegate&gt;true&lt;/delegate&gt;
   &lt;administrative&gt;true&lt;/administrative&gt;
  &lt;/lsp&gt;
  &lt;ero&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;2.2.2.2/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
   &lt;subobject&gt;
    &lt;loose&gt;false&lt;/loose&gt;
    &lt;ip-prefix&gt;&lt;ip-prefix&gt;1.1.1.1/32&lt;/ip-prefix&gt;&lt;/ip-prefix&gt;
   &lt;/subobject&gt;
  &lt;/ero&gt;
 &lt;/arguments&gt;
&lt;/input&gt;
</msg>
<arg>${xml_data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:03.733385" elapsed="0.000341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.736100" level="FAIL">'[200, 201, 204]' does not contain '400'</msg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.733873" elapsed="0.002289">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:03.736225" elapsed="0.000024"/>
</return>
<var>${response}</var>
<arg>network-topology-pcep:update-lsp</arg>
<arg>${xml_data}</arg>
<doc>Post XML data to given pcep-operations URI, check status_code is 200 and return response text (JSON).</doc>
<status status="FAIL" start="2026-05-01T00:40:03.723425" elapsed="0.012915">'[200, 201, 204]' does not contain '400'</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-01T00:40:03.736397" elapsed="0.000015"/>
</return>
<var>${text}</var>
<arg>${update_instantiated_xml}</arg>
<doc>Update LSP according to XML data and return response (json) text.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.722899" elapsed="0.013606">'[200, 201, 204]' does not contain '400'</status>
</kw>
<doc>Perform update-lsp on the newly instantiated tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:40:03.721742" elapsed="0.014902">'[200, 201, 204]' does not contain '400'</status>
</test>
<test id="s1-s2-t12" name="Topology_Second_Updated" line="100">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.741428" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:03.738559" elapsed="0.002927"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:03.749704" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:03.749935" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:03.750109" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:03.741690" elapsed="0.008456"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:03.755115" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:03.753713" elapsed="0.001442"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:03.756191" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:03.755348" elapsed="0.000883"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:03.756898" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:03.757694" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.756426" elapsed="0.001446">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.750429" elapsed="0.007706">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.738021" elapsed="0.020359">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:04.765774" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:04.760833" elapsed="0.005011"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:04.774937" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:04.775107" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:04.775225" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:04.766187" elapsed="0.009064"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:04.778842" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:04.777821" elapsed="0.001050"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:04.779655" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:04.779010" elapsed="0.000673"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:04.780153" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:04.780795" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:04.779820" elapsed="0.001074">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:04.775494" elapsed="0.005568">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:04.759081" elapsed="0.022128">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:05.787115" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:05.783079" elapsed="0.004083"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:05.796054" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:05.796265" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:05.796514" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:05.787390" elapsed="0.009163"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:05.801725" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:05.800246" elapsed="0.001520"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:05.802809" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:05.801960" elapsed="0.000889"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:05.803531" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:05.804317" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:05.803040" elapsed="0.001481">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:05.796855" elapsed="0.007901">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:05.781969" elapsed="0.022994">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:06.814198" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:06.809310" elapsed="0.004967"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:06.824396" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:06.824598" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:06.824722" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:06.814656" elapsed="0.010093"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:06.828300" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:06.827282" elapsed="0.001047"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:06.829112" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:06.828482" elapsed="0.000658"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:06.829754" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:06.830664" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:06.829279" elapsed="0.001517">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:06.824969" elapsed="0.006058">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:06.806414" elapsed="0.024821">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:07.837675" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:07.833492" elapsed="0.004227"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:07.847197" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:07.847414" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:07.847658" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:07.837936" elapsed="0.009761"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:07.852811" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:07.851353" elapsed="0.001499"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:07.853910" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:07.853045" elapsed="0.000905"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:07.854638" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:07.855429" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:07.854142" elapsed="0.001485">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:07.848002" elapsed="0.009485">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:07.832213" elapsed="0.025434">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:08.864232" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:08.859340" elapsed="0.004960"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:08.872828" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:08.873045" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:08.873194" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:08.864567" elapsed="0.008663"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:08.878256" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:08.876836" elapsed="0.001465"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:08.879346" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:08.878513" elapsed="0.000873"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:08.880085" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:08.880952" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:08.879610" elapsed="0.001472">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:08.873550" elapsed="0.007762">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:08.858271" elapsed="0.023269">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:09.887946" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:09.883354" elapsed="0.004637"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:09.896866" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:09.897079" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:09.897293" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:09.888208" elapsed="0.009123"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:09.902647" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:09.901206" elapsed="0.001482"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:09.903915" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:09.902882" elapsed="0.001074"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:09.904632" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:09.905405" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:09.904151" elapsed="0.001459">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:09.897645" elapsed="0.008201">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:09.882228" elapsed="0.023826">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:10.912307" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:10.907947" elapsed="0.004405"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:10.921231" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:10.921480" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:10.921638" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:10.912590" elapsed="0.009086"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:10.926774" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:10.925316" elapsed="0.001500"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:10.927864" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:10.927009" elapsed="0.000895"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:10.928578" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:10.929428" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:10.928095" elapsed="0.001484">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:10.921969" elapsed="0.007841">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:10.906859" elapsed="0.023158">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:11.937078" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:11.931699" elapsed="0.005449"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:11.947026" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:11.947189" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:11.947368" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:11.937527" elapsed="0.009868"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:11.951292" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:11.950003" elapsed="0.001330"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:11.952398" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:11.951548" elapsed="0.000890"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:11.953124" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:11.953923" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:11.952654" elapsed="0.001459">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:11.947658" elapsed="0.006693">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:11.930628" elapsed="0.023974">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:12.961669" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:12.956443" elapsed="0.005301"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:12.972352" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:12.972549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:12.972664" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:12.962110" elapsed="0.010581"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:12.976343" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:12.975305" elapsed="0.001067"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:12.977125" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:12.976525" elapsed="0.000628"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:12.977687" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:12.978388" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:12.977289" elapsed="0.001223">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:12.972921" elapsed="0.005856">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:12.955325" elapsed="0.023661">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:13.983823" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:13.980323" elapsed="0.003548"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:13.992821" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:13.993092" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:13.993401" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:13.984092" elapsed="0.009348"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:13.998728" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:13.997234" elapsed="0.001537"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:13.999835" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:13.998965" elapsed="0.000910"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:14.000580" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "Instantiated tunnel",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 2,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": true,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 2,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 2,
         "tunnel-id": 2
        },
        "symbolic-path-name": {
         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
        }
       }
      }
     }
    ]
   },
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:14.001379" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
-        }
-       ]
-      },
-      "lsp-id": 2,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
-       "ignore": false,
-       "odl-pcep-ietf-initiated:create": true,
-       "operational": "up",
-       "pce-allocation": false,
-       "plsp-id": 2,
-       "processing-rule": false,
-       "remove": false,
-       "sync": true,
-       "tlvs": {
-        "lsp-identifiers": {
-         "ipv4": {
-          "ipv4-extended-tunnel-id": "10.30.170.157",
-          "ipv4-tunnel-endpoint-address": "1.1.1.1",
-          "ipv4-tunnel-sender-address": "10.30.170.157"
-         },
-         "lsp-id": 2,
-         "tunnel-id": 2
-        },
-        "symbolic-path-name": {
-         "path-name": "SW5zdGFudGlhdGVkIHR1bm5lbA=="
-        }
-       }
-      }
-     }
-    ]
-   },
    {
     "name": "pcc_10.30.170.157_tunnel_1",
     "path": [
@@ -67,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -102,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:14.000072" elapsed="0.001517">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:13.993822" elapsed="0.007986">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:13.979603" elapsed="0.022397">Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:40:14.002172" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
-         "loose": false
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${updated_updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:40:03.737508" elapsed="10.264852">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes the updated delegated and updated instantiated tunnel.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:40:03.736932" elapsed="10.265698">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -2,58 +2,6 @@
  "network-topology-pcep:path-computation-client": {
   "ip-address": "10.30.170.157",
   "reported-lsp": [
-   {
-    "name": "Instantiated tunnel",
-    "path": [
-     {
-      "ero": {
-       "ignore": false,
-       "processing-rule": false,
-       "subobject": [
-        {
-         "ip-prefix": {
-          "ip-prefix": "1.1.1.1/32"
-         },
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t13" name="Remove_Instantiated" line="105">
<kw name="Remove_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Operate_Xml_Lsp_Return_Json" owner="PcepOperations">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:14.005396" level="INFO">${uri_path} = /rests/operations/network-topology-pcep:remove-lsp</msg>
<var>${uri_path}</var>
<arg>/rests/operations/${uri_part}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:14.004922" elapsed="0.000514"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:14.019562" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:remove-lsp 
 path_url=/rests/operations/network-topology-pcep:remove-lsp 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01qgdre48pmmq91sz6sdv8qsjfc2.node0', 'Content-Length': '317', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
&lt;/input&gt;
 
 </msg>
<msg time="2026-05-01T00:40:14.019977" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/operations/network-topology-pcep:remove-lsp 
 status=200, reason=OK 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '102'} 
 body={"network-topology-pcep:output":{"failure":"unsent","error":[{"error-object":{"type":19,"value":3}}]}} 
 </msg>
<msg time="2026-05-01T00:40:14.020151" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>pcep_session</arg>
<arg>url=${uri_path}</arg>
<arg>data=${xml_data}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:14.005662" elapsed="0.014532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:14.020974" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
 &lt;node&gt;pcc://10.30.170.157&lt;/node&gt;
 &lt;name&gt;Instantiated tunnel&lt;/name&gt;
 &lt;network-topology-ref xmlns:topo="urn:TBD:params:xml:ns:yang:network-topology"&gt;/topo:network-topology/topo:topology[topo:topology-id="pcep-topology"]&lt;/network-topology-ref&gt;
&lt;/input&gt;
</msg>
<arg>${xml_data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:14.020522" elapsed="0.000534"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:40:14.021337" elapsed="0.003369"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:14.024781" elapsed="0.000078"/>
</return>
<msg time="2026-05-01T00:40:14.027666" level="INFO">${response} = {"network-topology-pcep:output":{"failure":"unsent","error":[{"error-object":{"type":19,"value":3}}]}}</msg>
<var>${response}</var>
<arg>network-topology-pcep:remove-lsp</arg>
<arg>${xml_data}</arg>
<doc>Post XML data to given pcep-operations URI, check status_code is 200 and return response text (JSON).</doc>
<status status="PASS" start="2026-05-01T00:40:14.004468" elapsed="0.023238"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-01T00:40:14.027776" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:40:14.028010" level="INFO">${text} = {"network-topology-pcep:output":{"failure":"unsent","error":[{"error-object":{"type":19,"value":3}}]}}</msg>
<var>${text}</var>
<arg>${remove_instantiated_xml}</arg>
<doc>Remove LSP according to XML data and return response (json) text.</doc>
<status status="PASS" start="2026-05-01T00:40:14.003963" elapsed="0.024085"/>
</kw>
<doc>Perform remove-lsp on the instantiated tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:14.003201" elapsed="0.025008"/>
</test>
<test id="s1-s2-t14" name="Topology_Again_Updated" line="110">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:14.033745" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:14.030774" elapsed="0.003011"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:14.041280" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:14.041535" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:14.041697" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:14.033992" elapsed="0.007745"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:14.046399" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:14.045413" elapsed="0.001027"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:14.047536" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:14.046663" elapsed="0.000913"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:14.048238" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:14.048885" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:14.047774" elapsed="0.001232">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:14.042053" elapsed="0.007170">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:14.030210" elapsed="0.019173">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:15.053061" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:15.050479" elapsed="0.002617"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:15.063586" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:15.063921" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:15.064122" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:15.053260" elapsed="0.010903"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:15.069412" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:15.068322" elapsed="0.001156"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:15.070787" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:15.069719" elapsed="0.001112"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:15.071589" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:15.072198" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:15.071040" elapsed="0.001282">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:15.064641" elapsed="0.008055">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:15.049867" elapsed="0.023083">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:16.079641" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:16.074790" elapsed="0.004919"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:16.090857" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:16.091084" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:16.091238" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:16.080047" elapsed="0.011228"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:16.095937" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:16.094960" elapsed="0.001017"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:16.097049" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:16.096186" elapsed="0.000902"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:16.097781" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:16.098416" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:16.097283" elapsed="0.001271">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:16.091616" elapsed="0.007170">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:16.073754" elapsed="0.025238">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:17.106037" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:17.100832" elapsed="0.005255"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:17.115139" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:17.115383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:17.115618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:17.106331" elapsed="0.009346"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:17.120913" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:17.119858" elapsed="0.001100"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:17.122097" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:17.121167" elapsed="0.000973"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:17.122904" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:17.123537" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:17.122349" elapsed="0.001328">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:17.116143" elapsed="0.007787">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:17.099726" elapsed="0.024426">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:18.130830" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:18.126004" elapsed="0.004894"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:18.140712" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:18.140933" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:18.141080" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:18.131254" elapsed="0.009862"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:18.145661" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:18.144707" elapsed="0.000995"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:18.146757" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:18.145896" elapsed="0.000902"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:18.147478" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:18.148100" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:18.146988" elapsed="0.001227">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:18.141411" elapsed="0.007033">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:18.124958" elapsed="0.023716">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:19.155659" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:19.150298" elapsed="0.005431"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:19.164328" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:19.164564" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:19.164735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:19.155998" elapsed="0.008774"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:19.169359" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:19.168409" elapsed="0.000991"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:19.170471" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:19.169614" elapsed="0.000900"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:19.171181" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:19.171747" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:19.170726" elapsed="0.001133">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:19.165128" elapsed="0.006958">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:19.149286" elapsed="0.023006">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:20.178730" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:20.173941" elapsed="0.004858"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:20.185840" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:20.186048" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:20.186228" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:20.179016" elapsed="0.007251"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:20.190793" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:20.189808" elapsed="0.001026"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:20.191886" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:20.191027" elapsed="0.000899"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:20.192594" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:20.193213" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:20.192117" elapsed="0.001209">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:20.186582" elapsed="0.006994">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:20.172940" elapsed="0.020853">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:21.200906" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:21.195626" elapsed="0.005349"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:21.210757" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:21.210965" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:21.211127" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:21.201314" elapsed="0.009851"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:21.215790" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:21.214808" elapsed="0.001023"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:21.216910" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:21.216024" elapsed="0.000927"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:21.217617" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:21.218182" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:21.217145" elapsed="0.001148">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:21.211541" elapsed="0.007043">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:21.194627" elapsed="0.024169">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:22.225524" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:22.220591" elapsed="0.005003"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:22.235196" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:22.235359" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:22.235491" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:22.225932" elapsed="0.009593"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:22.239168" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:22.238195" elapsed="0.001013"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:22.240254" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:22.239402" elapsed="0.000891"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:22.240970" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:22.241635" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:22.240506" elapsed="0.001245">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:22.235741" elapsed="0.006285">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:22.219510" elapsed="0.022723">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:23.249237" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:23.244397" elapsed="0.004910"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:23.260227" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:23.261814" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:23.262372" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:23.249677" elapsed="0.012762"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:23.270714" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:23.269064" elapsed="0.001717"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:23.272586" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:23.271090" elapsed="0.001567"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:23.273471" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:23.273916" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:23.273020" elapsed="0.000998">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:23.263289" elapsed="0.010908">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:23.242902" elapsed="0.031452">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.279206" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:24.275993" elapsed="0.003263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:24.287156" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:24.287418" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=pcc:%2F%2F10.30.170.157/network-topology-pcep:path-computation-client?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '949'} 
 body={"network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}} 
 </msg>
<msg time="2026-05-01T00:40:24.287607" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:24.279502" elapsed="0.008145"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:24.292150" level="INFO">${expected_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:24.291156" elapsed="0.001034"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:24.293285" level="INFO">${actual_normalized} = {
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ig...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:24.292395" elapsed="0.000929"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.293996" level="INFO">{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        },
        {
         "ip-prefix": {
          "ip-prefix": "2.2.2.2/32"
         },
         "loose": false
        }
       ]
      },
      "lsp-id": 1,
      "odl-pcep-ietf-stateful:lsp": {
       "administrative": true,
       "delegate": true,
       "ignore": false,
       "odl-pcep-ietf-initiated:create": false,
       "operational": "up",
       "pce-allocation": false,
       "plsp-id": 1,
       "processing-rule": false,
       "remove": false,
       "sync": true,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      }
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-tlv": {
   "odl-pcep-ietf-stateful:stateful": {
    "lsp-update-capability": true,
    "odl-pcep-ietf-initiated:initiation": true
   }
  }
 }
}

!=

{
 "network-topology-pcep:path-computation-client": {
  "ip-address": "10.30.170.157",
  "reported-lsp": [
   {
    "name": "pcc_10.30.170.157_tunnel_1",
    "path": [
     {
      "ero": {
       "ignore": false,
       "processing-rule": false,
       "subobject": [
        {
         "ip-prefix": {
          "ip-prefix": "1.1.1.1/32"
         },
         "loose": false
        }
       ]
      },
      "lsp": {
       "ignore": false,
       "lsp-flags": {
        "administrative": true,
        "create": false,
        "delegate": true,
        "operational": "up",
        "pce-allocation": false,
        "remove": false,
        "sync": true
       },
       "plsp-id": 1,
       "processing-rule": false,
       "tlvs": {
        "lsp-identifiers": {
         "ipv4": {
          "ipv4-extended-tunnel-id": "10.30.170.157",
          "ipv4-tunnel-endpoint-address": "1.1.1.1",
          "ipv4-tunnel-sender-address": "10.30.170.157"
         },
         "lsp-id": 1,
         "tunnel-id": 1
        },
        "symbolic-path-name": {
         "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
        }
       }
      },
      "lsp-id": 1
     }
    ]
   }
  ],
  "state-sync": "synchronized",
  "stateful-capability": {
   "delta-lsp-sync-capability": false,
   "include-db-version": false,
   "initiation": true,
   "lsp-update-capability": true,
   "triggered-initial-sync": false,
   "triggered-resync": false
  }
 }
}</msg>
<msg time="2026-05-01T00:40:24.294643" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
+      "lsp": {
        "ignore": false,
-       "odl-pcep-ietf-initiated:create": false,
-       "operational": "up",
-       "pce-allocation": false,
+       "lsp-flags": {
+        "administrative": true,
+        "create": false,
+        "delegate": true,
+        "operational": "up",
+        "pce-allocation": false,
+        "remove": false,
+        "sync": true
+       },
        "plsp-id": 1,
        "processing-rule": false,
-       "remove": false,
-       "sync": true,
        "tlvs": {
         "lsp-identifiers": {
          "ipv4": {
@@ -50,17 +45,20 @@
          "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
         }
        }
-      }
+      },
+      "lsp-id": 1
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.293523" elapsed="0.001244">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.287936" elapsed="0.007079">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.275084" elapsed="0.020145">Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<msg time="2026-05-01T00:40:24.295428" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
-       "delegate": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${updated_json}</arg>
<arg>${PATH_SESSION_URI}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:40:14.029541" elapsed="10.266092">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</kw>
<doc>Compare pcep-topology to default_json, which includes the updated tunnel, to verify that instantiated tunnel was removed.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:40:14.028672" elapsed="10.267230">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -15,27 +15,22 @@
           "ip-prefix": "1.1.1.1/32"
          },
          "loose": false
-        },
-        {
-         "ip-prefix": {
-          "ip-prefix": "2.2.2.2/32"
-         },
-         "loose": false
         }
        ]
       },
-      "lsp-id": 1,
-      "odl-pcep-ietf-stateful:lsp": {
-       "administrative": true,
    [ Message content over the limit has been removed. ]
      }
     ]
    }
   ],
   "state-sync": "synchronized",
-  "stateful-tlv": {
-   "odl-pcep-ietf-stateful:stateful": {
-    "lsp-update-capability": true,
-    "odl-pcep-ietf-initiated:initiation": true
-   }
+  "stateful-capability": {
+   "delta-lsp-sync-capability": false,
+   "include-db-version": false,
+   "initiation": true,
+   "lsp-update-capability": true,
+   "triggered-initial-sync": false,
+   "triggered-resync": false
   }
  }
 }</status>
</test>
<test id="s1-s2-t15" name="Stop_Pcc_Mock" line="115">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.298429" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:24.297950" elapsed="0.000592"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:24.298746" elapsed="0.000447"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:40:24.297582" elapsed="0.001711"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:24.311596" level="INFO">{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
00:39:21.343 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
00:39:21.344 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
00:39:21.347 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:45439[0] &lt;-&gt;</msg>
<msg time="2026-05-01T00:40:24.311900" level="INFO">${output} = {deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiat...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:24.299507" elapsed="0.012432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.312780" level="INFO">{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
00:39:21.343 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
00:39:21.344 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
00:39:21.347 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:45439[0] &lt;-&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:24.312301" elapsed="0.000547"/>
</kw>
<doc>Send ctrl+c to pcc-mock, fails if no prompt is seen
after 3 seconds (the default for SSHLibrary)</doc>
<status status="PASS" start="2026-05-01T00:40:24.296500" elapsed="0.016483"/>
</test>
<test id="s1-s2-t16" name="Topology_Postcondition" line="122">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.320164" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:24.317661" elapsed="0.002543"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:24.329783" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:24.331140" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1920'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:01:01","messages":{"last-received-rpt-msg-timestamp":1777595961,"reply-time":{"average-time":35,"min-time":35,"max-time":35},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":1,"last-sent-msg-timestamp":1777596013,"error-messages":{"received-error-msg-count":1,"sent-error-msg-count":0,"last-received-error":{"error-type":19,"error-value":9}},"received-msg-count":4,"sent-msg-count":2,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:40:24.331287" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:24.320608" elapsed="0.010707"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:24.334400" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:24.334069" elapsed="0.000360"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:24.335711" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:24.334650" elapsed="0.001091"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:40:24.336261" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": 0
      },
      "messages": {
       "error-messages": {
        "last-received-error": {
         "error-type": 19,
         "error-value": 9
        },
        "received-error-msg-count": 1,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777595961,
       "last-sent-msg-timestamp": 1777596013,
       "received-msg-count": 4,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 35,
        "max-time": 35,
        "min-time": 35
       },
       "sent-init-msg-count": 1,
       "sent-msg-count": 2,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": 0
      },
      "session-duration": "0:00:01:01",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:40:24.336678" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,118 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "messages": {
+       "error-messages": {
+        "last-received-error": {
+         "error-type": 19,
+         "error-value": 9
+        },
+        "received-error-msg-count": 1,
+        "sent-error-msg-count": 0
+       },
+       "last-received-rpt-msg-timestamp": 1777595961,
+       "last-sent-msg-timestamp": 1777596013,
+       "received-msg-count": 4,
+       "received-rpt-msg-count": 2,
+       "reply-time": {
+        "average-time": 35,
+        "max-time": 35,
+        "min-time": 35
+       },
+       "sent-init-msg-count": 1,
+       "sent-msg-count": 2,
+       "sent-upd-msg-count": 0,
+       "unknown-msg-received": 0
+      },
+      "peer-capabilities": {
+       "active": true,
+       "instantiation": true,
+       "stateful": true
+      },
+      "peer-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.157",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "session-duration": "0:00:01:01",
+      "synchronized": true
+     },
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.335882" elapsed="0.000907">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,118 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "messages": {
+       "error-messages": {
+        "last-received-error": {
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.331574" elapsed="0.005415">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,118 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "messages": {
+       "error-messages": {
+        "last-received-error": {
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>${off_json}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="FAIL" start="2026-05-01T00:40:24.314798" elapsed="0.022343">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,118 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "messages": {
+       "error-messages": {
+        "last-received-error": {
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Compare_Topology">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.346623" level="INFO">${topology_uri} = /rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${topology_uri}</var>
<arg>'${uri}'=='${EMPTY}'</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology?content=nonconfig</arg>
<arg>${REST_API}/${TOPOLOGY_URL}=pcep-topology/${uri}?content=nonconfig</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:25.343288" elapsed="0.003380"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:25.354576" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0n7vrvjmbu3g21mrrxca0yjr861.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:25.354762" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:40:25.354918" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${topology_uri}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:25.346887" elapsed="0.008068"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:25.359037" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:25.358615" elapsed="0.000461"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:25.359658" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:25.359268" elapsed="0.000428"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:40:25.359903" elapsed="0.000502"/>
</kw>
<arg>${exp}</arg>
<arg>${response.text}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:40:25.355298" elapsed="0.005219"/>
</kw>
<arg>${off_json}</arg>
<doc>Get current pcep-topology as json, compare both expected and actual json.
Error codes and normalized jsons should match exactly.</doc>
<status status="PASS" start="2026-05-01T00:40:25.337932" elapsed="0.022666"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>${off_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:24.314099" elapsed="1.046562"/>
</kw>
<doc>Compare curent pcep-topology to "off_json" again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:24.313424" elapsed="1.047400"/>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-05-01T00:40:25.372847" level="INFO">[chan 6] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:40:25.380773" level="INFO">'pccmock.log' -&gt; '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/pccmock.log'</msg>
<arg>pccmock.log</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-05-01T00:40:25.361988" elapsed="0.018918"/>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-05-01T00:40:25.382392" level="INFO">Running command 'cat pccmock.log 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:40:25.385629" level="INFO">${pccmocklog} = 00:39:21.215 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0x20e4f40b, L:/10.30.170...</msg>
<var>${pccmocklog}</var>
<arg>cat pccmock.log</arg>
<doc>_This keyword is considered deprecated. Use the
[http://robotframework.org/robotframework/latest/libraries/Process.html|
Process] library instead._</doc>
<status status="PASS" start="2026-05-01T00:40:25.381266" elapsed="0.004406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.386231" level="INFO">00:39:21.215 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189]
00:39:21.326 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP session with [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189] started, sent proposal Open{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
00:39:21.343 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
00:39:21.344 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0x20e4f40b, L:/10.30.170.157:45439 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
00:39:21.347 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:45439[0] &lt;-&gt; 10.30.170.185/10.30.170.185:4189[0] started
00:39:21.384 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone
00:39:21.385 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix
00:39:21.386 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone
00:39:21.387 [multiThreadIoEventLoopGroup-2-1] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix</msg>
<arg>${pccmocklog}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:25.385874" elapsed="0.000502"/>
</kw>
<kw name="Teardown_Pcep_Operations" owner="PcepOperations">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:25.387027" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:40:25.386926" elapsed="0.000225"/>
</kw>
<doc>Teardown to pair with Setup (otherwise no-op).</doc>
<status status="PASS" start="2026-05-01T00:40:25.386655" elapsed="0.000569"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:25.387560" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:40:25.387438" elapsed="0.000187"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:40:25.387837" elapsed="0.000401"/>
</kw>
<doc>Download pccmock.log and Log its contents.
Compute and Log the diff between expected and actual normalized responses.
Close both HTTP client session and SSH connection to Mininet.</doc>
<status status="PASS" start="2026-05-01T00:40:25.361700" elapsed="0.026623"/>
</kw>
<doc>Basic tests for odl-bgpcep-pcep-all feature.

Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html</doc>
<status status="FAIL" start="2026-05-01T00:39:19.006182" elapsed="66.382185"/>
</suite>
<suite id="s1-s3" name="Bgp Functional Md5" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.598405" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:25.594142" elapsed="0.004333"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:40:25.593901" elapsed="0.004653"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.603598" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:40:25.599925" elapsed="0.003728"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:40:25.603878" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:25.603749" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:25.603723" elapsed="0.000229"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.604488" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:25.604112" elapsed="0.000420"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.605011" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:40:25.604698" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:40:25.605570" elapsed="0.000299"/>
</kw>
<msg time="2026-05-01T00:40:25.605968" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:25.606016" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:25.605206" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.606597" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:25.606209" elapsed="0.000415"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.607708" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:25.607414" elapsed="0.000321"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.608137" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:25.607884" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.608624" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.608320" elapsed="0.000331"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.612440" elapsed="0.000266"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.613219" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:25.612873" elapsed="0.000374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.613401" elapsed="0.000251"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.614430" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:25.614139" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:40:25.614519" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:40:25.614695" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:40:25.613846" elapsed="0.000874"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:25.615382" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a1c1490&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:40:25.614877" elapsed="0.000673"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.615744" elapsed="0.000197"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:40:25.611855" elapsed="0.004145"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:25.611511" elapsed="0.004533"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:40:25.608708" elapsed="0.007371"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.616674" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:25.616252" elapsed="0.000466"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.617286" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:25.616883" elapsed="0.000446"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.617894" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:25.617507" elapsed="0.000430"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:40:25.606962" elapsed="0.011032"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:40:25.599566" elapsed="0.018483"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:25.618230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:25.618116" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:25.618098" elapsed="0.000200"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.621355" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:25.620965" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.621853" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:25.621561" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:25.621924" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:25.622077" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:25.620640" elapsed="0.001462"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:25.623095" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.622830" elapsed="0.000291"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:25.623928" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:25.624032" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:25.623745" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:25.627707" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:25.627048" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:25.627029" elapsed="0.000803"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:25.628511" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:25.628747" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:25.628038" elapsed="0.000762"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.629794" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:25.629109" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:25.631116" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:25.630176" elapsed="0.000996"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:40:25.632926" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:40:25.633104" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:40:25.632571" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:25.633508" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:40:25.635123" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:40:26.212198" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:40:25 UTC 2026

  System load:  0.2                Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:20 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:40:25.634796" elapsed="0.577588"/>
</kw>
<msg time="2026-05-01T00:40:26.212502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:25.634316" elapsed="0.578369"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:40:25.631656" elapsed="0.581194"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:26.213798" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:40:26.226872" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:40:26.227244" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:40:26.227547" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:26.213260" elapsed="0.014406"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.228343" elapsed="0.001210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.232179" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:26.230868" elapsed="0.001457"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.232971" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.232609" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.232566" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:26.233678" elapsed="0.000085"/>
</return>
<status status="PASS" start="2026-05-01T00:40:26.233323" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.233299" elapsed="0.000628"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.234008" elapsed="0.000025"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:26.238816" elapsed="0.000981"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.240261" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.241093" elapsed="0.000316"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:26.234704" elapsed="0.006910"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:40:25.626083" elapsed="0.615778"/>
</kw>
<msg time="2026-05-01T00:40:26.242020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:25.625403" elapsed="0.616694"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:40:25.624756" elapsed="0.617454"/>
</kw>
<msg time="2026-05-01T00:40:26.242267" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:25.624216" elapsed="0.618114"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:26.245533" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.246013" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.246311" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:26.242772" elapsed="0.003702"/>
</kw>
<msg time="2026-05-01T00:40:26.246569" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:40:25.623348" elapsed="0.623246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.247018" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:26.246772" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:40:26.247102" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:40:25.622475" elapsed="0.624752"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:25.622283" elapsed="0.624982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:25.622154" elapsed="0.625147"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:40:25.618533" elapsed="0.628840"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:40:26.247543" elapsed="0.000209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.261030" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.260922" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.260903" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:26.261388" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:26.261505" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.261252" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.261939" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:26.261686" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.262377" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:26.262139" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:26.263179" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:40:26.262949" elapsed="0.000361">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:40:26.263417" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:40:26.263477" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.262592" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:26.263802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:26.263578" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.263559" elapsed="0.000342"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:26.264697" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.264418" elapsed="0.000305"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:40:26.264771" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:26.264920" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:40:26.264142" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.265138" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:26.265845" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:26.265944" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.265738" elapsed="0.000233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.266126" elapsed="0.002349"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:40:26.268912" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:40:26.925425" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.268645" elapsed="0.656989"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:26.929260" elapsed="0.000389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.929821" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.930152" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:26.926914" elapsed="0.003395"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:26.926130" elapsed="0.004224"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:40:26.260647" elapsed="0.669760"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:26.248499" elapsed="0.681979"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.248106" elapsed="0.682427"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:26.247964" elapsed="0.682610"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:40:26.247813" elapsed="0.682801"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:40:25.598943" elapsed="1.331736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.933338" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.933209" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.933185" elapsed="0.000229"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.938097" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.937993" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.937976" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.939157" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:26.938735" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:26.939658" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:26.939345" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:26.939729" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:40:26.939893" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:26.938390" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.945566" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.945437" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.945419" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:26.946845" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:26.946719" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:26.946701" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:26.947407" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:26.947080" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:26.947838" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:26.947612" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:27.036311" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:26.948532" elapsed="0.087916"/>
</kw>
<msg time="2026-05-01T00:40:27.036603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:27.036649" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.948023" elapsed="0.088662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:27.126952" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "f "u "[78Cn "[A[78Cc
 "t "i "o "n "a "l "_ "m "d "5 ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:27.037362" elapsed="0.089879"/>
</kw>
<msg time="2026-05-01T00:40:27.127479" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:27.127530" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:27.036859" elapsed="0.090709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:27.128107" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:27.127708" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:27.127663" elapsed="0.000637"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:27.128972" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "f "u "[78Cn "[A[78Cc
 "t "i "o "n "a "l "_ "m "d "5 ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:27.128493" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:27.129388" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:27.129149" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:27.129131" elapsed="0.000448"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:27.129621" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.131831" elapsed="0.000463"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:27.132920" elapsed="0.000323"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:27.133589" elapsed="0.000241"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:27.131006" elapsed="0.002916"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:27.129983" elapsed="0.004074"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:26.946411" elapsed="0.187749"/>
</kw>
<msg time="2026-05-01T00:40:27.134258" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:27.134304" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.945795" elapsed="0.188547"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:40:27.134682" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:40:27.134565" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:27.134543" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:27.135259" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:27.135638" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:40:27.135713" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:40:26.945145" elapsed="0.190682"/>
</kw>
<msg time="2026-05-01T00:40:27.135927" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:27.135972" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.940398" elapsed="0.195612"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:27.136343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:27.136090" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:27.136072" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:26.940253" elapsed="0.196191"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:26.940064" elapsed="0.196535"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:40:26.937707" elapsed="0.198957"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:40:26.931324" elapsed="0.205400"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:26.930849" elapsed="0.205921"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:40:25.593562" elapsed="1.543267"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:27.137370" level="INFO">${tools_system_conn_id} = 7</msg>
<var>${tools_system_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:27.136989" elapsed="0.000407"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:27.137923" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:27.137583" elapsed="0.000382"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:40:27.139701" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:40:27.139778" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:40:27.139392" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.139957" elapsed="0.000655"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:40:27.141505" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:40:27.779303" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:40:27 UTC 2026

  System load:  0.02               Processes:             117
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:39:19 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:40:27.141159" elapsed="0.638327"/>
</kw>
<msg time="2026-05-01T00:40:27.779578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.140788" elapsed="0.638876"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:40:27.138955" elapsed="0.640833"/>
</kw>
<msg time="2026-05-01T00:40:27.779843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.138546" elapsed="0.641423"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:40:27.138170" elapsed="0.641881"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:27.786036" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:27.785693" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:27.787593" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:40:28.308242" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:28.308588" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 312ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:40:28.308694" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:40:28.308784" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:27.787384" elapsed="0.521452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.310835" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:40:28.310151" elapsed="0.000789"/>
</kw>
<msg time="2026-05-01T00:40:28.311149" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:40:28.311246" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:28.309286" elapsed="0.002009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.312721" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:28.311712" elapsed="0.001068"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.315646" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 312ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:28.315050" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.316670" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:28.316100" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.317662" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:28.317101" elapsed="0.000657"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:28.313800" elapsed="0.004080"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:28.312975" elapsed="0.004987"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:28.312923" elapsed="0.005105"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:40:28.318442" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:28.318156" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:28.318119" elapsed="0.000518"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:28.318953" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-05-01T00:40:28.318752" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:28.318719" elapsed="0.000439"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:28.319376" elapsed="0.000022"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:27.786827" elapsed="0.532683"/>
</kw>
<msg time="2026-05-01T00:40:28.319568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.786223" elapsed="0.533393"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:40:27.785044" elapsed="0.534682"/>
</kw>
<msg time="2026-05-01T00:40:28.319780" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:27.781193" elapsed="0.538631"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:40:27.780810" elapsed="0.539171"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:28.326602" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:28.326247" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:28.328439" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:40:30.677507" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:30.678201" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-05-01T00:40:30.678382" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:40:30.678584" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:28.328089" elapsed="2.350597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.683957" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:40:30.682924" elapsed="0.001283"/>
</kw>
<msg time="2026-05-01T00:40:30.684577" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:40:30.684739" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:30.679566" elapsed="0.005255"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.686950" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:30.685437" elapsed="0.001554"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.689466" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 29.5 MB/s eta 0:00:00
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:30.689049" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.690297" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:30.689937" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.691127" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:30.690769" elapsed="0.000456"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:30.688135" elapsed="0.003186"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:30.687173" elapsed="0.004250"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:30.687146" elapsed="0.004406"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:40:30.691792" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:30.691615" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:30.691598" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:30.692148" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:40:30.691989" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:30.691973" elapsed="0.000350"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:30.692490" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:28.327426" elapsed="2.365247"/>
</kw>
<msg time="2026-05-01T00:40:30.692732" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:28.326789" elapsed="2.366001"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:40:28.325649" elapsed="2.367222"/>
</kw>
<msg time="2026-05-01T00:40:30.693010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:28.321886" elapsed="2.371172"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:40:28.321326" elapsed="2.371812"/>
</kw>
<msg time="2026-05-01T00:40:30.693186" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:28.320941" elapsed="2.372301"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:28.320604" elapsed="2.372714"/>
</kw>
<msg time="2026-05-01T00:40:30.693362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:28.320146" elapsed="2.373258"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:27.780402" elapsed="2.913090"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:30.700771" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:30.700431" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:30.702566" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:40:31.943920" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:31.944445" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Downloading setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-05-01T00:40:31.944608" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:40:31.944774" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:30.702199" elapsed="1.242634"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.949823" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:40:31.948511" elapsed="0.001568"/>
</kw>
<msg time="2026-05-01T00:40:31.950411" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:40:31.950657" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:31.945596" elapsed="0.005120"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.953192" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:31.951236" elapsed="0.002016"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.957745" level="INFO">Collecting setuptools==44.0.0
  Downloading setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 583.2/583.2 kB 18.0 MB/s  0:00:00
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:31.957392" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.958422" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:31.958111" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.959117" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:31.958797" elapsed="0.000387"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:31.955524" elapsed="0.003732"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:31.953619" elapsed="0.005733"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:31.953564" elapsed="0.005817"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:40:31.959608" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:31.959437" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:31.959421" elapsed="0.000312"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:31.959914" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:40:31.959786" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:31.959771" elapsed="0.000287"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:31.960279" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:30.701598" elapsed="1.258823"/>
</kw>
<msg time="2026-05-01T00:40:31.960495" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:30.700958" elapsed="1.259591"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:40:30.699824" elapsed="1.260844"/>
</kw>
<msg time="2026-05-01T00:40:31.960727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:30.696031" elapsed="1.264742"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:40:30.695369" elapsed="1.265495"/>
</kw>
<msg time="2026-05-01T00:40:31.960916" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:30.694987" elapsed="1.265972"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:30.694618" elapsed="1.266427"/>
</kw>
<msg time="2026-05-01T00:40:31.961089" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:30.694225" elapsed="1.266906"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:30.693964" elapsed="1.267251"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:31.968420" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:31.968089" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:31.970257" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate'.</msg>
<msg time="2026-05-01T00:40:33.856772" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:33.857184" level="INFO">${stdout} = Collecting exabgp==3.4.17
  Downloading exabgp-3.4.17.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to bu...</msg>
<msg time="2026-05-01T00:40:33.857271" level="INFO">${stderr} =   error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        ...</msg>
<msg time="2026-05-01T00:40:33.857349" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:31.969902" elapsed="1.887484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:33.860796" level="INFO">Length is 1821.</msg>
<msg time="2026-05-01T00:40:33.861496" level="FAIL">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:40:33.859964" elapsed="0.001969">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-05-01T00:40:33.862190" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:40:33.862264" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:33.857907" elapsed="0.004397"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:33.864010" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:33.862675" elapsed="0.001376"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:33.867297" level="INFO">Collecting exabgp==3.4.17
  Downloading exabgp-3.4.17.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:33.866815" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:33.868445" level="INFO">  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-1m1ctqcb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:33.867972" elapsed="0.000754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:33.869643" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:33.869161" elapsed="0.000578"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:33.865447" elapsed="0.004396"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:33.864266" elapsed="0.005714"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:33.864227" elapsed="0.005797"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:40:33.870319" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:33.870110" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:33.870085" elapsed="0.000456"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:33.870814" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:40:33.870620" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:33.870598" elapsed="0.000420"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:33.871235" elapsed="0.000031"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:31.969257" elapsed="1.902178"/>
</kw>
<msg time="2026-05-01T00:40:33.871663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:31.968646" elapsed="1.903147"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:40:31.967488" elapsed="1.904445"/>
</kw>
<msg time="2026-05-01T00:40:33.872012" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:31.963689" elapsed="1.908388"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:40:31.963128" elapsed="1.909077"/>
</kw>
<msg time="2026-05-01T00:40:33.872276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:31.962745" elapsed="1.909593"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:31.962300" elapsed="1.910181"/>
</kw>
<msg time="2026-05-01T00:40:33.872546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:31.961706" elapsed="1.910904"/>
</kw>
<arg>exabgp==3.4.17</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:40:31.961420" elapsed="1.911304"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:33.873375" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a0f7b50&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:40:33.872955" elapsed="0.000690"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:40:33.900946" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:40:33.910222" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/exa-md5.cfg' -&gt; '/home/jenkins//exa-md5.cfg'</msg>
<arg>${BGP_VAR_FOLDER}${/}exa-md5.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:40:33.874694" elapsed="0.035671"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:40:33.918567" level="INFO">1 file:
exa-md5.cfg</msg>
<msg time="2026-05-01T00:40:33.918746" level="INFO">@{cfgfiles} = [ exa-md5.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:40:33.910814" elapsed="0.007969"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:33.919650" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:33.931874" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:33.919377" elapsed="0.012630"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:33.932836" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:33.978065" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:33.932398" elapsed="0.045810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:33.978966" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:34.030035" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:33.978637" elapsed="0.051537"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.030915" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:34.082065" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:34.030593" elapsed="0.051626"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.083063" level="INFO">Executing command 'sed -i -e 's/PASSWORD/topsecret/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:34.137880" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/PASSWORD/${MD5_SAME_PASSWD}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:34.082654" elapsed="0.055356"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.138705" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:40:34.186059" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:34.186300" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:34.138372" elapsed="0.047986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.187704" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.186975" elapsed="0.000839"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:40:33.919157" elapsed="0.268734"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:40:33.918879" elapsed="0.269089"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:40:33.873972" elapsed="0.314138"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:25.593138" elapsed="8.595087"/>
</kw>
<test id="s1-s3-t1" name="Verify Exabgp Connected" line="43">
<kw name="Reconfigure_ODL_To_Accept_Connection" type="SETUP">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.192665" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | PASSWORD=topsecret | PASSIVE_MODE=true }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSWORD=${password}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.191147" elapsed="0.001584"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.229986" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.229603" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:34.230832" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:34.230543" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:34.231003" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:34.230186" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.231613" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:34.231192" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:34.231945" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:34.232118" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:34.231802" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.232566" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.232305" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.233596" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.233317" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.234063" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.233800" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.234791" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.234477" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.235851" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.235329" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.235933" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:40:34.236095" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.235010" elapsed="0.001110"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.236276" elapsed="0.000271"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:40:34.234324" elapsed="0.002265"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.237191" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.236841" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.238185" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.237744" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.238262" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:34.238414" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.237410" elapsed="0.001029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.238609" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:40:34.236706" elapsed="0.002167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.239421" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.239119" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.240606" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.240136" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.240683" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:34.240836" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.239669" elapsed="0.001192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.241012" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:40:34.238987" elapsed="0.002288"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.241852" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.241553" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.242826" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.242380" elapsed="0.000472"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.242901" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:34.243051" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.242063" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.243226" elapsed="0.000235"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:40:34.241388" elapsed="0.002115"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.244073" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.243775" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.245070" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.244634" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.245146" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:34.245297" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.244285" elapsed="0.001036"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.245537" elapsed="0.000225"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-05-01T00:40:34.243641" elapsed="0.002161"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.246359" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:34.246063" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:34.247336" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.246907" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:34.247412" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:34.247591" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:34.246587" elapsed="0.001029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.247766" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:40:34.245926" elapsed="0.002100"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:40:34.234141" elapsed="0.013919"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:34.248141" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:34.248303" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:34.232989" elapsed="0.015341"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.232687" elapsed="0.015679"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.248569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.248391" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.232664" elapsed="0.015984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.249486" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:34.248791" elapsed="0.000725"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:34.249566" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:34.228965" elapsed="0.020727"/>
</kw>
<msg time="2026-05-01T00:40:34.249747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:34.216680" elapsed="0.033115"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.264515" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.276710" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.288819" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.289053" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.289242" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.289689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.289528" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:34.289509" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.289926" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.290095" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.290258" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:34.289463" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:34.289324" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.290507" elapsed="0.000125"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:34.290699" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:40:34.290867" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:34.212397" elapsed="0.078499"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.316804" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.316396" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:34.317633" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:34.317330" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:34.317805" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:34.316997" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.318376" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:34.317993" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:34.318726" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:34.318904" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:34.318584" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.319333" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;$PASSWORD&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.319089" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:40:34.319787" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.319474" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.320310" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.320017" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.319871" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.319440" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.321270" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:34.320552" elapsed="0.000747"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:34.321349" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:34.315781" elapsed="0.005713"/>
</kw>
<msg time="2026-05-01T00:40:34.321589" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:34.303307" elapsed="0.018331"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.333876" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.345977" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.358079" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.358281" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.358471" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.358841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.358697" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:34.358683" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.359062" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.359229" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.359398" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:34.358653" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:34.358548" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.359649" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:34.359725" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:34.359857" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:34.300674" elapsed="0.059211"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:34.361235" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:34.360944" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:34.361396" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:34.360568" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.361810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.361557" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.362373" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.362073" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.361893" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.361537" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.364856" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:34.362630" elapsed="0.002253"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:40:34.364937" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:40:34.365093" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:34.360227" elapsed="0.004891"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.366544" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.366280" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.366984" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;topsecret&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.366747" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.367437" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.367191" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.367908" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.367669" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:34.368795" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:40:34.368583" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:40:34.369162" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:40:34.368981" elapsed="0.000206"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.369337" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.369966" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.369723" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:40:34.370050" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:34.370206" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:40:34.368162" elapsed="0.002068"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:34.395496" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '847', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;topsecret&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:40:34.395599" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:40:34 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:34.395717" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:34.372534" elapsed="0.023209"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.370300" elapsed="0.025491"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.395977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.395818" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.370283" elapsed="0.025785"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.399338" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.397030" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.396810" elapsed="0.002605"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.396792" elapsed="0.002649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.402022" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.399764" elapsed="0.002303"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.399537" elapsed="0.002564"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.399520" elapsed="0.002606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.402686" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:34.402290" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.403021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.402784" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.403604" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.403266" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.403103" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.402766" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.404224" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:34.403853" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.404568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.404320" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.405098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.404809" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.404650" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.404302" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:34.405330" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:34.406172" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:34.405851" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:34.406358" elapsed="0.002304"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:34.396439" elapsed="0.012286"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:34.408897" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:40:34.408792" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.408773" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.409134" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:40:34.409203" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:34.411422" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:40:34.365485" elapsed="0.045984"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:34.411572" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:34.411731" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:40:34.200832" elapsed="0.210924"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:34.412104" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:34.411855" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.411838" elapsed="0.000359"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:34.412231" elapsed="0.000027"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:40:34.193358" elapsed="0.218997"/>
</kw>
<arg>${MD5_SAME_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:40:34.189920" elapsed="0.222496"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.415734" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.415369" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.416176" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.415918" elapsed="0.000302"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.419741" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:34.416840" elapsed="0.002961"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.423903" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:34.423998" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:34.419971" elapsed="0.004053"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.424784" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.424339" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:34.424093" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:34.424074" elapsed="0.000818"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:40:34.416482" elapsed="0.008455"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:34.426940" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<msg time="2026-05-01T00:40:34.427027" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:34.425088" elapsed="0.001965"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.427494" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.427211" elapsed="0.000330"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:34.415053" elapsed="0.012542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.429478" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:34.429117" elapsed="0.000389"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.431621" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:34.429670" elapsed="0.001978"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:34.437341" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:34.437654" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:34.437750" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:34.431811" elapsed="0.005965"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.440309" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:34.437979" elapsed="0.002378"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:34.442972" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:34.440531" elapsed="0.002505">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:34.428664" elapsed="0.014487">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.446189" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.445179" elapsed="0.001082"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.451073" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.446708" elapsed="0.004429"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:37.461024" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:37.461569" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '611'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:40:37.461676" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:37.451535" elapsed="0.010169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.464269" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.461883" elapsed="0.002438"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:40:37.464497" elapsed="0.002611"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:40:37.443932" elapsed="0.023268"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:34.428140" elapsed="3.039144"/>
</kw>
<msg time="2026-05-01T00:40:37.467435" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:37.467518" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:34.427755" elapsed="3.039796"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.468076" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.467687" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.467655" elapsed="0.000532"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:40:37.468415" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-05-01T00:40:37.468264" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.468243" elapsed="0.000329"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:40:34.414873" elapsed="3.053737"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:40:34.414650" elapsed="3.054009"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.468875" elapsed="0.000031"/>
</kw>
<arg>${BGP_EXAMD5_CFG}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:40:34.412769" elapsed="3.056217"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.469878" level="INFO">[?2004l00:40:34 | 1866   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:34 | 1866   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:34 | 1866   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:40:34 | 1866   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:40:34 | 1866   | [01;34minstallation [0m | [1m        [0m
00:40:34 | 1866   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:40:34 | 1866   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:40:34 | 1866   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:40:34 | 1866   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:40:34 | 1866   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:40:34 | 1866   | configuration[0m | . local-as         | '64496'[0m
00:40:34 | 1866   | configuration[0m | . peer-as          | '64496'[0m
00:40:34 | 1866   | configuration[0m | . md5-password     | 'topsecret'[0m
00:40:34 | 1866   | configuration[0m | &gt; capability       | [0m
00:40:34 | 1866   | configuration[0m | . route-refresh    | 'disable'[0m
00:40:34 | 1866   | configuration[0m | . add-path         | 'disable'[0m
00:40:34 | 1866   | configuration[0m | &lt; capability       | [0m
00:40:34 | 1866   | configuration[0m | &gt; family           | [0m
00:40:34 | 1866   | configuration[0m | . ipv4             | 'unicast'[0m
00:40:34 | 1866   | configuration[0m | &lt; family           | [0m
00:40:34 | 1866   | configuration[0m | &lt; neighbor         | [0m
00:40:34 | 1866   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:40:34 | 1866   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:40:34 | 1866   | reactor      [0m | initialising connection to peer-1[0m
00:40:34 | 1866   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)][0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:40:34 | 1866   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:40:34 | 1866   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:40:34 | 1866   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; EOR ipv4 unicast[0m
00:40:34 | 1866   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:40:34 | 1866   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:40:34 | 1866   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:40:34 | 1866   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:40:35 | 1866   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:40:35 | 1866   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:40:36 | 1866   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:40:36 | 1866   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:40:37 | 1866   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:40:37 | 1866   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-05-01T00:40:37.470250" level="INFO">${output} = [?2004l00:40:34 | 1866   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:34 | 1866   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:34 | 1866   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:40:37.469699" elapsed="0.000594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.470892" level="INFO">[?2004l00:40:34 | 1866   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:34 | 1866   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:34 | 1866   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:40:34 | 1866   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:40:34 | 1866   | [01;34minstallation [0m | [1m        [0m
00:40:34 | 1866   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:40:34 | 1866   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:40:34 | 1866   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:40:34 | 1866   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:40:34 | 1866   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:40:34 | 1866   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:40:34 | 1866   | configuration[0m | . local-as         | '64496'[0m
00:40:34 | 1866   | configuration[0m | . peer-as          | '64496'[0m
00:40:34 | 1866   | configuration[0m | . md5-password     | 'topsecret'[0m
00:40:34 | 1866   | configuration[0m | &gt; capability       | [0m
00:40:34 | 1866   | configuration[0m | . route-refresh    | 'disable'[0m
00:40:34 | 1866   | configuration[0m | . add-path         | 'disable'[0m
00:40:34 | 1866   | configuration[0m | &lt; capability       | [0m
00:40:34 | 1866   | configuration[0m | &gt; family           | [0m
00:40:34 | 1866   | configuration[0m | . ipv4             | 'unicast'[0m
00:40:34 | 1866   | configuration[0m | &lt; family           | [0m
00:40:34 | 1866   | configuration[0m | &lt; neighbor         | [0m
00:40:34 | 1866   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:40:34 | 1866   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:40:34 | 1866   | reactor      [0m | initialising connection to peer-1[0m
00:40:34 | 1866   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)][0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:40:34 | 1866   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:40:34 | 1866   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:40:34 | 1866   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:40:34 | 1866   | outgoing-1   [0m | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00[0m
00:40:34 | 1866   | outgoing-1   [0m | &gt;&gt; EOR ipv4 unicast[0m
00:40:34 | 1866   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:40:34 | 1866   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:40:34 | 1866   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:40:34 | 1866   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:40:34 | 1866   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:40:34 | 1866   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:40:35 | 1866   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:40:35 | 1866   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:40:36 | 1866   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:40:36 | 1866   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:40:37 | 1866   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:40:37 | 1866   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.470539" elapsed="0.000554"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.472211" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.471780" elapsed="0.000470"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:37.472486" elapsed="0.000335"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:40:37.471375" elapsed="0.001540"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.607343" level="INFO">^C00:40:37 | 1866   | [00;31mreactor      [0m | [1m^C received[0m
00:40:37 | 1866   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:37 | 1866   | outgoing-1   [0m | stop, message [shutting down][0m
00:40:37 | 1866   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:37.607532" level="INFO">${output} = ^C00:40:37 | 1866   | [00;31mreactor      [0m | [1m^C received[0m
00:40:37 | 1866   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:37 | 1866   | outgoing-1   [0m | stop, messag...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:37.473130" elapsed="0.134435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.608296" level="INFO">^C00:40:37 | 1866   | [00;31mreactor      [0m | [1m^C received[0m
00:40:37 | 1866   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:37 | 1866   | outgoing-1   [0m | stop, message [shutting down][0m
00:40:37 | 1866   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.607745" elapsed="0.000607"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.610689" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:37.609015" elapsed="0.001729"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.611567" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:37.611650" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:37.610906" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.612252" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.612001" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.611747" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.611727" elapsed="0.000631"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:40:37.608639" elapsed="0.003767"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:40:37.469298" elapsed="0.143174"/>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.613486" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.157 }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.613004" elapsed="0.000513"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.654998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.654627" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.655821" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.655545" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:37.655987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:37.655190" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.656582" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.656175" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.656904" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:37.657058" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:37.656769" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.657494" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.657238" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.658659" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.658372" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.659127" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.658863" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.659829" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.659533" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.660807" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.660544" elapsed="0.000290"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.660888" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:40:37.661057" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.660042" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.661237" elapsed="0.000259"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:40:37.659381" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.662098" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.661786" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.662890" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.662678" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.662966" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:37.663119" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.662312" elapsed="0.000832"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.663296" elapsed="0.000235"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:40:37.661652" elapsed="0.001920"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:40:37.659206" elapsed="0.004401"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:37.663658" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:40:37.663815" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:37.657901" elapsed="0.005940"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.657606" elapsed="0.006266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.664046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.663897" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.657588" elapsed="0.006535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.664860" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.664265" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.664938" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:37.653974" elapsed="0.011089"/>
</kw>
<msg time="2026-05-01T00:40:37.665115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.641420" elapsed="0.023753"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.677421" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.689632" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.701682" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.701932" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.702114" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.702494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.702334" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:37.702320" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.702717" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.702885" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.703051" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:37.702291" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.702188" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.703274" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.703350" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:37.703487" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:37.637214" elapsed="0.066304"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.704642" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.704376" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:37.720181" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:37.720229" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:37.720333" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:37.706760" elapsed="0.013600"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.704754" elapsed="0.015646"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.720746" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.720426" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.704736" elapsed="0.016195"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.728957" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.723228" elapsed="0.005827"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.722748" elapsed="0.006386"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.722710" elapsed="0.006481"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.732486" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.729836" elapsed="0.002698"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.729315" elapsed="0.003255"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.729279" elapsed="0.003316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.733150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.732767" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.733497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.733248" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.734058" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.733742" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.733580" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.733230" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.734685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.734303" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.735017" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.734784" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.735573" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.735261" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.735098" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.734766" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.735809" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:37.736617" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.736320" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.736800" elapsed="0.002274"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:37.721750" elapsed="0.017387"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:37.739185" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:40:37.741396" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:40:37.703784" elapsed="0.037639"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.741490" elapsed="0.000028"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:40:37.613747" elapsed="0.127872"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:40:37.612695" elapsed="0.128982"/>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:34.188391" elapsed="3.553327"/>
</test>
<test id="s1-s3-t2" name="Verify Exabgp Not Connected" line="54">
<kw name="Reconfigure_ODL_To_Accept_Connection" type="SETUP">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.743644" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | PASSWORD=different | PASSIVE_MODE=true }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSWORD=${password}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.743008" elapsed="0.000665"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.776188" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.775815" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.776970" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.776735" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:37.777176" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:37.776378" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.777767" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.777365" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.778335" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:37.778542" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:37.778146" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.778997" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.778740" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.780038" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.779779" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.780521" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.780241" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.781200" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.780906" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.782217" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.781743" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.782294" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:37.782446" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.781413" elapsed="0.001085"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.782653" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:40:37.780773" elapsed="0.002148"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.783478" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.783166" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.784481" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.784026" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.784557" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:37.784801" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.783691" elapsed="0.001136"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.784978" elapsed="0.000221"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:40:37.783033" elapsed="0.002206"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.785799" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.785502" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.786830" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.786363" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.786905" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:37.787056" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.786038" elapsed="0.001042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.787236" elapsed="0.000251"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:40:37.785351" elapsed="0.002177"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.788237" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.787774" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.789249" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.788819" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.789324" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:37.789492" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.788502" elapsed="0.001015"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.789674" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:40:37.787642" elapsed="0.002304"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.790501" level="INFO">${value} = different</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.790192" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.791499" level="INFO">${encoded} = different</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.791034" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.791577" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:37.791729" level="INFO">${encoded_value} = different</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.790722" elapsed="0.001031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.791903" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">different</var>
<status status="PASS" start="2026-05-01T00:40:37.790060" elapsed="0.002103"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.792725" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.792413" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:37.793697" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.793249" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:37.793772" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:37.793933" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:37.792937" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.794109" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:40:37.792276" elapsed="0.002092"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:40:37.780599" elapsed="0.013804"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:37.794445" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:40:37.794626" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:37.779415" elapsed="0.015236"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.779119" elapsed="0.015564"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.794860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.794708" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.779100" elapsed="0.015835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.795753" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.795076" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.795830" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:37.775189" elapsed="0.020764"/>
</kw>
<msg time="2026-05-01T00:40:37.796007" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.762713" elapsed="0.033350"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.808361" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.820559" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.832654" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.832851" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.833026" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.833391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.833248" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:37.833234" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.833627" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.833793" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.833980" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:37.833205" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.833101" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.834220" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.834307" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:37.834432" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:37.758578" elapsed="0.075896"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.859862" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.859484" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.860611" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.860379" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:37.860769" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:37.860050" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.861371" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.860990" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.861716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:37.861877" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:37.861581" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.862308" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;$PASSWORD&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.862067" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:40:37.862746" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.862432" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.863264" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.862974" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.862829" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.862413" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.864242" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.863520" elapsed="0.000752"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.864321" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:37.858863" elapsed="0.005585"/>
</kw>
<msg time="2026-05-01T00:40:37.864522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.846690" elapsed="0.017879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.876708" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.888946" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.901016" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.901258" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.901437" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.901842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.901683" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:37.901668" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.902066" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.902233" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.902396" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:37.901638" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.901532" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.902637" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.902712" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:37.902852" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:37.844098" elapsed="0.058784"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:37.904146" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.903908" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:37.904301" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:37.903564" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.904659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.904395" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.905199" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.904912" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.904739" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.904377" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.907593" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.905430" elapsed="0.002190"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:40:37.907670" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:37.907824" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:37.903217" elapsed="0.004632"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.909224" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.908975" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.909675" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;different&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.909422" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.910188" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.909944" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.910637" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.910383" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:37.911495" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:40:37.911288" elapsed="0.000234"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:40:37.911846" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:40:37.911675" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.912020" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.912639" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.912374" elapsed="0.000309"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:40:37.912724" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:37.912878" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:40:37.910881" elapsed="0.002021"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:37.927760" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Content-Length': '847', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
        &lt;auth-password&gt;different&lt;/auth-password&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:40:37.927824" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:37.927916" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:37.915155" elapsed="0.012786"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.912972" elapsed="0.015013"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.928165" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.928011" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.912955" elapsed="0.015303"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.935400" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.930138" elapsed="0.005390"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.929588" elapsed="0.006017"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.929547" elapsed="0.006113"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.939792" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.936275" elapsed="0.003563"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.935786" elapsed="0.004085"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.935750" elapsed="0.004146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.940491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.940058" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.940829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.940594" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.941369" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.941070" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.940910" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.940576" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.942032" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.941661" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.942363" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.942131" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.942909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.942621" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.942442" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.942113" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.943138" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:37.943955" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:37.943680" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:37.944132" elapsed="0.002283"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:37.928778" elapsed="0.017716"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:37.946800" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:40:37.946563" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.946545" elapsed="0.000342"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.947035" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:40:37.947103" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:37.949308" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:40:37.908176" elapsed="0.041159"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.949399" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:40:37.949572" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:40:37.748138" elapsed="0.201460"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:37.949982" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:37.949695" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.949679" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:37.950109" elapsed="0.000026"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:40:37.743941" elapsed="0.206291"/>
</kw>
<arg>${MD5_DIFF_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:40:37.742668" elapsed="0.207624"/>
</kw>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.951206" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.950882" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.951649" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.951387" elapsed="0.000306"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.954163" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:37.952301" elapsed="0.001919"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.958575" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:37.958725" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:37.954380" elapsed="0.004372"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.959309" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.959066" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:37.958822" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:37.958803" elapsed="0.000609"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:40:37.951936" elapsed="0.007536"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:37.961080" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<msg time="2026-05-01T00:40:37.961166" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:37.959629" elapsed="0.001562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.961609" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.961347" elapsed="0.000307"/>
</kw>
<arg>${BGP_EXAMD5_CFG}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.950558" elapsed="0.011150"/>
</kw>
<kw name="Verify_Keyword_Never_Passes_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.966298" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:37.965944" elapsed="0.000381"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.968379" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:37.966508" elapsed="0.001898"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:37.973862" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:37.974005" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:37.974108" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:37.968589" elapsed="0.005544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.976607" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:37.974300" elapsed="0.002354"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:37.979255" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.976811" elapsed="0.002511">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:37.965555" elapsed="0.013878">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:39.982709" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:39.981778" elapsed="0.001000"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:39.988055" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:39.983173" elapsed="0.004958"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:39.996310" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:39.996470" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:39.996574" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:39.988607" elapsed="0.007993"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:39.999195" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:39.996872" elapsed="0.002372"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:40.002013" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:39.999401" elapsed="0.002708">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:39.980626" elapsed="0.021637">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:42.005285" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:42.004361" elapsed="0.000997"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:42.010794" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:42.005779" elapsed="0.005079"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:42.018595" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:42.018730" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:42.018836" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:42.011232" elapsed="0.007631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:42.021375" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:42.019034" elapsed="0.002389"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:42.024060" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:42.021598" elapsed="0.002532">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:42.003255" elapsed="0.020988">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:44.027253" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:44.026295" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:44.032082" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:44.027754" elapsed="0.004391"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:44.040972" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:44.041120" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:44.041216" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:44.032547" elapsed="0.008694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:44.043799" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:44.041416" elapsed="0.002431"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:44.046445" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:44.044005" elapsed="0.002529">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:44.025228" elapsed="0.021424">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:46.049852" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:46.048930" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:46.054757" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:46.050340" elapsed="0.004480"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:46.063819" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:46.063957" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:46.064052" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:46.055188" elapsed="0.008890"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:46.066589" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:46.064250" elapsed="0.002388"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:46.069411" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:46.066797" elapsed="0.002699">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:46.047830" elapsed="0.021778">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:48.072757" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:48.071744" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:48.078004" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:48.073288" elapsed="0.004756"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:48.085064" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:48.085265" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:48.085408" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:48.078280" elapsed="0.007165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:48.089241" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:48.085735" elapsed="0.003578"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:48.093262" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:48.089566" elapsed="0.003803">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:48.070625" elapsed="0.022937">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:50.096507" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:50.095572" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:50.101218" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:50.096967" elapsed="0.004293"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:50.109200" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:50.109545" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:50.109717" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:50.101528" elapsed="0.008228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:50.113758" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:50.110057" elapsed="0.003773"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:50.117965" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:50.114088" elapsed="0.003986">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:50.094550" elapsed="0.023703">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:52.121185" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:52.120277" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:52.126425" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:52.121668" elapsed="0.004845"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:52.135679" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:52.135863" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:52.136009" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:52.126888" elapsed="0.009157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:52.139581" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:52.136281" elapsed="0.003368"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:52.143290" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:52.139869" elapsed="0.003515">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:52.119218" elapsed="0.024339">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.146679" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.145745" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.151426" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:54.147131" elapsed="0.004383"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:54.160671" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:54.160813" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:54.160909" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:54.151879" elapsed="0.009055"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.163470" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.161104" elapsed="0.002509"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.166239" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:40:54.163772" elapsed="0.002541">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:40:54.144688" elapsed="0.021741">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:40:54.166540" level="FAIL">Keyword 'ExaBgpLib.Verify_ExaBgps_Connection' failed after retrying for 15 seconds. The last error was: 200.0 != 409.0</msg>
<arg>15s</arg>
<arg>2s</arg>
<arg>ExaBgpLib.Verify_ExaBgps_Connection</arg>
<arg>session</arg>
<arg>10.30.170.157</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:40:37.965008" elapsed="16.201634">Keyword 'ExaBgpLib.Verify_ExaBgps_Connection' failed after retrying for 15 seconds. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:40:54.166759" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:40:54.166804" level="INFO">${output} = Keyword 'ExaBgpLib.Verify_ExaBgps_Connection' failed after retrying for 15 seconds. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:37.964611" elapsed="16.202218"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:40:54.167046" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:40:54.166916" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.166891" elapsed="0.000279"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.167381" elapsed="0.000030"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.167641" elapsed="0.000030"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T00:40:37.964192" elapsed="16.203615"/>
</kw>
<msg time="2026-05-01T00:40:54.167879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:37.962318" elapsed="16.205625"/>
</kw>
<arg>15s</arg>
<arg>2s</arg>
<arg>ExaBgpLib.Verify_ExaBgps_Connection</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Some negative checks report false failure for a short time. This keyword verifies no pass does happen within timeout period.</doc>
<status status="PASS" start="2026-05-01T00:40:37.961918" elapsed="16.206142"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.168966" level="INFO">[?2004l00:40:38 | 1871   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:38 | 1871   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:38 | 1871   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:40:38 | 1871   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:40:38 | 1871   | [01;34minstallation [0m | [1m        [0m
00:40:38 | 1871   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:40:38 | 1871   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:40:38 | 1871   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:40:38 | 1871   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:40:38 | 1871   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:40:38 | 1871   | configuration[0m | . local-as         | '64496'[0m
00:40:38 | 1871   | configuration[0m | . peer-as          | '64496'[0m
00:40:38 | 1871   | configuration[0m | . md5-password     | 'topsecret'[0m
00:40:38 | 1871   | configuration[0m | &gt; capability       | [0m
00:40:38 | 1871   | configuration[0m | . route-refresh    | 'disable'[0m
00:40:38 | 1871   | configuration[0m | . add-path         | 'disable'[0m
00:40:38 | 1871   | configuration[0m | &lt; capability       | [0m
00:40:38 | 1871   | configuration[0m | &gt; family           | [0m
00:40:38 | 1871   | configuration[0m | . ipv4             | 'unicast'[0m
00:40:38 | 1871   | configuration[0m | &lt; family           | [0m
00:40:38 | 1871   | configuration[0m | &lt; neighbor         | [0m
00:40:38 | 1871   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:40:38 | 1871   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:40:38 | 1871   | reactor      [0m | initialising connection to peer-1[0m
00:40:38 | 1871   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m</msg>
<msg time="2026-05-01T00:40:54.169166" level="INFO">${output} = [?2004l00:40:38 | 1871   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:38 | 1871   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:38 | 1871   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:40:54.168799" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.169788" level="INFO">[?2004l00:40:38 | 1871   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:40:38 | 1871   | [01;34mversion      [0m | [1m4.2.17  [0m
00:40:38 | 1871   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:40:38 | 1871   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:40:38 | 1871   | [01;34minstallation [0m | [1m        [0m
00:40:38 | 1871   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:40:38 | 1871   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:40:38 | 1871   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:40:38 | 1871   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:40:38 | 1871   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:40:38 | 1871   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:40:38 | 1871   | configuration[0m | . local-as         | '64496'[0m
00:40:38 | 1871   | configuration[0m | . peer-as          | '64496'[0m
00:40:38 | 1871   | configuration[0m | . md5-password     | 'topsecret'[0m
00:40:38 | 1871   | configuration[0m | &gt; capability       | [0m
00:40:38 | 1871   | configuration[0m | . route-refresh    | 'disable'[0m
00:40:38 | 1871   | configuration[0m | . add-path         | 'disable'[0m
00:40:38 | 1871   | configuration[0m | &lt; capability       | [0m
00:40:38 | 1871   | configuration[0m | &gt; family           | [0m
00:40:38 | 1871   | configuration[0m | . ipv4             | 'unicast'[0m
00:40:38 | 1871   | configuration[0m | &lt; family           | [0m
00:40:38 | 1871   | configuration[0m | &lt; neighbor         | [0m
00:40:38 | 1871   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:40:38 | 1871   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:40:38 | 1871   | reactor      [0m | initialising connection to peer-1[0m
00:40:38 | 1871   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.169422" elapsed="0.000573"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.171165" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:54.170731" elapsed="0.000473"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:54.171417" elapsed="0.000367"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:40:54.170326" elapsed="0.001542"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.299635" level="INFO">^C00:40:54 | 1871   | [00;31mreactor      [0m | [1m^C received[0m
00:40:54 | 1871   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:54 | 1871   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
00:40:54 | 1871   | [01;33moutgoing-1   [0m | [1mconnection to 10.30.170.185 closed[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:54.299743" level="INFO">${output} = ^C00:40:54 | 1871   | [00;31mreactor      [0m | [1m^C received[0m
00:40:54 | 1871   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:54 | 1871   | [01;33moutgoing-1   [0m | [1m...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:54.172098" elapsed="0.127675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.300187" level="INFO">^C00:40:54 | 1871   | [00;31mreactor      [0m | [1m^C received[0m
00:40:54 | 1871   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:40:54 | 1871   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
00:40:54 | 1871   | [01;33moutgoing-1   [0m | [1mconnection to 10.30.170.185 closed[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.299935" elapsed="0.000307"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.302604" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:54.300880" elapsed="0.001860"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.304594" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:40:54.304783" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:40:54.303106" elapsed="0.001735"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.306149" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.305570" elapsed="0.000683"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.304989" elapsed="0.001338"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.304949" elapsed="0.001433"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:40:54.300517" elapsed="0.005995"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:40:54.168391" elapsed="0.138236"/>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.309263" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.157 }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.307791" elapsed="0.001534"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.355827" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.355438" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:54.356631" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:54.356349" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:54.356785" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:54.356017" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.357352" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:54.356971" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:54.357690" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:54.357837" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:54.357554" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.358302" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.358051" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.359384" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.359129" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.359860" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.359602" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.360558" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:54.360246" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:54.361351" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.361131" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:54.361428" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:40:54.361600" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:54.360778" elapsed="0.000847"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.361782" elapsed="0.000251"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:40:54.360110" elapsed="0.001964"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.362639" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:54.362325" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:54.363576" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.363350" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:54.363652" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:54.363806" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:54.362853" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.363983" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:40:54.362189" elapsed="0.002063"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:40:54.359937" elapsed="0.004350"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:54.364330" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:40:54.364504" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:54.358775" elapsed="0.005756"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.358473" elapsed="0.006090"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.364741" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.364588" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.358439" elapsed="0.006379"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.365559" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:54.364962" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:54.365636" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:54.354801" elapsed="0.010962"/>
</kw>
<msg time="2026-05-01T00:40:54.365816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.342403" elapsed="0.023473"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.378019" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.390168" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.402251" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.402445" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.402637" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.403012" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.402859" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:54.402844" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.403242" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.403412" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.403598" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:54.402815" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.402712" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.403826" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.403902" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:54.404025" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:54.338158" elapsed="0.065894"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.405183" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.404934" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:54.422667" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0wzbg9c2rj0tupk63baiphwzy3.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:54.422776" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:54.423002" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:54.407343" elapsed="0.015718"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.405297" elapsed="0.017860"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.423686" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.423294" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.405280" elapsed="0.018597"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.431609" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.426228" elapsed="0.005426"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.425709" elapsed="0.005981"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.425670" elapsed="0.006046"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.434259" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.431995" elapsed="0.002311"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.431771" elapsed="0.002570"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.431755" elapsed="0.002612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.434935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:54.434554" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.435270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.435033" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.435828" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.435530" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.435351" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.435016" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.436430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:54.436072" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.436777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.436545" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.437311" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.437018" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.436857" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.436526" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.437563" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:54.438375" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:54.438097" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.438601" elapsed="0.002291"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:54.424709" elapsed="0.016247"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:54.441002" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:54.443300" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:40:54.404319" elapsed="0.039009"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:54.443382" elapsed="0.000028"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:40:54.309853" elapsed="0.133673"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:40:54.307084" elapsed="0.136503"/>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:37.742185" elapsed="16.701443"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.449643" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.449300" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.451118" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:40:54.484176" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:54.484535" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:40:54.484638" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:40:54.484728" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:54.450935" elapsed="0.033844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.486668" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:40:54.486017" elapsed="0.000754"/>
</kw>
<msg time="2026-05-01T00:40:54.486980" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:40:54.487076" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:54.485179" elapsed="0.001950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.488447" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:54.487535" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.491193" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.490293" elapsed="0.000998"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.492211" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.491675" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.493203" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.492675" elapsed="0.000623"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:54.489497" elapsed="0.003924"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:54.488714" elapsed="0.004820"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.488672" elapsed="0.004920"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.493942" elapsed="0.000076"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:54.493719" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.493682" elapsed="0.000454"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:54.494479" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-05-01T00:40:54.494252" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.494218" elapsed="0.000457"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.494999" elapsed="0.000047"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:54.450363" elapsed="0.044830"/>
</kw>
<msg time="2026-05-01T00:40:54.495243" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.449833" elapsed="0.045468"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:40:54.448697" elapsed="0.046678"/>
</kw>
<msg time="2026-05-01T00:40:54.495423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.445029" elapsed="0.050462"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:40:54.444680" elapsed="0.050887"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:40:54.444432" elapsed="0.051184"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:40:54.495761" elapsed="0.000356"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:54.496346" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:40:54.496273" elapsed="0.000170"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="PASS" start="2026-05-01T00:40:54.444173" elapsed="0.052344"/>
</kw>
<doc>Functional test suite for bgp - n-path and all-path selection

Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests tcpmd5 connection of bgp peers. It uses odl and exabgp as bgp
peer. No routes are advertized, simple peer presence in the datastore is tested.
are configured via application peer.</doc>
<status status="PASS" start="2026-05-01T00:40:25.389483" elapsed="29.107064"/>
</suite>
<suite id="s1-s4" name="Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.582000" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:54.577761" elapsed="0.004290"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:40:54.577539" elapsed="0.004586"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.586805" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:40:54.583212" elapsed="0.003621"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:40:54.587020" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:54.586913" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.586892" elapsed="0.000194"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.587605" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:54.587240" elapsed="0.000408"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.588117" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:40:54.587811" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:40:54.588656" elapsed="0.000277"/>
</kw>
<msg time="2026-05-01T00:40:54.589029" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:54.589075" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:54.588307" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.589647" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:54.589266" elapsed="0.000407"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.590680" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:54.590401" elapsed="0.000306"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.591117" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:54.590857" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.591602" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.591301" elapsed="0.000327"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.594804" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.595513" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.595173" elapsed="0.000366"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.595693" elapsed="0.000226"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.596726" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.596411" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:40:54.596799" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:40:54.596955" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:40:54.596116" elapsed="0.000864"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:54.597573" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19fa9290&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:40:54.597135" elapsed="0.000565"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.597869" elapsed="0.000223"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:40:54.594227" elapsed="0.003926"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:54.594036" elapsed="0.004161"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:40:54.591680" elapsed="0.006548"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.598814" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:54.598397" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.599417" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:54.599021" elapsed="0.000453"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.600074" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:40:54.599686" elapsed="0.000431"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:40:54.589947" elapsed="0.010227"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:40:54.582860" elapsed="0.017369"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.600406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:54.600294" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.600276" elapsed="0.000214"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.603547" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:54.603147" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.604027" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:54.603735" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:54.604098" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:40:54.604258" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:54.602819" elapsed="0.001463"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:54.605287" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.605019" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.606174" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:54.606275" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:54.606010" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:54.610801" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:54.610216" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.610196" elapsed="0.000730"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.611582" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:54.611816" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:54.611127" elapsed="0.000740"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.612823" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.612148" elapsed="0.000781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.614125" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.613200" elapsed="0.000978"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.615882" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:40:54.616056" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:40:54.615531" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.616438" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.618065" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:40:54.969123" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:40:25 UTC 2026

  System load:  0.2                Processes:             130
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:40:26 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:40:54.617722" elapsed="0.351573"/>
</kw>
<msg time="2026-05-01T00:40:54.969364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.617260" elapsed="0.352253"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:40:54.614635" elapsed="0.355021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:54.970498" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:40:54.983294" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:40:54.983554" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:40:54.983706" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:54.970015" elapsed="0.013759"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:54.984239" elapsed="0.001125"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:54.988017" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:54.986775" elapsed="0.001482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.989191" elapsed="0.000112"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:54.988657" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.988606" elapsed="0.001042"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:40:54.990348" elapsed="0.000169"/>
</return>
<status status="PASS" start="2026-05-01T00:40:54.989854" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:54.989814" elapsed="0.000979"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:40:54.990926" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.996054" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:54.996816" elapsed="0.000288"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:54.997369" elapsed="0.000302"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:54.992022" elapsed="0.005732"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:40:54.609245" elapsed="0.388688"/>
</kw>
<msg time="2026-05-01T00:40:54.997988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.608619" elapsed="0.389422"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:40:54.606975" elapsed="0.391145"/>
</kw>
<msg time="2026-05-01T00:40:54.998161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:54.606471" elapsed="0.391735"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.000815" elapsed="0.000311"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.001290" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.001629" elapsed="0.000119"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:54.998516" elapsed="0.003293"/>
</kw>
<msg time="2026-05-01T00:40:55.001900" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:40:54.605542" elapsed="0.396384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.002361" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.002107" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:40:55.002446" elapsed="0.000046"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:40:54.604657" elapsed="0.397932"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:54.604477" elapsed="0.398186"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:54.604334" elapsed="0.398367"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:40:54.600710" elapsed="0.402047"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:40:55.002913" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.016508" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.016384" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.016364" elapsed="0.000215"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.016875" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:55.016988" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.016734" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.017425" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.017168" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.017933" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.017644" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:55.018731" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:40:55.018510" elapsed="0.000327">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:40:55.018943" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:40:55.018988" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.018137" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.019318" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:55.019086" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.019068" elapsed="0.000350"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:55.020179" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.019913" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:40:55.020252" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:55.020402" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:40:55.019637" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.020599" elapsed="0.000399"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.021279" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:40:55.021377" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.021170" elapsed="0.000233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.021568" elapsed="0.002307"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.024298" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:40:55.281407" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.024039" elapsed="0.257583"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.285340" elapsed="0.000445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.285992" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.286332" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:55.283005" elapsed="0.003511"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:55.282217" elapsed="0.004346"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.016086" elapsed="0.270532"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:55.003856" elapsed="0.282812"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.003482" elapsed="0.283240"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:55.003325" elapsed="0.283440"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:40:55.003179" elapsed="0.283627"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:40:54.582408" elapsed="0.704461"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.289521" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.289386" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.289362" elapsed="0.000257"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.294406" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.294298" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.294280" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.295464" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:55.295061" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.295952" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:55.295655" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:55.296021" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:40:55.296187" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:55.294725" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.301790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.301681" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.301663" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.303071" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.302944" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.302926" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:55.303633" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.303287" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.304048" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:55.303818" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.368550" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:55.304745" elapsed="0.063941"/>
</kw>
<msg time="2026-05-01T00:40:55.368819" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:55.368865" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.304231" elapsed="0.064670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.448100" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "b "a "s "i "c ". "r "[78Co "[A[78Cb
 "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:55.369702" elapsed="0.078545"/>
</kw>
<msg time="2026-05-01T00:40:55.448375" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:55.448421" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.369126" elapsed="0.079347"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.448807" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:55.448554" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.448534" elapsed="0.000449"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.449533" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "b "a "s "i "c ". "r "[78Co "[A[78Cb
 "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.449131" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.449929" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:55.449687" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.449668" elapsed="0.000436"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:55.450138" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.452092" elapsed="0.000595"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.453033" elapsed="0.000290"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:40:55.453717" elapsed="0.000247"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:55.451291" elapsed="0.002764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:55.450408" elapsed="0.003781"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:55.302657" elapsed="0.151632"/>
</kw>
<msg time="2026-05-01T00:40:55.454380" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:55.454424" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.302014" elapsed="0.152461"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:40:55.454661" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:40:55.454554" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.454535" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.455155" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.455634" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.455707" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:40:55.301362" elapsed="0.154454"/>
</kw>
<msg time="2026-05-01T00:40:55.455908" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:55.455952" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.296616" elapsed="0.159373"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.456314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:55.456063" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.456046" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:55.296469" elapsed="0.160106"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:55.296272" elapsed="0.160339"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:40:55.294002" elapsed="0.162664"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:40:55.287497" elapsed="0.169222"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.287031" elapsed="0.169729"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:40:54.577216" elapsed="0.879594"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-01T00:40:55.456962" elapsed="0.000179"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:40:55.457295" elapsed="0.000191"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.459183" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:40:55.459260" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:40:55.458896" elapsed="0.000388"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.459443" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.460902" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:40:55.779674" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:40:27 UTC 2026

  System load:  0.02               Processes:             117
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:40:27 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:40:55.460576" elapsed="0.319193"/>
</kw>
<msg time="2026-05-01T00:40:55.779832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.460142" elapsed="0.319752"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:40:55.458442" elapsed="0.321539"/>
</kw>
<msg time="2026-05-01T00:40:55.780030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:55.458048" elapsed="0.322025"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:40:55.457710" elapsed="0.322436"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.781425" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-05-01T00:40:55.793133" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:40:55.793357" level="INFO">${stdout} = usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_ins...</msg>
<msg time="2026-05-01T00:40:55.793443" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:40:55.793554" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:55.781198" elapsed="0.012401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.794725" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:40:55.794431" elapsed="0.000339"/>
</kw>
<msg time="2026-05-01T00:40:55.794863" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:40:55.794906" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.793934" elapsed="0.000994"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.795682" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:55.795096" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.796133" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:55.795790" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.795768" elapsed="0.000505"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:40:55.796432" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-05-01T00:40:55.796333" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.796317" elapsed="0.000222"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.796632" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.796596" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:55.796581" elapsed="0.000113"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.796838" elapsed="0.000021"/>
</kw>
<msg time="2026-05-01T00:40:55.796984" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>python3 --help</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:55.780857" elapsed="0.016152"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:40:55.797165" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:40:55.797076" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.797060" elapsed="0.000184"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.797400" elapsed="0.000022"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:55.780436" elapsed="0.017059"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.798732" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:40:55.943581" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:40:55.943835" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:40:55.943931" level="INFO">${stderr} = Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'</msg>
<msg time="2026-05-01T00:40:55.944026" level="INFO">${rc} = 1</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:40:55.798553" elapsed="0.145524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.945934" level="INFO">Length is 119.</msg>
<msg time="2026-05-01T00:40:55.946111" level="FAIL">'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:40:55.945306" elapsed="0.000955">'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</status>
</kw>
<msg time="2026-05-01T00:40:55.946528" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:40:55.946628" level="INFO">${result} = 'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:55.944522" elapsed="0.002162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.948024" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:55.947062" elapsed="0.001021"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.950446" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.949901" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.951499" level="INFO">Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.950940" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:55.952489" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:55.951939" elapsed="0.000648"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:40:55.949045" elapsed="0.003660"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:55.948255" elapsed="0.004528"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.948215" elapsed="0.004624"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:40:55.953180" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:40:55.952961" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.952925" elapsed="0.000494"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:40:55.953653" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.953575" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:55.953539" elapsed="0.000251"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:55.954103" elapsed="0.000047"/>
</kw>
<msg time="2026-05-01T00:40:55.954302" level="INFO">${passed} = False</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:40:55.798167" elapsed="0.156159"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-05-01T00:40:55.954500" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:55.954395" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:55.954378" elapsed="0.000219"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:40:55.988663" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:40:56.003161" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py' -&gt; '/home/jenkins/.//ipaddr.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:40:55.954747" elapsed="0.048497"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:40:55.797747" elapsed="0.205587"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.014353" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:40:56.003586" elapsed="0.010851"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:56.015106" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19f66b10&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:40:56.014704" elapsed="0.000636"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.018661" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.018504" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.018476" elapsed="0.000283"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.019274" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.018965" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.019801" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.019552" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.034771" level="INFO">log:set INFO</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.020556" elapsed="0.014275"/>
</kw>
<msg time="2026-05-01T00:40:56.034935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.034979" level="INFO">${message_write} = log:set INFO
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.020065" elapsed="0.014938"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.043538" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.035533" elapsed="0.008063"/>
</kw>
<msg time="2026-05-01T00:40:56.043692" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.043735" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.035174" elapsed="0.008587"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.044065" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.043836" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.043817" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.044553" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.044286" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.044879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.044667" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.044649" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.044988" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.046734" elapsed="0.000307"/>
</kw>
<msg time="2026-05-01T00:40:56.047085" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.046126" elapsed="0.001018"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.047305" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.047495" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.045814" elapsed="0.001764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.045293" elapsed="0.002330"/>
</kw>
<arg>log:set ${ODL_LOG_LEVEL}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.015871" elapsed="0.031885"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.049976" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.049868" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.049851" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.050403" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.050189" elapsed="0.000239"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.050765" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.050600" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.107783" level="INFO">log:set DEFAULT org.opendaylight.bgpcep</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.051276" elapsed="0.056569"/>
</kw>
<msg time="2026-05-01T00:40:56.107946" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.107990" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.bgpcep
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.050947" elapsed="0.057067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.110151" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.108550" elapsed="0.001660"/>
</kw>
<msg time="2026-05-01T00:40:56.110304" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.110348" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.108188" elapsed="0.002186"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.110684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.110463" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.110430" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.111154" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.110906" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.111499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.111272" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.111254" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.111609" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.113173" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:40:56.113368" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.112686" elapsed="0.000740"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.113602" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.113763" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.112358" elapsed="0.001490"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.111863" elapsed="0.002030"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.bgpcep</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.048101" elapsed="0.065885"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.116182" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.116075" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.116057" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.116631" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.116399" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.116976" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.116812" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.174546" level="INFO">log:set DEFAULT org.opendaylight.protocol</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.117580" elapsed="0.057027"/>
</kw>
<msg time="2026-05-01T00:40:56.174707" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.174751" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.protocol
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.117225" elapsed="0.057550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.176836" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.175285" elapsed="0.001608"/>
</kw>
<msg time="2026-05-01T00:40:56.176989" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.177032" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.174947" elapsed="0.002111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.177382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.177134" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.177115" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.177874" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.177627" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.178198" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.177987" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.177970" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.178307" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.180052" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:40:56.180234" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.179563" elapsed="0.000730"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.180448" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.180628" elapsed="0.000019"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.179077" elapsed="0.001630"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.178580" elapsed="0.002172"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.protocol</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.114329" elapsed="0.066516"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
put Python tool to mininet machine, setup imported resources.</doc>
<status status="PASS" start="2026-05-01T00:40:54.576927" elapsed="1.603973"/>
</kw>
<test id="s1-s4-t1" name="Check_For_Empty_Topology_Before_Talking" line="76">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.184142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.183927" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.183910" elapsed="0.000312"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:40:56.183746" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.185268" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.185141" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.185124" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.190256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.190149" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.190132" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.191326" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.190949" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.191821" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:56.191527" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:56.191929" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.192085" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.190574" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.197610" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.197499" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.197479" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.198847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.198742" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.198725" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.199355" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.199061" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.199769" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.199557" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.250215" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.200282" elapsed="0.050038"/>
</kw>
<msg time="2026-05-01T00:40:56.250502" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.250549" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.199952" elapsed="0.050632"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.308268" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "B "e "f "o "r "e "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.251105" elapsed="0.057270"/>
</kw>
<msg time="2026-05-01T00:40:56.308554" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.308599" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "B "e "f "o ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.250756" elapsed="0.057879"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.308934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.308712" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.308692" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.309507" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "B "e "f "o "r "e "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.309180" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.309857" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.309643" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.309625" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.309980" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.312522" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:40:56.312729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.311400" elapsed="0.001458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.313145" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.313507" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.310789" elapsed="0.002907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.310241" elapsed="0.003522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.198419" elapsed="0.115476"/>
</kw>
<msg time="2026-05-01T00:40:56.313986" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.314029" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "B "e "f "o ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.197834" elapsed="0.116233"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:40:56.314249" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.314142" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.314124" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.314753" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.315097" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.315168" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:40:56.197124" elapsed="0.118153"/>
</kw>
<msg time="2026-05-01T00:40:56.315368" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.315411" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "B "e "f "o ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.192516" elapsed="0.122931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.315786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.315538" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.315521" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:56.192355" elapsed="0.123530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:56.192172" elapsed="0.123744"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:40:56.189793" elapsed="0.126177"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.184861" elapsed="0.131169"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.184415" elapsed="0.131659"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.181632" elapsed="0.134494"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.366714" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.366324" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.367619" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.367237" elapsed="0.000451">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.367782" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.366905" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.368349" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.367969" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.368692" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:56.368839" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:56.368554" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.369320" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.369075" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.370568" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.370108" elapsed="0.000521"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.371146" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.370792" elapsed="0.000380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.371597" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.372318" elapsed="0.000049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.372675" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:40:56.371381" elapsed="0.001457"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.371221" elapsed="0.001681"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:56.372948" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:40:56.373125" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:56.369752" elapsed="0.003398"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.369433" elapsed="0.003749"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.373362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.373207" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.369414" elapsed="0.004024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.374047" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.373600" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.374123" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.365707" elapsed="0.008540"/>
</kw>
<msg time="2026-05-01T00:40:56.374299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.353488" elapsed="0.020858"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.386651" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.398797" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.410770" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.410975" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.411203" elapsed="0.000027"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.411610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.411445" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:56.411429" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.411838" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.412008" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.412175" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:56.411393" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.411285" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.412412" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.412504" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:56.412638" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:56.349333" elapsed="0.063331"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.414013" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.413730" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.414170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.413350" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.414532" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.414270" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.415069" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.414780" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.414614" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.414251" elapsed="0.000899"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.417466" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.415325" elapsed="0.002169"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:40:56.417545" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:40:56.417700" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:56.412994" elapsed="0.004730"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.418951" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.418710" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.419106" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.418358" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:40:56.419351" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.419199" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.419181" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.419599" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.419772" elapsed="0.000060"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.419886" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:56.421891" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:56.418039" elapsed="0.003879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.423300" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.423054" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.423753" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.423513" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:56.435111" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:56.435492" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:40:56 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:40:56.435756" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:56.426055" elapsed="0.009739"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.423862" elapsed="0.011993"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.436110" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.435892" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.423844" elapsed="0.012448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.441179" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.437803" elapsed="0.003442"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.437471" elapsed="0.003822"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.437426" elapsed="0.003902"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.444860" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.441747" elapsed="0.003176"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.441410" elapsed="0.003560"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.441387" elapsed="0.003619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.445841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.445272" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.446331" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.445977" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.446911" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.446608" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.446431" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.445952" elapsed="0.001041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.447533" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.447153" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.447861" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.447629" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.448396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.448101" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.447941" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.447611" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.448644" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:56.449508" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.449198" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.449692" elapsed="0.002243"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:56.436845" elapsed="0.015153"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.452172" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.452067" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.452049" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:56.455016" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.452391" elapsed="0.002654"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:40:56.455096" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.455256" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:40:56.422236" elapsed="0.033046"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.455344" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:40:56.455509" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:40:56.327521" elapsed="0.128014"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.484883" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.484136" elapsed="0.000776"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.487052" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.486531" elapsed="0.000671">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.487334" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.485094" elapsed="0.002265"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.488290" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.487544" elapsed="0.000774"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.488744" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:56.488985" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:56.488508" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.489645" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.489192" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:40:56.490365" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.489778" elapsed="0.000764"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.491350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.490748" elapsed="0.000676"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.490570" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.489758" elapsed="0.001792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.492449" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.491701" elapsed="0.000806"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.492557" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.483423" elapsed="0.009262"/>
</kw>
<msg time="2026-05-01T00:40:56.492738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.471060" elapsed="0.021726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.505071" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.517207" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.529390" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.529606" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.529781" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.530151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.530007" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:56.529993" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.530533" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.530714" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.530883" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:56.529963" elapsed="0.000973"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.529858" elapsed="0.001106"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.531112" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.531188" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:56.531306" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:56.468445" elapsed="0.062921"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.531564" elapsed="0.002367"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:56.535013" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.534690" elapsed="0.000352"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:40:56.535531" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.535197" elapsed="0.000363"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:40:56.535720" elapsed="0.000364"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:40:56.534262" elapsed="0.001884"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.534015" elapsed="0.002165"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.536387" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.536205" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.533995" elapsed="0.002492"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:40:56.456729" elapsed="0.079809"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:40:56.455858" elapsed="0.080755"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.455618" elapsed="0.081041"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.455601" elapsed="0.081081"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.536716" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:40:56.321396" elapsed="0.215446"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.317172" elapsed="0.219729"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:56.316653" elapsed="0.220292"/>
</kw>
<arg>empty_topology</arg>
<arg>timeout=180s</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.316266" elapsed="0.220745"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:40:56.537623" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:40:56.537298" elapsed="0.000628"/>
</kw>
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:56.180985" elapsed="0.356979"/>
</test>
<test id="s1-s4-t2" name="TC_LA_Reconfigure_Odl_To_Initiate_Connection" line="81">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.541410" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.541188" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.541170" elapsed="0.000337"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:40:56.540973" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.542536" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.542413" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.542396" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.547430" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.547288" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.547271" elapsed="0.000247"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.548514" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.548119" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.549010" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:56.548702" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:56.549081" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.549238" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.547745" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.554821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.554713" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.554695" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.556046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.555940" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.555922" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.556572" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.556261" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.556993" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.556757" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.596838" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.557563" elapsed="0.039379"/>
</kw>
<msg time="2026-05-01T00:40:56.597115" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.597161" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.557207" elapsed="0.039991"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.625422" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "I "n "i "t "i "a "t "e "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.597750" elapsed="0.027815"/>
</kw>
<msg time="2026-05-01T00:40:56.625747" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.625793" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "I "n "i "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.597378" elapsed="0.028451"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.626153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.625913" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.625893" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.626715" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "I "n "i "t "i "a "t "e "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.626377" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.627068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.626854" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.626836" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.627177" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.629714" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:40:56.629921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.628616" elapsed="0.001434"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.630361" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.630728" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.627984" elapsed="0.002928"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.627439" elapsed="0.003537"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.555641" elapsed="0.075431"/>
</kw>
<msg time="2026-05-01T00:40:56.631163" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.631206" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "I "n "i "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.555045" elapsed="0.076197"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:40:56.631424" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.631319" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.631300" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.631929" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.632273" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.632344" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:40:56.554360" elapsed="0.078106"/>
</kw>
<msg time="2026-05-01T00:40:56.632561" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.632605" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "I "n "i "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.549652" elapsed="0.082989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.632981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.632716" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.632698" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:56.549506" elapsed="0.083580"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:56.549315" elapsed="0.083800"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:40:56.546934" elapsed="0.086235"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.542131" elapsed="0.091091"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.541704" elapsed="0.091566"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.538854" elapsed="0.094467"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.634153" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=false | BGP_RIB_OPENCONFIG=example-bgp-rib | LOCAL=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=false</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<arg>LOCAL=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.633533" elapsed="0.000649"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.667006" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.666635" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.667766" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.667540" elapsed="0.000291">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.667961" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.667195" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.668561" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.668154" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.668887" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:56.669044" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:56.668752" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.669495" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.669230" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.670506" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.670232" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.670969" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.670711" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.671667" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.671350" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.672420" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.672196" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.672511" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:40:56.672664" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.671880" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.672840" elapsed="0.000267"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:40:56.671214" elapsed="0.001933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.673720" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.673402" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.674614" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.674387" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.674690" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.674841" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.673933" elapsed="0.000933"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.675015" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:40:56.673261" elapsed="0.002016"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.675836" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.675542" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.676589" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.676365" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.676663" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:56.676812" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.676049" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.676999" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:40:56.675394" elapsed="0.001869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.677816" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.677521" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.678607" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.678382" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.678682" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.678833" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.678067" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.679007" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:40:56.677374" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.679830" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.679529" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.680580" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.680357" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.680655" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:40:56.680803" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.680041" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.680991" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:40:56.679381" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.681814" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:40:56.681519" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:40:56.682571" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.682343" elapsed="0.000284"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:40:56.682682" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.682835" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:40:56.682028" elapsed="0.000831"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.683009" elapsed="0.000221"/>
</kw>
<var name="${key}">LOCAL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:40:56.681372" elapsed="0.001903"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:40:56.671042" elapsed="0.012275"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:40:56.683360" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:40:56.683533" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:40:56.669903" elapsed="0.013657"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.669609" elapsed="0.013983"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.683771" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.683622" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.669590" elapsed="0.014257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.684656" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.683989" elapsed="0.000696"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.684733" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.666002" elapsed="0.018855"/>
</kw>
<msg time="2026-05-01T00:40:56.684935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.653753" elapsed="0.031232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.697184" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.709207" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.721148" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.721347" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.721544" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.721909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.721765" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:56.721750" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.722128" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.722294" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.722473" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:56.721721" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.721620" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.722700" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.722776" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:56.722897" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:56.649584" elapsed="0.073340"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.748506" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.748120" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.749257" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.749053" elapsed="0.000267">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.749413" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.748698" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.750037" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.749617" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.750361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:40:56.750506" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:40:56.750225" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.750938" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
            &lt;local-address&gt;$LOCAL&lt;/local-address&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.750696" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:40:56.751354" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.751063" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.751901" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.751599" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.751437" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.751045" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.752854" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.752131" elapsed="0.000766"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.752948" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.747511" elapsed="0.005566"/>
</kw>
<msg time="2026-05-01T00:40:56.753135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.735276" elapsed="0.017904"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.765293" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.777199" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.789127" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.789366" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.789559" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.789924" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.789780" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:40:56.789765" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.790145" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.790312" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.790492" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:40:56.789736" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.789634" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.790717" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.790792" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:40:56.790925" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:40:56.732691" elapsed="0.058262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:40:56.792199" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.791962" elapsed="0.000305">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:40:56.792357" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:40:56.791628" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.792711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.792449" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.793284" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.792984" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.792790" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.792432" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.795668" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.793543" elapsed="0.002151"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:40:56.795745" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.795899" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:40:56.791285" elapsed="0.004638"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.797332" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.797083" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.797820" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;false&lt;/passive-mode&gt;
            &lt;local-address&gt;10.30.170.185&lt;/local-address&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.797580" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.798270" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.798029" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.798717" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.798477" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.799575" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:40:56.799367" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:40:56.799940" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:40:56.799767" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.800114" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.800734" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.800489" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:40:56.800819" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:40:56.801013" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:40:56.798967" elapsed="0.002071"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:56.817971" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Content-Length': '1137', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;false&lt;/passive-mode&gt;
            &lt;local-address&gt;10.30.170.185&lt;/local-address&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:40:56.818118" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:56.818344" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:40:56.803277" elapsed="0.015123"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.801109" elapsed="0.017426"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.818944" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.818596" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.801091" elapsed="0.018047"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.824563" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.821350" elapsed="0.003274"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.820913" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.820824" elapsed="0.003884"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.828389" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.825110" elapsed="0.003360"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.824784" elapsed="0.003735"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.824762" elapsed="0.003792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.829339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.828781" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.829830" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.829497" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.830603" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.830168" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.829943" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.829468" elapsed="0.001250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.831436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.830940" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.831918" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.831592" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.832680" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.832253" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.832030" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.831568" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.833338" elapsed="0.000502"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:40:56.834283" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.834006" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.834485" elapsed="0.002433"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:40:56.819976" elapsed="0.017004"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:40:56.837160" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.837047" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.837029" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.837413" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.837497" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:40:56.839690" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:40:56.796257" elapsed="0.043460"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.839781" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:40:56.839933" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:40:56.639093" elapsed="0.200865"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.840297" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.840055" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.840039" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:40:56.840493" elapsed="0.000029"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_local_address</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:40:56.634529" elapsed="0.206094"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.841886" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.841503" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.841485" elapsed="0.000484"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.842114" elapsed="0.000307"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.847630" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:40:56.847136" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:40:56.847883" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.847734" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.847715" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848114" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848284" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848472" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848642" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848807" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.848985" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.849165" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:40:56.846827" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-05-01T00:40:56.841280" elapsed="0.008011"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:40:56.840904" elapsed="0.008429"/>
</kw>
<doc>Configure ibgp peer with local-address.</doc>
<status status="PASS" start="2026-05-01T00:40:56.538283" elapsed="0.311086"/>
</test>
<test id="s1-s4-t3" name="TC_LA_Start_Bgp_Speaker_And_Verify_Connected" line="96">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.852781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.852559" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.852542" elapsed="0.000333"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:40:56.852359" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.853913" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.853801" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.853784" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.858810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.858697" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.858679" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.859876" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.859496" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.860357" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:40:56.860063" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:40:56.860476" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:40:56.860638" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:40:56.859102" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.866195" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.866087" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.866068" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.867415" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:40:56.867305" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.867288" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:40:56.867942" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:40:56.867649" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.868338" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.868126" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.903913" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.868922" elapsed="0.035096"/>
</kw>
<msg time="2026-05-01T00:40:56.904188" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:40:56.904234" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.868553" elapsed="0.035715"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.931281" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "S "t "a "r "t "_ "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:40:56.904828" elapsed="0.026556"/>
</kw>
<msg time="2026-05-01T00:40:56.931561" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:40:56.931606" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "S "t "a "r "t "_ "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.904441" elapsed="0.027199"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.931939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.931717" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.931698" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.932448" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "S "t "a "r "t "_ "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.932159" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.932861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.932613" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.932595" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:40:56.932982" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:40:56.935525" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:40:56.935729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:40:56.934448" elapsed="0.001409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.936130" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.936487" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:40:56.933797" elapsed="0.002877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:40:56.933249" elapsed="0.003488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:40:56.867008" elapsed="0.069879"/>
</kw>
<msg time="2026-05-01T00:40:56.936981" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.937024" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "S "t "a "r "t "_ "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.866419" elapsed="0.070640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:40:56.937250" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:40:56.937144" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.937124" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.937764" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.938098" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.938170" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:40:56.865748" elapsed="0.072530"/>
</kw>
<msg time="2026-05-01T00:40:56.938370" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:40:56.938413" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "S "t "a "r "t "_ "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.861055" elapsed="0.077392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:40:56.938798" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:40:56.938539" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:40:56.938522" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:40:56.860911" elapsed="0.078001"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:40:56.860714" elapsed="0.078227"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:40:56.858321" elapsed="0.080675"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.853519" elapsed="0.085530"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:40:56.853069" elapsed="0.086030"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:40:56.850210" elapsed="0.088941"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.939719" level="INFO">${speaker_args} = --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --debug</msg>
<var>${speaker_args}</var>
<arg>--amount 3 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --debug</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.939319" elapsed="0.000434"/>
</kw>
<kw name="Start_BGP_Speaker_And_Verify_Connected" owner="BGPSpeaker">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.941539" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --debug &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.940913" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.941977" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --debug &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:40:56.941733" elapsed="0.000289"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:40:56.945208" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:40:56.945303" level="INFO">${output} =  python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --debug &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:40:56.942172" elapsed="0.003158"/>
</kw>
<arg>${arguments}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:40:56.940564" elapsed="0.004827"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.946844" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:56.946546" elapsed="0.000324"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:56.947393" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:56.947029" elapsed="0.000438"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:56.954008" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:56.954191" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:56.954322" level="FAIL">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.947630" elapsed="0.007543">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-05-01T00:40:56.955273" elapsed="0.000027"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:40:56.946079" elapsed="0.009357">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:40:58.958575" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:40:58.957760" elapsed="0.000886"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:40:58.959967" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:40:58.959027" elapsed="0.001003"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:40:58.968170" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:40:58.968383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:40:58.968555" level="FAIL">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:40:58.960337" elapsed="0.008808">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-05-01T00:40:58.969252" elapsed="0.000037"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:40:58.956437" elapsed="0.013010">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:00.972535" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:00.971723" elapsed="0.000882"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:00.973857" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:00.972979" elapsed="0.000936"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:00.983657" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:00.983929" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:41:00.984145" level="FAIL">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:41:00.974256" elapsed="0.010937">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-05-01T00:41:00.985439" elapsed="0.000078"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:41:00.970409" elapsed="0.015318">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig Expected status: 409 != 200</status>
</kw>
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:02.989409" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:02.988560" elapsed="0.000947"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:02.991568" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:02.989892" elapsed="0.001744"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:03.002337" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:03.005133" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1991'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.1.32/28","prefix":"8.0.1.32/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.16/28","prefix":"8.0.1.16/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.0/28","prefix":"8.0.1.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.1.16/28","prefix":"8.0.1.16/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.32/28","prefix":"8.0.1.32/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.0/28","prefix":"8.0.1.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:41:03.005414" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:02.991999" elapsed="0.013504"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-05-01T00:41:03.005629" elapsed="0.000099"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:41:02.987185" elapsed="0.024057"/>
</kw>
<msg time="2026-05-01T00:41:03.011485" level="INFO">${message} = {"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi"...</msg>
<var>${message}</var>
<arg>5x</arg>
<arg>2s</arg>
<arg>Verify_BGP_Speaker_Connection</arg>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:40:56.945583" elapsed="6.065966"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:03.011679" elapsed="0.000063"/>
</return>
<msg time="2026-05-01T00:41:03.012059" level="INFO">${output} = {"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi"...</msg>
<var>${output}</var>
<arg>${speaker_args}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>speaker_ip=${TOOLS_SYSTEM_IP}</arg>
<doc>Start the BGP speaker python utility, and verifies it's connection.
We can change connected variable to false to verify Speaker did not connect.</doc>
<status status="PASS" start="2026-05-01T00:40:56.939975" elapsed="6.072183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.013299" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.1.32/28","prefix":"8.0.1.32/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.16/28","prefix":"8.0.1.16/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.0/28","prefix":"8.0.1.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.1.16/28","prefix":"8.0.1.16/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.32/28","prefix":"8.0.1.32/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.0.1.0/28","prefix":"8.0.1.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ibgp"}]}</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.012620" elapsed="0.000973"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:03.014698" elapsed="0.000242"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:03.014282" elapsed="0.000722"/>
</kw>
<doc>Verify that peer is present in odl's rib under local-address ip.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:40:56.849666" elapsed="6.165379"/>
</test>
<test id="s1-s4-t4" name="TC_LA_Kill_Bgp_Speaker" line="107">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:03.018612" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:03.018308" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.019923" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.019798" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.019775" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.024896" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.024771" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.024753" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.026108" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.025647" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.026621" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:03.026305" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:03.026692" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:03.026847" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.025213" elapsed="0.001658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.033850" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.033740" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.033721" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.035115" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.035007" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.034989" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:03.035665" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.035330" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.036086" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.035857" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.074078" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.036621" elapsed="0.037630"/>
</kw>
<msg time="2026-05-01T00:41:03.074507" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:03.074557" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.036270" elapsed="0.038324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.093072" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "K "i "l "l "_ "B "g "p "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:03.075165" elapsed="0.018009"/>
</kw>
<msg time="2026-05-01T00:41:03.093338" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:03.093383" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "K "i "l "l "_ "B "g "p "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[9...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.074789" elapsed="0.018631"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.093774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.093535" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.093510" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.094408" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "K "i "l "l "_ "B "g "p "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.094098" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.094780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.094559" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.094540" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:03.094895" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.097706" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:41:03.097940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.096436" elapsed="0.001642"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.098364" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.098806" elapsed="0.000082"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:03.095783" elapsed="0.003224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:03.095194" elapsed="0.003879"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:03.034706" elapsed="0.064468"/>
</kw>
<msg time="2026-05-01T00:41:03.099266" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.099310" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "K "i "l "l "_ "B "g "p "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[9...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.034104" elapsed="0.065244"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:03.099702" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.099426" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.099407" elapsed="0.000383"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.100209" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.100567" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.100640" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:03.033380" elapsed="0.067370"/>
</kw>
<msg time="2026-05-01T00:41:03.100843" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.100887" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "K "i "l "l "_ "B "g "p "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[9...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.027255" elapsed="0.073671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.101252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.101002" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.100985" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:03.027109" elapsed="0.074244"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:03.026930" elapsed="0.074462"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:03.024388" elapsed="0.077092"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.019487" elapsed="0.082064"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.019030" elapsed="0.082571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:03.015955" elapsed="0.085698"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.102916" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.102601" elapsed="0.000378"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.103136" elapsed="0.000225"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:03.102285" elapsed="0.001149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.126149" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:03.104183" elapsed="0.022031"/>
</kw>
<msg time="2026-05-01T00:41:03.126310" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.126353" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.103614" elapsed="0.022764"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.127015" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:03.139575" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:03.139789" level="INFO">${output_log} = 2026-05-01 00:40:57,029 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-05-01 00:40:57,029 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:40:57,029 DEBUG BGP-T...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:03.126872" elapsed="0.012975"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.140797" level="INFO">2026-05-01 00:40:57,029 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-05-01 00:40:57,029 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:40:57,029 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:41:01,849 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:41:01,854 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:41:01,854 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:41:01,855 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:41:01,856 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:41:01,856 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:41:01,856 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:41:01,857 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:41:01,857 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:41:01,857 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:41:01,858 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:41:01,859 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:41:01,859 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.0')]/28 (0x1c08000100)
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000100
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.16')]
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:41:01,860 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.16')]/28 (0x1c08000110)
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000110
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:41:01,861 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.32')]
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.32')]/28 (0x1c08000120)
2026-05-01 00:41:01,862 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000120
2026-05-01 00:41:01,862 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:41:01,862 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:41:01,862 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:41:01,862 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.003643512725830078s
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:01,863 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:41:01,863 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:41:01,864 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:41:01,864 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:41:01,864 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:01,864 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:01,865 INFO BGP-Thread-1 (job): ... idle for 0.001s
2026-05-01 00:41:01,865 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.001s
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:41:01,865 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:41:01,866 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:41:01,866 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:41:01,866 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:41:01,866 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:41:01,866 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.140199" elapsed="0.001089"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:03.126595" elapsed="0.014819"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:41:03.141837" elapsed="0.000156"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.141590" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.141549" elapsed="0.000579"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.142493" elapsed="0.000051"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.142863" elapsed="0.000043"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:41:03.101964" elapsed="0.041067"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.144845" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:03.144098" elapsed="0.000839"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:03.143476" elapsed="0.001588"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:03.146320" elapsed="0.000482"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:03.145653" elapsed="0.001266"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:03.015386" elapsed="0.131616"/>
</test>
<test id="s1-s4-t5" name="TC_LA_Delete_Bgp_Peer_Configuration" line="116">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.154744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.154527" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.154509" elapsed="0.000315"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:03.154201" elapsed="0.000669"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.155853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.155747" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.155729" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.160776" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.160668" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.160650" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.161894" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.161463" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.162372" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:03.162081" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:03.162442" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:41:03.162619" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.161075" elapsed="0.001569"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.168168" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.168061" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.168041" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.169408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.169300" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.169282" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:03.169981" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.169656" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.170380" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.170168" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.204891" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.170917" elapsed="0.034092"/>
</kw>
<msg time="2026-05-01T00:41:03.205265" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:03.205312" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.170583" elapsed="0.034767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.227608" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:03.205929" elapsed="0.021841"/>
</kw>
<msg time="2026-05-01T00:41:03.228017" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:03.228088" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.205547" elapsed="0.022596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.228661" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.228265" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.228233" elapsed="0.000553"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.229480" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.229002" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.230088" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.229684" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.229657" elapsed="0.000555"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:03.230263" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.234064" elapsed="0.000211"/>
</kw>
<msg time="2026-05-01T00:41:03.234365" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.232512" elapsed="0.002071"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.234963" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.235430" elapsed="0.000127"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:03.231568" elapsed="0.004143"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:03.230713" elapsed="0.005086"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:03.169002" elapsed="0.066935"/>
</kw>
<msg time="2026-05-01T00:41:03.236064" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.236125" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.168392" elapsed="0.067785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:03.236435" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.236284" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.236258" elapsed="0.000318"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.237132" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.237645" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.237745" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:03.167722" elapsed="0.070190"/>
</kw>
<msg time="2026-05-01T00:41:03.238042" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.238103" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "L "A "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.163018" elapsed="0.075136"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.238706" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.238322" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.238296" elapsed="0.000519"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:03.162875" elapsed="0.075972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:03.162700" elapsed="0.076191"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:03.160291" elapsed="0.078675"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.155444" elapsed="0.083597"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.155018" elapsed="0.084084"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.149309" elapsed="0.089864"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.240130" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.239439" elapsed="0.000730"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.283173" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.282796" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.284065" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.283751" elapsed="0.000403">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:03.284250" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:03.283368" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.284843" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.284440" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.285169" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_local_address/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:03.285341" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:03.285032" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.285783" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.285540" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.286815" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.286557" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.287279" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.287019" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.287978" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.287684" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.288747" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.288523" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.288822" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.288973" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.288192" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.289152" elapsed="0.000329"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:41:03.287549" elapsed="0.001974"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.290092" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.289772" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.290845" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.290637" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.290919" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.291070" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.290305" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.291245" elapsed="0.000396"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:41:03.289639" elapsed="0.002043"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:41:03.287355" elapsed="0.004363"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:03.291762" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:41:03.291921" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:03.286221" elapsed="0.005725"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.285920" elapsed="0.006057"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.292153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.292001" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.285901" elapsed="0.006328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.293041" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.292373" elapsed="0.000697"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.293119" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.282163" elapsed="0.011081"/>
</kw>
<msg time="2026-05-01T00:41:03.293298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.269849" elapsed="0.023495"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.305376" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.317593" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_local_address/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.329579" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.329800" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.330046" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.330436" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.330289" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:03.330273" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.330674" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.330840" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.331005" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:03.330238" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.330126" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.331230" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.331308" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:03.331461" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:03.265672" elapsed="0.065820"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.332699" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.332408" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:03.344714" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:03.344822" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:03.345052" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:03.334827" elapsed="0.010284"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.332815" elapsed="0.012385"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.345632" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.345258" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.332797" elapsed="0.013067"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.353821" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.348131" elapsed="0.005796"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.347638" elapsed="0.006374"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.347598" elapsed="0.006475"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.357065" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.354589" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.354205" elapsed="0.002947"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.354166" elapsed="0.003011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.357803" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.357360" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.358201" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.357905" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.358780" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.358476" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.358288" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.357887" elapsed="0.000979"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.359402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.359028" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.359758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.359520" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.360307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.360004" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.359840" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.359501" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.360589" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:03.361466" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.361140" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.361656" elapsed="0.002299"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:03.346698" elapsed="0.017324"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:41:03.364072" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:41:03.366610" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:41:03.331814" elapsed="0.034824"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.366695" elapsed="0.000029"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_local_address</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:41:03.240510" elapsed="0.126313"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:03.367461" elapsed="0.000249"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:03.367123" elapsed="0.000652"/>
</kw>
<doc>Delete peer configuration.</doc>
<status status="PASS" start="2026-05-01T00:41:03.148045" elapsed="0.219771"/>
</test>
<test id="s1-s4-t6" name="Reconfigure_ODL_To_Accept_Connection" line="124">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.371441" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.371211" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.371192" elapsed="0.000348"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:03.371024" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.372599" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.372490" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.372472" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.377596" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.377484" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.377464" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.378771" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.378320" elapsed="0.000479"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.379259" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:03.378962" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:03.379329" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:41:03.379585" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.377938" elapsed="0.001674"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.385354" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.385244" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.385224" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.386687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.386577" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.386558" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:03.387216" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.386908" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.387663" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.387406" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.425931" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.388198" elapsed="0.037880"/>
</kw>
<msg time="2026-05-01T00:41:03.426308" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:03.426374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.387853" elapsed="0.038572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.454737" level="INFO">". "t "x "t ". "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:03.426988" elapsed="0.027854"/>
</kw>
<msg time="2026-05-01T00:41:03.455001" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:03.455047" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.426636" elapsed="0.028448"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.455389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.455164" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.455143" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.455935" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.455638" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.456283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.456070" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.456052" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:03.456395" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.459003" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:41:03.459209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.457902" elapsed="0.001443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.459642" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.459980" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:03.457255" elapsed="0.002911"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:03.456714" elapsed="0.003517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:03.386234" elapsed="0.074093"/>
</kw>
<msg time="2026-05-01T00:41:03.460509" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.460565" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.385604" elapsed="0.074999"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:03.460791" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.460683" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.460664" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.461280" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.461635" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.461727" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:03.384897" elapsed="0.076943"/>
</kw>
<msg time="2026-05-01T00:41:03.461934" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.461978" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.380005" elapsed="0.082010"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.462345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.462092" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.462075" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:03.379857" elapsed="0.082603"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:03.379674" elapsed="0.082821"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:03.377088" elapsed="0.085466"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.372177" elapsed="0.090433"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.371741" elapsed="0.090915"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.368728" elapsed="0.093980"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.463667" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exam...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.462905" elapsed="0.000792"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.496760" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.496369" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.497564" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.497286" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:03.497753" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:03.496953" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.498328" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.497945" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.498672" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:03.498870" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:03.498534" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.499299" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.499056" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.500307" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.500050" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.500796" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.500536" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.501506" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.501194" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.502285" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.502063" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.502361" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:03.502529" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.501744" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.502707" elapsed="0.000239"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:41:03.501057" elapsed="0.001929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.503545" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.503233" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.504423" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.504215" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.504514" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.504666" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.503757" elapsed="0.000934"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.504843" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:41:03.503098" elapsed="0.002004"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.505661" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.505350" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.506407" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.506200" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.506497" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.506651" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.505886" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.506828" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:41:03.505215" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.507650" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.507337" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.508388" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.508179" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.508479" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.508632" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.507864" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.508809" elapsed="0.000218"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:41:03.507203" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.509698" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.509363" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.510467" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.510241" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.510566" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:03.510725" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.509916" elapsed="0.000834"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.510905" elapsed="0.000247"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:41:03.509226" elapsed="0.001970"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.511763" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.511463" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.512575" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.512347" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.512652" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:03.512802" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.511976" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.512978" elapsed="0.000218"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:41:03.511312" elapsed="0.001924"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.513816" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.513496" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.514592" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.514358" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.514667" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:03.514816" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.514030" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.514989" elapsed="0.000217"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:41:03.513348" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.515980" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.515507" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.516730" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.516523" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.516805" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:41:03.516954" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.516193" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.517130" elapsed="0.000218"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:41:03.515359" elapsed="0.002029"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.517963" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:03.517650" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:03.518727" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.518519" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:03.518801" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.518952" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:03.518189" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.519127" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:41:03.517517" elapsed="0.001905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:41:03.500874" elapsed="0.018601"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:03.519520" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:41:03.519683" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:03.499730" elapsed="0.019979"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.499411" elapsed="0.020330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.519915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.519766" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.499393" elapsed="0.020598"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.520869" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.520134" elapsed="0.000763"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.520947" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.495751" elapsed="0.025320"/>
</kw>
<msg time="2026-05-01T00:41:03.521124" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.483423" elapsed="0.037748"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.533225" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.545215" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.562661" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.562864" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.563042" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.563416" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.563266" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:03.563252" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.563685" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.563852" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.564016" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:03.563222" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.563117" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.564285" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.564361" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:03.564502" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:03.479274" elapsed="0.085257"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.590371" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.589996" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.591135" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.590913" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:03.591301" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:03.590577" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.591885" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.591503" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.592205" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:03.592348" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:03.592073" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.592796" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.592546" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:41:03.593215" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.592921" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.593788" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.593445" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.593298" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.592903" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.594803" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.594018" elapsed="0.000815"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.594913" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.589357" elapsed="0.005688"/>
</kw>
<msg time="2026-05-01T00:41:03.595103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.577018" elapsed="0.018131"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.607168" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.619101" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.630995" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.631190" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.631365" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.631746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.631601" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:03.631586" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.631965" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.632130" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.632293" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:03.631557" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.631439" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.632530" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.632606" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:03.632743" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:03.574247" elapsed="0.058524"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:03.634109" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.633859" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:03.634273" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:03.633495" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.634631" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.634368" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.635352" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.634887" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.634711" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.634350" elapsed="0.001087"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.637772" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.635611" elapsed="0.002188"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:41:03.637852" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:03.638009" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:03.633109" elapsed="0.004924"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.639407" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.639163" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.639864" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.639628" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.640318" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.640072" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.640767" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.640528" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:03.641648" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:41:03.641414" elapsed="0.000262"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:41:03.642004" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:41:03.641831" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.642177" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.642798" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.642554" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:41:03.642884" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:41:03.643038" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:41:03.641014" elapsed="0.002048"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:03.663173" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Content-Length': '1079', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:41:03.663323" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:03.663523" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:03.645160" elapsed="0.018423"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.643131" elapsed="0.020551"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.664082" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.663740" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.643114" elapsed="0.021163"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.674255" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.666422" elapsed="0.007929"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.665927" elapsed="0.008501"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.665887" elapsed="0.008586"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.677005" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.674752" elapsed="0.002298"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.674530" elapsed="0.002554"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.674514" elapsed="0.002595"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.677695" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.677278" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.678030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.677792" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.678592" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.678271" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.678111" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.677774" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.679196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.678837" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.679541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.679293" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.680075" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.679783" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.679623" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.679275" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.680307" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:03.681116" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.680834" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.681293" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:03.665086" elapsed="0.018620"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:41:03.683879" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.683773" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.683754" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.684118" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.684186" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:41:03.686407" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:41:03.638370" elapsed="0.048065"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.686558" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:03.686718" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:41:03.468541" elapsed="0.218202"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.687095" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.686842" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.686826" elapsed="0.000365"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:03.687224" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:41:03.463974" elapsed="0.223374"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.688620" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.688220" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.688202" elapsed="0.000506"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.688855" elapsed="0.000312"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.694053" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:03.693646" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:41:03.694299" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.694156" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.694138" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.694545" elapsed="0.000023"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.694721" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.694893" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.695058" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.695223" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.695388" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.695571" elapsed="0.000021"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:41:03.693301" elapsed="0.002347"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:03.688013" elapsed="0.007684"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:41:03.687648" elapsed="0.008090"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:41:03.368047" elapsed="0.327730"/>
</test>
<test id="s1-s4-t7" name="Start_Talking_BGP_speaker" line="142">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.744570" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.744278" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.744252" elapsed="0.000428"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:03.744012" elapsed="0.000722"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.745994" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.745810" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.745791" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.750926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.750819" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.750802" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.752011" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:03.751617" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.752520" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:03.752201" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:03.752591" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:41:03.752754" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:03.751224" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.758318" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.758210" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.758191" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.759579" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:03.759468" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.759428" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:03.760102" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:03.759796" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.760524" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.760287" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.794670" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.761045" elapsed="0.033728"/>
</kw>
<msg time="2026-05-01T00:41:03.794948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:03.794995" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.760710" elapsed="0.034319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.812751" level="INFO">". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "s "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:03.795565" elapsed="0.017284"/>
</kw>
<msg time="2026-05-01T00:41:03.813007" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:03.813053" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "s "p "e "a "k "e "r "[K"
[?1l&gt;[?...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.795202" elapsed="0.017888"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.813393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.813167" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.813147" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.813969" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "s "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.813671" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.814313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.814097" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.814080" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:03.814423" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:03.816993" elapsed="0.000179"/>
</kw>
<msg time="2026-05-01T00:41:03.817235" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:03.815871" elapsed="0.001497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.817681" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.818017" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:03.815237" elapsed="0.002964"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:03.814713" elapsed="0.003551"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:03.759149" elapsed="0.059212"/>
</kw>
<msg time="2026-05-01T00:41:03.818474" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.818520" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "s "p "e "a "k "e "r "[K"
[?1l&gt;[?...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.758556" elapsed="0.060002"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:03.818742" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:41:03.818634" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.818616" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.819223" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.819575" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:03.819648" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:03.757874" elapsed="0.061882"/>
</kw>
<msg time="2026-05-01T00:41:03.819847" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:03.819890" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "s "p "e "a "k "e "r "[K"
[?1l&gt;[?...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.753162" elapsed="0.066765"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:03.820250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:03.820001" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:03.819984" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:03.753017" elapsed="0.067333"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:03.752839" elapsed="0.067543"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:03.750443" elapsed="0.069992"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.745418" elapsed="0.075089"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:03.744895" elapsed="0.075656"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:03.696718" elapsed="0.123884"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.821662" level="INFO">${command} = python3 play.py --amount 3 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --info &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:03.821293" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:03.822259" level="INFO">python3 play.py --amount 3 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --info &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:03.821846" elapsed="0.000460"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:03.825690" level="INFO">python3 play.py --amount 3 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --info &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:41:03.825783" level="INFO">${output} =  python3 play.py --amount 3 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --info &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:03.822484" elapsed="0.003327"/>
</kw>
<arg>--amount 3 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_TOOL_LOG_LEVEL}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:41:03.820825" elapsed="0.005047"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:13.828056" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.827477" elapsed="10.002088">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.829896" elapsed="0.000041"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:41:03.827198" elapsed="10.002867">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:41:03.826799" elapsed="10.003572"/>
</kw>
<msg time="2026-05-01T00:41:13.830501" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:03.826419" elapsed="10.004110"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:41:13.830728" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:41:13.830623" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.830598" elapsed="0.000222"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.831064" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.831240" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:41:03.826143" elapsed="10.005178"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:13.831963" elapsed="0.000307"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:13.831618" elapsed="0.000718"/>
</kw>
<doc>Start Python speaker to connect to ODL, verify that the tool does not promptly exit.</doc>
<status status="PASS" start="2026-05-01T00:41:03.696117" elapsed="10.136257"/>
</test>
<test id="s1-s4-t8" name="Check_Talking_Connection_Is_Established" line="149">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.835969" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:13.835739" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.835721" elapsed="0.000329"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:13.835552" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:13.837149" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:13.837000" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.836982" elapsed="0.000237"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:13.842295" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:13.842189" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.842172" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:13.843377" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:13.842986" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:13.843892" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:13.843582" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:13.843962" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:13.844116" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:13.842612" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:13.849539" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:13.849416" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.849397" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:13.850792" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:13.850686" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.850668" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:13.851367" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:13.851062" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:13.851791" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:13.851573" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:13.888713" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:13.852311" elapsed="0.036517"/>
</kw>
<msg time="2026-05-01T00:41:13.888991" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:13.889037" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.851977" elapsed="0.037095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:13.909775" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "E "s "t "a "b "l "i "s "h "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:13.889625" elapsed="0.020260"/>
</kw>
<msg time="2026-05-01T00:41:13.910044" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:13.910089" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "E ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.889245" elapsed="0.020879"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.910424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:13.910202" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.910182" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:13.910971" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "E "s "t "a "b "l "i "s "h "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:13.910672" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.911316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:13.911103" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.911085" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:13.911426" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:13.914013" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:41:13.914221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:13.912906" elapsed="0.001444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.914647" elapsed="0.000213"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.915129" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:13.912261" elapsed="0.003054"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:13.911725" elapsed="0.003656"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:13.850360" elapsed="0.065141"/>
</kw>
<msg time="2026-05-01T00:41:13.915594" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:13.915638" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "E ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.849760" elapsed="0.065913"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:13.915860" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:13.915748" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.915730" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.916348" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.916703" elapsed="0.000058"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:13.916811" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:13.849069" elapsed="0.067852"/>
</kw>
<msg time="2026-05-01T00:41:13.917012" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:13.917054" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "E ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.844535" elapsed="0.072554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:13.917470" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:13.917163" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:13.917146" elapsed="0.000408"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:13.844375" elapsed="0.073202"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:13.844198" elapsed="0.073409"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:13.841829" elapsed="0.075833"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:13.836700" elapsed="0.081017"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.836246" elapsed="0.081518"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:13.833321" elapsed="0.084494"/>
</kw>
<kw name="Check_Speaker_Is_Connected">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Number_Of_Speaker_Connections">
<kw name="Count_Port_Occurences" owner="SSHKeywords">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_And_Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:13.923853" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-05-01T00:41:14.247983" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:14.248245" level="INFO">${netstat_installed} = net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET...</msg>
<var>${netstat_installed}</var>
<arg>netstat --version</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:13.923755" elapsed="0.324551"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<doc>Install netstat if it is not already installed.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:14.249407" elapsed="0.000125"/>
</kw>
<msg time="2026-05-01T00:41:14.249623" level="FAIL">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</msg>
<status status="FAIL" start="2026-05-01T00:41:14.248541" elapsed="0.001197">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:14.248444" elapsed="0.001387">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.923372" elapsed="0.326811">Invalid IF condition: Evaluating expression "'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' is not string and 'net-tools 2.10-alpha\nFred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others\n+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX\nAF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH\nHW:  +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 ' != '0'" failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)

Variables in the original expression "'${netstat_installed}' is not string and '${netstat_installed}' != '0'" were resolved before the expression was evaluated. Try using "$netstat_installed is not string and $netstat_installed != '0'" syntax to avoid that. See Evaluating Expressions appendix in Robot Framework User Guide for more details.</status>
</kw>
<arg>Check_And_Install_Netstat</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:13.922982" elapsed="0.327349"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:14.251259" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-05-01T00:41:24.269274" level="FAIL">SSHException: Timeout opening channel.</msg>
<var>${output}</var>
<arg>${NETSTAT_COMMAND} 2&gt; /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="FAIL" start="2026-05-01T00:41:14.250733" elapsed="10.021279">SSHException: Timeout opening channel.</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.272251" elapsed="0.000054"/>
</return>
<var>${output}</var>
<arg>17900</arg>
<arg>ESTABLISHED</arg>
<arg>python</arg>
<doc>Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.922658" elapsed="10.349905">SSHException: Timeout opening channel.</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output}</arg>
<arg>${howmany}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.273013" elapsed="0.000055"/>
</kw>
<arg>1</arg>
<doc>Run netstat in mininet machine and parse it for number of established connections. Check it is ${howmany}.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.922286" elapsed="10.350963">SSHException: Timeout opening channel.</status>
</kw>
<msg time="2026-05-01T00:41:24.273380" level="FAIL">Keyword 'Check_Number_Of_Speaker_Connections' failed after retrying for 5 seconds. The last error was: SSHException: Timeout opening channel.</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>Check_Number_Of_Speaker_Connections</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.918236" elapsed="10.355294">Keyword 'Check_Number_Of_Speaker_Connections' failed after retrying for 5 seconds. The last error was: SSHException: Timeout opening channel.</status>
</kw>
<doc>Give it several tries to see exactly one established connection.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.917958" elapsed="10.355717">Keyword 'Check_Number_Of_Speaker_Connections' failed after retrying for 5 seconds. The last error was: SSHException: Timeout opening channel.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.276095" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:24.275636" elapsed="0.000567"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.274656" elapsed="0.001639"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.274165" elapsed="0.002212"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-05-01T00:41:13.832796" elapsed="10.443636">Keyword 'Check_Number_Of_Speaker_Connections' failed after retrying for 5 seconds. The last error was: SSHException: Timeout opening channel.</status>
</test>
<test id="s1-s4-t9" name="Check_Talking_Topology_Is_Filled" line="154">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.282382" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.281974" elapsed="0.000514">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:24.281653" elapsed="0.000927">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:24.281624" elapsed="0.001002">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.281368" elapsed="0.001380">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.282981" elapsed="0.000030"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.278294" elapsed="0.004838">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.284951" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:24.284517" elapsed="0.000494"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.283961" elapsed="0.001121"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.283541" elapsed="0.001619"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:24.277189" elapsed="0.008078">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t10" name="TC_R_Reset_Bgp_Peer_Session" line="159">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.288804" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.288532" elapsed="0.000333">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:24.288296" elapsed="0.000631">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:24.288278" elapsed="0.000681">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.288092" elapsed="0.000952">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.289209" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.285967" elapsed="0.003350">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.290582" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:24.290259" elapsed="0.000366"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.289901" elapsed="0.000776"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.289601" elapsed="0.001132"/>
</kw>
<doc>Reset Peer Session</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:24.285534" elapsed="0.005238">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t11" name="TC_R_Check_For_Empty_Topology_After_Resetting" line="168">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.294626" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.294335" elapsed="0.000351">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:24.294110" elapsed="0.000639">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:24.294092" elapsed="0.000690">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.293925" elapsed="0.000944">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.295035" elapsed="0.000023"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.291552" elapsed="0.003594">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.296423" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:24.296087" elapsed="0.000393"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.295729" elapsed="0.000805"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:24.295414" elapsed="0.001176"/>
</kw>
<doc>See example-ipv4-topology empty after resetting session</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:24.290971" elapsed="0.005656">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t12" name="TC_PG_Reconfigure_ODL_With_Peer_Group_To_Accept_Connection" line="173">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.300340" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.300045" elapsed="0.000355">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:24.299828" elapsed="0.000649">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:24.299811" elapsed="0.000700">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.299647" elapsed="0.000949">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.300761" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.297534" elapsed="0.003333">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.302157" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:24.301776" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.301759" elapsed="0.000482"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:24.302389" elapsed="0.000327"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.307754" level="INFO">${test_skipped} = True</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:24.307326" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:41:24.308005" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:41:24.307858" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.307840" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.308266" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.308444" elapsed="0.000035"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.308637" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.308807" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.308977" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.309146" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.309315" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:41:24.307019" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:24.301570" elapsed="0.007875"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:41:24.301172" elapsed="0.008331"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.296930" elapsed="0.012610">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t13" name="TC_PG_Restart_Talking_BGP_Speaker" line="202">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:24.312789" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:24.312525" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.314048" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:24.313936" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.313917" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.319007" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:24.318896" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.318877" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.320111" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:24.319717" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.320629" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:24.320317" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:24.320702" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:41:24.320861" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:24.319320" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.326596" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:24.326486" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.326467" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.327866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:24.327760" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.327742" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:24.328410" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:24.328085" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:24.328838" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:24.328621" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:24.371128" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:24.329363" elapsed="0.042020"/>
</kw>
<msg time="2026-05-01T00:41:24.371667" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:24.371715" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.329024" elapsed="0.042727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:24.421611" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "s "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:24.372592" elapsed="0.049265"/>
</kw>
<msg time="2026-05-01T00:41:24.422115" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:24.422162" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "s "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.372021" elapsed="0.050176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.422724" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:24.422340" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.422297" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.423366" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "s "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:24.422966" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.423752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:24.423532" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.423514" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:24.423870" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:24.426697" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:41:24.426909" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:24.425516" elapsed="0.001529"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.427320" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.427683" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:24.424846" elapsed="0.003027"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:24.424212" elapsed="0.003726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:24.327433" elapsed="0.100604"/>
</kw>
<msg time="2026-05-01T00:41:24.428134" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:24.428180" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "s "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.326819" elapsed="0.101399"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:24.428515" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:24.428386" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.428366" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.429020" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.429374" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:24.429444" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:24.326108" elapsed="0.103464"/>
</kw>
<msg time="2026-05-01T00:41:24.429669" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:24.429714" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "s "t "a "r "t "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.321340" elapsed="0.108409"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:24.430077" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:24.429827" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:24.429810" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:24.321193" elapsed="0.108986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:24.321010" elapsed="0.109204"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:24.318514" elapsed="0.111758"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:24.313649" elapsed="0.116680"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.313201" elapsed="0.117175"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:24.310392" elapsed="0.120040"/>
</kw>
<kw name="Restart_Talking_BGP_Speaker">
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:24.432141" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:24.431827" elapsed="0.000342"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:24.432338" elapsed="0.000301"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:24.431318" elapsed="0.001382"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:34.433759" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.433191" elapsed="10.001381">No match found for '&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-05-01T00:41:34.434774" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:41:34.434823" level="INFO">${message} = No match found for '&gt;' in 10 seconds
Output:
.</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:24.432860" elapsed="10.001994"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:34.435781" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:44.010810" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:44.011145" level="INFO">${output_log} = 2026-05-01 00:41:03,904 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:41:03,905 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Ope...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:34.435596" elapsed="9.575613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.012555" level="INFO">2026-05-01 00:41:03,904 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:41:03,905 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0002143383026123047s
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:03,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:03,923 INFO BGP-Thread-1 (job): ... idle for 0.007s
2026-05-01 00:41:03,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.007s
2026-05-01 00:41:13,924 INFO BGP-Thread-1 (job): ... idle for 10.001s
2026-05-01 00:41:13,924 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.008s
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:23,935 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.019s
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:33,946 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:41:33,946 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.029s
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:43,948 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.030s
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.011733" elapsed="0.001196"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:34.435182" elapsed="9.577897"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="NOT RUN" start="2026-05-01T00:41:44.013589" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.013249" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.013200" elapsed="0.000545"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.014837" level="INFO">No match found for '&gt;' in 10 seconds
Output:
.</msg>
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.014199" elapsed="0.000747"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.016085" level="FAIL">The prompt was not seen within timeout period.</msg>
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.015300" elapsed="0.000937">The prompt was not seen within timeout period.</status>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="FAIL" start="2026-05-01T00:41:24.431006" elapsed="19.585534">The prompt was not seen within timeout period.</status>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<doc>Set suite to not fail fast.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.017098" elapsed="0.000064"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<arg>--amount 3 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_TOOL_LOG_LEVEL}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.017686" elapsed="0.000052"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.018293" elapsed="0.000052"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast. And Start it again.
We have to restart it this way because we reset session before</doc>
<status status="FAIL" start="2026-05-01T00:41:24.430625" elapsed="19.588357">The prompt was not seen within timeout period.</status>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:44.020427" elapsed="0.000519"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:44.019723" elapsed="0.001348"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:24.309839" elapsed="19.711320">The prompt was not seen within timeout period.</status>
</test>
<test id="s1-s4-t14" name="TC_PG_Check_Talking_Topology_Is_Filled" line="209">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.026399" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.026093" elapsed="0.000386">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.025868" elapsed="0.000676">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.025850" elapsed="0.000730">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.025680" elapsed="0.000985">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.026838" elapsed="0.000023"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.023435" elapsed="0.003515">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.028244" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.027926" elapsed="0.000363"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.027541" elapsed="0.000801"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.027223" elapsed="0.001178"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:44.022616" elapsed="0.005824">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t15" name="TC_PG_Reconfigure_ODL_With_Peer_Group_Without_Ipv4_Unicast" line="214">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.032499" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.032212" elapsed="0.000349">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.031993" elapsed="0.000630">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.031975" elapsed="0.000681">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.031807" elapsed="0.000939">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.032953" elapsed="0.000024"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.029276" elapsed="0.003789">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.034350" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.033922" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.033904" elapsed="0.000535"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.034610" elapsed="0.000322"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.039883" level="INFO">${test_skipped} = True</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.039437" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:41:44.040163" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.039998" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.039976" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.040404" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.040601" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.040783" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.040961" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.041131" elapsed="0.000021"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.041298" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.041481" elapsed="0.000025"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.039129" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.033713" elapsed="0.007922"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:41:44.033334" elapsed="0.008347"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.028734" elapsed="0.012984">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t16" name="TC_PG_Check_For_Empty_Topology_After_Deconfiguration" line="219">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.045735" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.045444" elapsed="0.000352">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.045219" elapsed="0.000642">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.045199" elapsed="0.000695">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.045031" elapsed="0.000953">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.046187" elapsed="0.000026"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.042665" elapsed="0.003644">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.047765" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.047439" elapsed="0.000403"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.046940" elapsed="0.000956"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.046627" elapsed="0.001325"/>
</kw>
<doc>See example-ipv4-topology empty after resetting session.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:44.042029" elapsed="0.005961">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t17" name="TC_PG_Reconfigure_ODL_To_Accept_Connection" line="224">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.051737" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.051460" elapsed="0.000338">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.051225" elapsed="0.000645">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.051207" elapsed="0.000698">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.051041" elapsed="0.000953">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.052161" elapsed="0.000023"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.048848" elapsed="0.003420">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.053518" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.053122" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.053104" elapsed="0.000500"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.053753" elapsed="0.000318"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.060832" level="INFO">${test_skipped} = True</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.060396" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:41:44.061087" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.060941" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.060919" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.061325" elapsed="0.000023"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.061516" elapsed="0.000022"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.061693" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.061891" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.062078" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.062430" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.062617" elapsed="0.000021"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.060019" elapsed="0.002677"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.052913" elapsed="0.009835"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:41:44.052553" elapsed="0.010237"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.048279" elapsed="0.014550">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t18" name="Kill_Talking_BGP_Speaker" line="248">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:44.066104" elapsed="0.000285"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:44.065841" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.067502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.067375" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.067357" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.072407" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.072300" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.072282" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.073490" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.073096" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.073972" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:44.073680" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:44.074043" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:44.074219" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.072725" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.079779" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.079672" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.079653" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.081027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.080922" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.080904" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:44.081565" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.081244" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.081969" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.081752" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.119858" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.082549" elapsed="0.037408"/>
</kw>
<msg time="2026-05-01T00:41:44.120141" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:44.120187" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.082182" elapsed="0.038039"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.141544" level="INFO">". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.120763" elapsed="0.020895"/>
</kw>
<msg time="2026-05-01T00:41:44.141825" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:44.141872" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.120395" elapsed="0.021512"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.142299" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.142042" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.142021" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.142849" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.142543" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.143193" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.142977" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.142959" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:44.143340" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.145959" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:41:44.146190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.144813" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.146680" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.147042" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:44.144176" elapsed="0.003057"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:44.143641" elapsed="0.003658"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:44.080622" elapsed="0.066775"/>
</kw>
<msg time="2026-05-01T00:41:44.147515" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.147561" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.080005" elapsed="0.067593"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:44.147786" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.147678" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.147659" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.148273" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.148631" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.148704" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:44.079319" elapsed="0.069495"/>
</kw>
<msg time="2026-05-01T00:41:44.148906" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.148950" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.074647" elapsed="0.074339"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.149312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.149062" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.149045" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:44.074502" elapsed="0.074913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:44.074299" elapsed="0.075146"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:44.071940" elapsed="0.077585"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.067081" elapsed="0.082500"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.066618" elapsed="0.083010"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:44.063673" elapsed="0.086007"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.150907" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.150596" elapsed="0.000340"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.151090" elapsed="0.000213"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:44.150308" elapsed="0.001063"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.152809" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.152102" elapsed="0.000762"/>
</kw>
<msg time="2026-05-01T00:41:44.153000" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.153044" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.151556" elapsed="0.001513"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.153696" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:44.166094" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:44.166234" level="INFO">${output_log} = 2026-05-01 00:41:03,904 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:41:03,905 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Ope...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:44.153553" elapsed="0.012717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.166885" level="INFO">2026-05-01 00:41:03,904 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:41:03,905 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:41:03,910 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:41:03,911 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:41:03,913 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0002143383026123047s
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,914 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job):   
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:41:03,915 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:03,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:03,923 INFO BGP-Thread-1 (job): ... idle for 0.007s
2026-05-01 00:41:03,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.007s
2026-05-01 00:41:13,924 INFO BGP-Thread-1 (job): ... idle for 10.001s
2026-05-01 00:41:13,924 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.008s
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:13,925 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:23,935 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.019s
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:23,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:33,946 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:41:33,946 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.029s
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:33,947 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:41:43,948 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.030s
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:41:43,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.166528" elapsed="0.000485"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:44.153257" elapsed="0.013834"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:41:44.167374" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.167181" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.167153" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.167736" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.167971" elapsed="0.000033"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:41:44.149949" elapsed="0.018175"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.169302" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.168842" elapsed="0.000518"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:44.168393" elapsed="0.001047"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:44.170256" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:44.169815" elapsed="0.000824"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:44.063126" elapsed="0.107565"/>
</test>
<test id="s1-s4-t19" name="Check_For_Empty_Topology_After_Talking" line="257">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.177142" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.176584" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.176532" elapsed="0.000820"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.176022" elapsed="0.001478"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.179957" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.179709" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.179670" elapsed="0.000451"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.188858" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.188750" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.188733" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.189965" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.189561" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.190506" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:44.190173" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:44.190578" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:41:44.190748" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.189165" elapsed="0.001608"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.196487" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.196364" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.196345" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.197787" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.197680" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.197662" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:44.198342" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.198006" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.198801" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.198575" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.231114" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.199332" elapsed="0.031882"/>
</kw>
<msg time="2026-05-01T00:41:44.231379" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:44.231425" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.198995" elapsed="0.032483"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.252654" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.231996" elapsed="0.020768"/>
</kw>
<msg time="2026-05-01T00:41:44.252999" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:44.253045" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.231655" elapsed="0.021426"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.253390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.253161" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.253140" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.253949" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.253646" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.254349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.254120" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.254100" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:44.254477" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.257089" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:41:44.257295" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.255953" elapsed="0.001478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.257736" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.258657" elapsed="0.000094"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:44.255315" elapsed="0.003583"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:44.254777" elapsed="0.004198"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:44.197345" elapsed="0.061735"/>
</kw>
<msg time="2026-05-01T00:41:44.259179" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.259227" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.196711" elapsed="0.062553"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:44.259484" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.259349" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.259330" elapsed="0.000248"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.260001" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.260343" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.260415" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:44.196024" elapsed="0.064516"/>
</kw>
<msg time="2026-05-01T00:41:44.260635" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.260679" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.191169" elapsed="0.069545"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.261047" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.260788" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.260771" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:44.191020" elapsed="0.070129"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:44.190836" elapsed="0.070346"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:44.188376" elapsed="0.072861"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.179015" elapsed="0.082330"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.177860" elapsed="0.083538"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.171837" elapsed="0.089630"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.312275" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.311899" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.313207" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.312820" elapsed="0.000469">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.313385" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.312484" elapsed="0.000925"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.313984" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.313598" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.314324" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:44.314514" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.314187" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.314943" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.314700" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.316171" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.315721" elapsed="0.000510"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.316768" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.316394" elapsed="0.000401"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.317193" elapsed="0.000045"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.317930" elapsed="0.000052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.318295" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:41:44.317005" elapsed="0.001479"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.316846" elapsed="0.001706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:44.318599" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:44.318762" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:44.315357" elapsed="0.003430"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.315054" elapsed="0.003765"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.318992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.318843" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.315035" elapsed="0.004033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.319682" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.319214" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.319758" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.311271" elapsed="0.008612"/>
</kw>
<msg time="2026-05-01T00:41:44.319980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.298993" elapsed="0.021037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.332352" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.344359" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.356381" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.356588" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.356827" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.357205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.357050" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:44.357035" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.357427" elapsed="0.000040"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.357617" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.357782" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:44.357006" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.356904" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.358013" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.358089" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:44.358207" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:44.294848" elapsed="0.063385"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.359495" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.359247" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.359651" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.358907" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.360029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.359746" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.360611" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.360281" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.360112" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.359727" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.363071" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.360847" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:41:44.363150" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:44.363306" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:44.358584" elapsed="0.004747"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.364565" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.364313" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.364723" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.363979" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:41:44.364954" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.364818" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.364800" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.365188" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.365360" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.365424" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:41:44.367779" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:44.363657" elapsed="0.004150"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.369217" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.368971" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.369672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.369416" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:44.382125" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:44.382283" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:41:44.382399" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:44.371885" elapsed="0.010542"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.369781" elapsed="0.012709"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.382674" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.382518" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.369763" elapsed="0.012995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.390164" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.384843" elapsed="0.005427"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.384312" elapsed="0.006036"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.384272" elapsed="0.006132"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.395529" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.391068" elapsed="0.004555"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.390564" elapsed="0.005095"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.390524" elapsed="0.005160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.396248" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.395851" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.396600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.396345" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.397143" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.396845" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.396683" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.396327" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.397767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.397387" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.398115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.397863" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.398671" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.398358" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.398196" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.397845" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.398903" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:44.399724" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.399407" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.399906" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:44.383345" elapsed="0.018994"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.402531" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.402409" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.402390" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:44.405384" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:44.402747" elapsed="0.002666"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:41:44.405489" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:44.405648" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:41:44.368148" elapsed="0.037526"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.405736" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:41:44.405884" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:41:44.272844" elapsed="0.133065"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.433772" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.433028" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.435828" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.435294" elapsed="0.000690">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.436115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.434016" elapsed="0.002124"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.437075" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.436305" elapsed="0.000798"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.437516" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:44.437757" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.437268" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.438399" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.437976" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:41:44.439154" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.438563" elapsed="0.000754"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.440141" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.439539" elapsed="0.000642"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.439345" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.438545" elapsed="0.001754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.441210" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.440464" elapsed="0.000775"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.441288" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.432319" elapsed="0.009095"/>
</kw>
<msg time="2026-05-01T00:41:44.441481" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.420022" elapsed="0.021509"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.454105" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.466231" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.478349" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.478592" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.478771" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.479288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.478995" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:44.478981" elapsed="0.000386"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.479523" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.479694" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.479860" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:44.478951" elapsed="0.000962"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.478847" elapsed="0.001093"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.480088" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.480164" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:41:44.480281" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:44.417414" elapsed="0.062894"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.480498" elapsed="0.002325"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:44.483901" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:44.483590" elapsed="0.000347"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:44.484389" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:44.484092" elapsed="0.000325"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:41:44.484595" elapsed="0.000332"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:41:44.483162" elapsed="0.001824"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.482908" elapsed="0.002112"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.485193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.485045" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.482890" elapsed="0.002378"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:41:44.407086" elapsed="0.078229"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:41:44.406257" elapsed="0.079132"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.406014" elapsed="0.079420"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.405996" elapsed="0.079478"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.485510" elapsed="0.000035"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:41:44.266810" elapsed="0.218833"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.262535" elapsed="0.223215"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:41:44.261983" elapsed="0.223814"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.261631" elapsed="0.224224"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.486478" elapsed="0.000242"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.486159" elapsed="0.000624"/>
</kw>
<doc>See example-ipv4-topology empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:44.171067" elapsed="0.315757"/>
</test>
<test id="s1-s4-t20" name="Start_Listening_BGP_Speaker" line="262">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.490309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.490090" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.490072" elapsed="0.000318"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.489896" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.491428" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.491321" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.491305" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.496494" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.496373" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.496356" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.497558" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.497165" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.498076" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:44.497748" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:44.498147" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:44.498301" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.496791" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.503685" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.503578" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.503560" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.504901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.504794" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.504777" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:44.505407" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.505112" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.505829" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.505612" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.542963" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.506362" elapsed="0.036701"/>
</kw>
<msg time="2026-05-01T00:41:44.543225" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:44.543271" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.506027" elapsed="0.037279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.559908" level="INFO">". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.543841" elapsed="0.016163"/>
</kw>
<msg time="2026-05-01T00:41:44.560197" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:44.560243" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.543500" elapsed="0.016780"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.560607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.560360" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.560338" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.561123" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.560828" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.561484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.561252" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.561234" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:44.561597" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.564082" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:41:44.564286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.563033" elapsed="0.001382"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.564837" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.565176" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:44.562406" elapsed="0.002953"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:44.561861" elapsed="0.003561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:44.504493" elapsed="0.061050"/>
</kw>
<msg time="2026-05-01T00:41:44.565635" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.565680" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.503907" elapsed="0.061808"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:44.565928" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.565792" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.565773" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.566414" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.566776" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.566848" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:44.503228" elapsed="0.063726"/>
</kw>
<msg time="2026-05-01T00:41:44.567046" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.567091" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.498709" elapsed="0.068418"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.567469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.567200" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.567184" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:44.498564" elapsed="0.069008"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:44.498378" elapsed="0.069222"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:44.496018" elapsed="0.071634"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.491039" elapsed="0.076667"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.490611" elapsed="0.077177"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.487773" elapsed="0.080069"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.568845" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --info &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.568518" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.569268" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --info &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.569032" elapsed="0.000281"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.569977" level="INFO">^C[?2004l[?2004h[?2004l</msg>
<msg time="2026-05-01T00:41:44.570061" level="INFO">${output} =  ^C[?2004l[?2004h[?2004l
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.569478" elapsed="0.000609"/>
</kw>
<arg>--amount 3 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --${BGP_TOOL_LOG_LEVEL}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:41:44.568065" elapsed="0.002080"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.572421" level="INFO">[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:41:44.572516" level="INFO">${text} = [?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.571847" elapsed="0.000695"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.572935" level="INFO">[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.572697" elapsed="0.000283"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="PASS" start="2026-05-01T00:41:44.571574" elapsed="0.001460"/>
</kw>
<msg time="2026-05-01T00:41:44.573106" level="FAIL">Expected error 'No match found for '&gt;' in *.' did not occur.</msg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.571071" elapsed="0.002272">Expected error 'No match found for '&gt;' in *.' did not occur.</status>
</kw>
<msg time="2026-05-01T00:41:44.573432" level="INFO">${passed} = False</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.570692" elapsed="0.002779"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-05-01T00:41:44.573620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.573547" elapsed="0.000113"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.573528" elapsed="0.000154"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.574306" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:44.587095" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:44.587304" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:44.574167" elapsed="0.013191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.588310" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.587762" elapsed="0.000641"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:44.573877" elapsed="0.014684"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.589498" level="FAIL">The prompt was seen but it was not expected yet</msg>
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.588889" elapsed="0.000745">The prompt was seen but it was not expected yet</status>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.570400" elapsed="0.019458">The prompt was seen but it was not expected yet</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.592774" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.592056" elapsed="0.000811"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.591214" elapsed="0.001765"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.590541" elapsed="0.002563"/>
</kw>
<doc>Start Python speaker in listening mode, verify that the tool does not exit quickly.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.487164" elapsed="0.106023">The prompt was seen but it was not expected yet</status>
</test>
<test id="s1-s4-t21" name="Check_Listening_Connection_Is_Not_Established_Yet" line="268">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.600315" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.600048" elapsed="0.000327">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.599830" elapsed="0.000607">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.599811" elapsed="0.000676">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.599643" elapsed="0.000930">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.600738" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.594977" elapsed="0.005869">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.602405" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.601778" elapsed="0.000688"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.601410" elapsed="0.001115"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.601113" elapsed="0.001468"/>
</kw>
<doc>See no TCP connection, as both ODL and tool are in listening mode.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.593762" elapsed="0.008863">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t22" name="Check_For_Empty_Topology_Before_Listening" line="272">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.606234" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.605927" elapsed="0.000367">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.605700" elapsed="0.000656">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.605681" elapsed="0.000708">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.605516" elapsed="0.000972">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.606653" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.603347" elapsed="0.003413">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.607993" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.607688" elapsed="0.000346"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.607320" elapsed="0.000765"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.607023" elapsed="0.001116"/>
</kw>
<doc>Sanity check example-ipv4-topology is still empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:44.602831" elapsed="0.005347">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t23" name="Reconfigure_ODL_To_Initiate_Connection" line="277">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.613398" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.613130" elapsed="0.000343">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.612915" elapsed="0.000623">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.612897" elapsed="0.000673">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.612733" elapsed="0.000920">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.613816" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.609028" elapsed="0.004907">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.615170" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.614866" elapsed="0.000390"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.614513" elapsed="0.000794"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.614200" elapsed="0.001163"/>
</kw>
<doc>Replace BGP peer config module, now with initiate-connection set to true.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.608476" elapsed="0.006925">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t24" name="Check_Listening_Connection_Is_Established" line="294">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.619010" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.618738" elapsed="0.000330">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.618522" elapsed="0.000608">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.618503" elapsed="0.000660">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.618320" elapsed="0.000926">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.619408" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.616211" elapsed="0.003321">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.620765" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.620459" elapsed="0.000347"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.620094" elapsed="0.000763"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.619799" elapsed="0.001113"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.615698" elapsed="0.005251">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t25" name="Check_Listening_Topology_Is_Filled" line="298">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.624817" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.624549" elapsed="0.000328">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:44.624317" elapsed="0.000622">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:44.624300" elapsed="0.000671">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.624135" elapsed="0.000919">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.625217" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.621826" elapsed="0.003499">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.626585" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.626264" elapsed="0.000363"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.625913" elapsed="0.000765"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:44.625606" elapsed="0.001128"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:44.621232" elapsed="0.005539">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t26" name="Kill_Listening_BGP_Speaker" line="303">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:44.629952" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:44.629680" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.631183" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.631076" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.631058" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.636102" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.635996" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.635978" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.637154" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.636780" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.637649" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:44.637341" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:44.637720" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:44.637889" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.636391" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.643392" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.643284" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.643266" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.644640" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.644533" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.644515" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:44.645149" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.644855" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.645561" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.645335" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.678747" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.646117" elapsed="0.032735"/>
</kw>
<msg time="2026-05-01T00:41:44.679030" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:44.679078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.645748" elapsed="0.033365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.696849" level="INFO">". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.679669" elapsed="0.017277"/>
</kw>
<msg time="2026-05-01T00:41:44.697106" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:44.697151" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.679291" elapsed="0.017895"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.697520" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.697265" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.697245" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.698065" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.697745" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.698411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.698194" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.698176" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:44.698539" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.700996" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:41:44.701197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.699950" elapsed="0.001376"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.701655" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.702004" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:44.699321" elapsed="0.002868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:44.698800" elapsed="0.003452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:44.644204" elapsed="0.058144"/>
</kw>
<msg time="2026-05-01T00:41:44.702439" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.702501" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.643635" elapsed="0.058903"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:44.702721" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.702615" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.702597" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.703194" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.703547" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.703621" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:44.642947" elapsed="0.060781"/>
</kw>
<msg time="2026-05-01T00:41:44.703819" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.703862" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.638281" elapsed="0.065616"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.704226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.703974" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.703955" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:44.638138" elapsed="0.066187"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:44.637967" elapsed="0.066387"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:44.635609" elapsed="0.068798"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.630790" elapsed="0.073692"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.630357" elapsed="0.074171"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:44.627597" elapsed="0.076982"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.705747" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.705422" elapsed="0.000352"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.705942" elapsed="0.000213"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:44.705160" elapsed="0.001053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.707946" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --info &amp;&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.706967" elapsed="0.001029"/>
</kw>
<msg time="2026-05-01T00:41:44.708087" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.708129" level="INFO">${message} =  python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --info &amp;&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.706378" elapsed="0.001775"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.708756" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:44.721100" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:44.721305" level="INFO">${output_log} = 2026-05-01 00:41:44,647 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:44.708619" elapsed="0.012868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.722713" level="INFO">2026-05-01 00:41:44,647 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.722039" elapsed="0.000786"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:44.708334" elapsed="0.014615"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:41:44.723359" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.723099" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.723057" elapsed="0.000517"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.723927" elapsed="0.000048"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.724298" elapsed="0.000043"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:41:44.704841" elapsed="0.019649"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.726263" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.725539" elapsed="0.000815"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:44.724911" elapsed="0.001599"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:44.727727" elapsed="0.000443"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:44.727059" elapsed="0.001227"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:44.627058" elapsed="0.101310"/>
</test>
<test id="s1-s4-t27" name="Check_For_Empty_Topology_After_Listening" line="312">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.734003" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.733606" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.733579" elapsed="0.000558"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:44.733314" elapsed="0.000892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.735933" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.735764" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.735737" elapsed="0.000306"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.742327" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.742218" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.742199" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.743388" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.743012" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.743889" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:44.743596" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:44.743959" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:41:44.744115" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.742639" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.749691" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.749583" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.749564" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.750956" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.750851" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.750833" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:44.751531" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.751216" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.751932" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.751720" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.785445" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:44.752471" elapsed="0.033093"/>
</kw>
<msg time="2026-05-01T00:41:44.785729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:44.785775" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.752120" elapsed="0.033712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:44.808092" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:44.786353" elapsed="0.021841"/>
</kw>
<msg time="2026-05-01T00:41:44.808353" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:44.808398" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.786010" elapsed="0.022423"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.808758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.808534" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.808512" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.809274" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.808981" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.809645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.809405" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.809388" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:44.809755" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:44.812244" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:41:44.812446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.811178" elapsed="0.001416"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.812869" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.813202" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:44.810568" elapsed="0.002816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:44.810027" elapsed="0.003436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:44.750552" elapsed="0.063011"/>
</kw>
<msg time="2026-05-01T00:41:44.813653" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.813697" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.749946" elapsed="0.063786"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:44.813926" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.813819" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.813801" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.814405" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.814770" elapsed="0.000058"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.814879" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:44.749227" elapsed="0.065761"/>
</kw>
<msg time="2026-05-01T00:41:44.815081" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:44.815124" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.744522" elapsed="0.070636"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.815500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.815234" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.815216" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:44.744363" elapsed="0.071239"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:44.744192" elapsed="0.071439"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:44.741850" elapsed="0.073835"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.735250" elapsed="0.080489"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:44.734473" elapsed="0.081309"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:44.730097" elapsed="0.085735"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.866588" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.866193" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.867654" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.867258" elapsed="0.000465">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.867818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.866779" elapsed="0.001063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.868388" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.868007" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.868737" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:44.868893" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.868600" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.869319" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.869078" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.870554" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.870101" elapsed="0.000513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.871134" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.870775" elapsed="0.000385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.871565" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.872280" elapsed="0.000049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.872635" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:41:44.871362" elapsed="0.001487"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.871207" elapsed="0.001708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:44.872963" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:44.873125" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:44.869757" elapsed="0.003393"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.869430" elapsed="0.003752"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.873355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.873206" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.869411" elapsed="0.004021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.874043" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.873594" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.874120" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.865558" elapsed="0.008685"/>
</kw>
<msg time="2026-05-01T00:41:44.874296" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.853241" elapsed="0.021103"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.886686" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.898733" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.910794" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.910988" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.911164" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.911557" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.911384" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:44.911369" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.911782" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.911953" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.912121" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:44.911340" elapsed="0.000938"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.911238" elapsed="0.001068"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.912474" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.912588" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:44.912708" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:44.849071" elapsed="0.063662"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.914004" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.913768" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.914158" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.913384" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.914516" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.914252" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.915062" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.914767" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.914599" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.914235" elapsed="0.000908"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.917424" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.915295" elapsed="0.002168"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:41:44.917516" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:44.917670" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:44.913061" elapsed="0.004634"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.918934" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.918705" elapsed="0.000291">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.919088" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.918347" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:41:44.919316" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:44.919182" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.919164" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.919565" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.919739" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.919803" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:44.921825" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:44.918024" elapsed="0.003827"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.923235" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.922991" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.923691" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.923435" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:44.932669" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:44.932832" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:41:44.932940" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:44.925840" elapsed="0.007127"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.923798" elapsed="0.009216"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.933195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.933040" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.923780" elapsed="0.009500"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.938032" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.934520" elapsed="0.003581"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.934170" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.934144" elapsed="0.004045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.942400" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.938618" elapsed="0.003870"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.938269" elapsed="0.004273"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.938246" elapsed="0.004333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.943381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.942821" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.943898" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.943546" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.944720" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.944258" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.944019" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.943519" elapsed="0.001324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.945630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.945079" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:44.946104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.945809" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.946663" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.946345" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.946184" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.945782" elapsed="0.000962"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.946892" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:44.947712" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.947403" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:44.947893" elapsed="0.002265"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:44.933656" elapsed="0.016564"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:44.950394" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:44.950289" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.950271" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:44.953233" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:44.950627" elapsed="0.002635"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:41:44.953312" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:44.953519" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:41:44.922169" elapsed="0.031410"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.953645" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:41:44.953810" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:41:44.827133" elapsed="0.126703"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.981896" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.981124" elapsed="0.000801"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.983903" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:44.983364" elapsed="0.000687">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:44.984359" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:44.982088" elapsed="0.002296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.985322" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:44.984579" elapsed="0.000771"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:44.985772" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:44.985998" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:44.985529" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.986617" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:44.986184" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:41:44.987340" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:44.986747" elapsed="0.000769"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.988318" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:44.987720" elapsed="0.000638"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.987544" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.986728" elapsed="0.001836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:44.989463" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.988715" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:44.989542" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:44.980410" elapsed="0.009258"/>
</kw>
<msg time="2026-05-01T00:41:44.989733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:44.968114" elapsed="0.021669"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.002026" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.014116" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.026340" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.026549" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.026726" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.027090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.026946" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:45.026932" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.027310" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.027492" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.027660" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:45.026902" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.026800" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.027884" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.027960" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:41:45.028077" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:44.965521" elapsed="0.062583"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.028281" elapsed="0.002326"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:45.031660" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:45.031335" elapsed="0.000354"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:45.032143" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:45.031842" elapsed="0.000329"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:41:45.032324" elapsed="0.000385"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:41:45.030929" elapsed="0.001840"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.030688" elapsed="0.002114"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.032977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.032828" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.030670" elapsed="0.002383"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:41:44.954969" elapsed="0.078132"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:41:44.954161" elapsed="0.079015"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:44.953919" elapsed="0.079302"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:44.953902" elapsed="0.079342"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.033278" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:41:44.821098" elapsed="0.212305"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.816824" elapsed="0.216656"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:41:44.816315" elapsed="0.217211"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:44.815977" elapsed="0.217606"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.034160" elapsed="0.000238"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.033861" elapsed="0.000616"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:44.729220" elapsed="0.305298"/>
</test>
<test id="s1-s4-t28" name="Start_Listening_BGP_Speaker_Case_2" line="317">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.038050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.037827" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.037809" elapsed="0.000321"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.037619" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.039156" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.039050" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.039033" elapsed="0.000191"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.043991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.043885" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.043868" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.045130" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.044752" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.045628" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.045316" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.045714" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:45.045869" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.044283" elapsed="0.001611"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.051379" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.051272" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.051254" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.052608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.052500" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.052481" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.053158" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.052861" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.053575" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.053343" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.087737" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.054109" elapsed="0.033733"/>
</kw>
<msg time="2026-05-01T00:41:45.088012" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.088059" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.053774" elapsed="0.034320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.109679" level="INFO">". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.088652" elapsed="0.021251"/>
</kw>
<msg time="2026-05-01T00:41:45.110260" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.110361" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.088272" elapsed="0.022166"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.111143" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.110653" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.110608" elapsed="0.000707"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.112340" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.111687" elapsed="0.000829"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.113142" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.112669" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.112630" elapsed="0.000682"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.113386" elapsed="0.000089"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.118640" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:41:45.118845" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.116631" elapsed="0.002343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.119247" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.119614" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.115186" elapsed="0.004613"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.114007" elapsed="0.005856"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.052180" elapsed="0.067782"/>
</kw>
<msg time="2026-05-01T00:41:45.120059" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.120103" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.051615" elapsed="0.068523"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.120322" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.120215" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.120197" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.120824" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.121203" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.121274" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.050934" elapsed="0.070449"/>
</kw>
<msg time="2026-05-01T00:41:45.121491" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.121537" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.046256" elapsed="0.075317"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.121911" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.121661" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.121643" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.046112" elapsed="0.075899"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.045945" elapsed="0.076094"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.043533" elapsed="0.078560"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.038769" elapsed="0.083379"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.038324" elapsed="0.083868"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.035499" elapsed="0.086745"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.123248" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --info &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.122922" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.123707" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --info &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.123435" elapsed="0.000318"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.124256" level="INFO">play.py.out</msg>
<msg time="2026-05-01T00:41:45.124339" level="INFO">${output} =  play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.123902" elapsed="0.000462"/>
</kw>
<arg>--amount 3 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --${BGP_TOOL_LOG_LEVEL}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:41:45.122473" elapsed="0.001947"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.126962" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:41:45.127044" level="INFO">${text} = [?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.126257" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.127490" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.127222" elapsed="0.000316"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="PASS" start="2026-05-01T00:41:45.125984" elapsed="0.001610"/>
</kw>
<msg time="2026-05-01T00:41:45.127665" level="FAIL">Expected error 'No match found for '&gt;' in *.' did not occur.</msg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.125540" elapsed="0.002184">Expected error 'No match found for '&gt;' in *.' did not occur.</status>
</kw>
<msg time="2026-05-01T00:41:45.127813" level="INFO">${passed} = False</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.125171" elapsed="0.002666"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-05-01T00:41:45.127983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.127910" elapsed="0.000113"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.127892" elapsed="0.000153"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.128746" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:45.141396" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:45.141747" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:45.128605" elapsed="0.013200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.142750" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.142160" elapsed="0.000681"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:45.128240" elapsed="0.014723"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.143896" level="FAIL">The prompt was seen but it was not expected yet</msg>
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.143284" elapsed="0.000741">The prompt was seen but it was not expected yet</status>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.124681" elapsed="0.019567">The prompt was seen but it was not expected yet</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.147103" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.146393" elapsed="0.000800"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.145599" elapsed="0.001706"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.144901" elapsed="0.002528"/>
</kw>
<doc>BGP Speaker introduces 2 prefixes in the first update &amp; another 2 prefixes while the very first is withdrawn in 2nd update</doc>
<status status="FAIL" start="2026-05-01T00:41:45.034806" elapsed="0.112739">The prompt was seen but it was not expected yet</status>
</test>
<test id="s1-s4-t29" name="Check_Listening_Connection_Is_Established_Case_2" line="323">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.153699" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.153267" elapsed="0.000520">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:45.152949" elapsed="0.000929">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:45.152923" elapsed="0.001003">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.152679" elapsed="0.001371">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.154289" elapsed="0.000032"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.149106" elapsed="0.005340">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.156291" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.155842" elapsed="0.000509"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.155300" elapsed="0.001124"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.154863" elapsed="0.001665"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.147975" elapsed="0.008608">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t30" name="Check_Listening_Topology_Is_Filled_Case_2" line="327">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.163442" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.163173" elapsed="0.000346">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:45.162951" elapsed="0.000631">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:45.162933" elapsed="0.000682">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.162767" elapsed="0.000933">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.163862" elapsed="0.000022"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.157920" elapsed="0.006050">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.165210" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.164906" elapsed="0.000345"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.164555" elapsed="0.000781"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.164242" elapsed="0.001150"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:45.157004" elapsed="0.008424">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t31" name="Kill_Listening_BGP_Speaker_Case_2" line="332">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:45.168682" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:45.168406" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.169942" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.169834" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.169814" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.174846" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.174741" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.174723" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.175902" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.175528" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.176392" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.176090" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.176478" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:45.176637" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.175141" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.182185" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.182078" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.182060" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.183390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.183284" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.183266" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.183927" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.183633" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.184319" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.184111" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.218204" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.184854" elapsed="0.033454"/>
</kw>
<msg time="2026-05-01T00:41:45.218498" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.218546" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.184522" elapsed="0.034059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.237795" level="INFO">". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.219101" elapsed="0.018797"/>
</kw>
<msg time="2026-05-01T00:41:45.238059" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.238104" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.218758" elapsed="0.019380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.238467" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.238219" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.238199" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.239036" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.238736" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.239382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.239167" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.239148" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.239517" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.242020" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:41:45.242223" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.240944" elapsed="0.001406"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.242641" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.242973" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.240306" elapsed="0.002850"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.239778" elapsed="0.003442"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.182985" elapsed="0.060331"/>
</kw>
<msg time="2026-05-01T00:41:45.243407" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.243468" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.182406" elapsed="0.061098"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.243689" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.243582" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.243563" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.244171" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.244542" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.244615" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.181739" elapsed="0.062984"/>
</kw>
<msg time="2026-05-01T00:41:45.244814" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.244857" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.177031" elapsed="0.067860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.245214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.244967" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.244949" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.176883" elapsed="0.068430"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.176715" elapsed="0.068627"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.174369" elapsed="0.071025"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.169519" elapsed="0.075943"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.169087" elapsed="0.076422"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:45.166304" elapsed="0.079270"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.246742" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.246418" elapsed="0.000351"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.246957" elapsed="0.000220"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:45.246157" elapsed="0.001089"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.249680" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --info &amp;&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.247989" elapsed="0.001744"/>
</kw>
<msg time="2026-05-01T00:41:45.249824" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.249867" level="INFO">${message} =  python3 play.py --amount 3 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --info &amp;&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.247402" elapsed="0.002490"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.250501" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:45.264542" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:45.264894" level="INFO">${output_log} = 2026-05-01 00:41:45,205 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:45.250349" elapsed="0.014649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.266673" level="INFO">2026-05-01 00:41:45,205 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.265787" elapsed="0.001026"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:45.250077" elapsed="0.016893"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:41:45.267562" elapsed="0.000098"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.267182" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.267116" elapsed="0.000710"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.268301" elapsed="0.000076"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.268857" elapsed="0.000052"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:41:45.245842" elapsed="0.023221"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.271169" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.270400" elapsed="0.000862"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:45.269682" elapsed="0.001709"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:45.272686" elapsed="0.000952"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:45.271989" elapsed="0.001772"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:45.165759" elapsed="0.108092"/>
</test>
<test id="s1-s4-t32" name="Check_For_Empty_Topology_After_Listening_Case_2" line="341">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.277747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.277491" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.277470" elapsed="0.000360"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.277287" elapsed="0.000591"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.279086" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.278977" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.278960" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.284063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.283955" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.283938" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.285163" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.284767" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.285788" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.285355" elapsed="0.000460"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.285861" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:41:45.286027" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.284369" elapsed="0.001682"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.291759" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.291646" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.291626" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.293049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.292942" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.292924" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.293638" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.293270" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.294055" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.293832" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.329885" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.294602" elapsed="0.035515"/>
</kw>
<msg time="2026-05-01T00:41:45.330361" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.330410" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.294244" elapsed="0.036202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.351822" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.331275" elapsed="0.020674"/>
</kw>
<msg time="2026-05-01T00:41:45.352117" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.352162" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.330788" elapsed="0.021411"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.352609" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.352305" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.352271" elapsed="0.000427"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.353180" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "_ "C "a "s "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.352851" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.353587" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.353322" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.353303" elapsed="0.000367"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.353711" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.356549" elapsed="0.000155"/>
</kw>
<msg time="2026-05-01T00:41:45.356768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.355347" elapsed="0.001564"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.357192" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.357580" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.354671" elapsed="0.003105"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.354066" elapsed="0.003849"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.292640" elapsed="0.065379"/>
</kw>
<msg time="2026-05-01T00:41:45.358116" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.358161" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.291990" elapsed="0.066207"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.358389" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.358279" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.358259" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.358927" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.359278" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.359350" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.291280" elapsed="0.068198"/>
</kw>
<msg time="2026-05-01T00:41:45.359581" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.359626" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.286442" elapsed="0.073219"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.359992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.359740" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.359722" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.286296" elapsed="0.073799"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.286112" elapsed="0.074024"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.283592" elapsed="0.076609"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.278682" elapsed="0.081582"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.278033" elapsed="0.082280"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.274937" elapsed="0.085435"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.413360" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.412924" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.414421" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.413985" elapsed="0.000552">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:45.414637" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.413630" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.415227" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.414834" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.415585" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:45.415761" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:45.415419" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.416281" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.416025" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.417635" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.417158" elapsed="0.000538"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.418230" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.417862" elapsed="0.000394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.418702" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.419433" elapsed="0.000080"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.419805" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:41:45.418506" elapsed="0.001470"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.418315" elapsed="0.001732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:45.420103" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:41:45.420282" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:45.416799" elapsed="0.003508"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.416417" elapsed="0.003922"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.420535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.420366" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.416386" elapsed="0.004229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.421224" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.420762" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.421300" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.412200" elapsed="0.009227"/>
</kw>
<msg time="2026-05-01T00:41:45.421524" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.399681" elapsed="0.021896"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.434021" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.446216" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.458541" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.458749" elapsed="0.000099"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.459015" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.459459" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.459293" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:45.459271" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.459700" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.459872" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.460039" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:45.459225" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.459108" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.460269" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.460346" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:45.460496" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:45.395091" elapsed="0.065434"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.461885" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.461622" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:45.462062" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.461211" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.462415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.462161" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.462993" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.462700" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.462514" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.462143" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.465357" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.463227" elapsed="0.002157"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:41:45.465436" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T00:41:45.465621" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:45.460857" elapsed="0.004789"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.466860" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.466628" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:45.467015" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.466278" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:41:45.467242" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.467109" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.467091" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.467491" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.467707" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.467776" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:41:45.470004" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:45.465957" elapsed="0.004074"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.471473" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.471210" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.471919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.471677" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:45.479587" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:45.479729" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:41:45.479846" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:45.474139" elapsed="0.005733"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.472030" elapsed="0.007885"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.480191" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.479945" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.472011" elapsed="0.008357"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.485255" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.481911" elapsed="0.003428"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.481596" elapsed="0.003794"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.481570" elapsed="0.003855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.489037" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.485849" elapsed="0.003251"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.485535" elapsed="0.003614"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.485511" elapsed="0.003672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.490091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.489444" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.490429" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.490189" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.490992" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.490692" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.490527" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.490171" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.491635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.491255" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.491961" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.491730" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.492510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.492203" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.492042" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.491712" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.492750" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:45.493675" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.493319" elapsed="0.000383"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.493860" elapsed="0.002275"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:45.480965" elapsed="0.015237"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.496385" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.496276" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.496257" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:45.499338" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:45.496625" elapsed="0.002742"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:41:45.499419" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:41:45.499612" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:41:45.470367" elapsed="0.029272"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.499706" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:41:45.499864" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:41:45.372644" elapsed="0.127246"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.528384" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.527641" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.530533" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.529939" elapsed="0.000765">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:45.530838" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.528608" elapsed="0.002255"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.531809" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.531035" elapsed="0.000802"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.532241" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:45.532534" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:45.532000" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.533148" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.532723" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:41:45.533983" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.533295" elapsed="0.000858"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.534988" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.534365" elapsed="0.000728"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.534185" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.533266" elapsed="0.001937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.536141" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.535356" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.536222" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.526901" elapsed="0.009456"/>
</kw>
<msg time="2026-05-01T00:41:45.536413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.514436" elapsed="0.022126"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.548893" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.560972" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.573159" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.573405" elapsed="0.000068"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.573645" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.574110" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.573951" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:45.573930" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.574342" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.574528" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.574700" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:45.573883" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.573736" elapsed="0.001049"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.574937" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.575020" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:41:45.575183" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:45.511822" elapsed="0.063461"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.575486" elapsed="0.002768"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:45.579573" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:45.579127" elapsed="0.000475"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:45.580073" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:45.579760" elapsed="0.000342"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:41:45.580261" elapsed="0.000374"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:41:45.578658" elapsed="0.002041"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.578345" elapsed="0.002388"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.580911" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.580761" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.578323" elapsed="0.002665"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:41:45.501084" elapsed="0.079955"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:41:45.500246" elapsed="0.080877"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.499975" elapsed="0.081196"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.499958" elapsed="0.081238"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.581235" elapsed="0.000038"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:41:45.366020" elapsed="0.215358"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.361543" elapsed="0.220109"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:41:45.360964" elapsed="0.220740"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.360563" elapsed="0.221202"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.582369" elapsed="0.000261"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.582063" elapsed="0.000630"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:45.274285" elapsed="0.308448"/>
</test>
<test id="s1-s4-t33" name="Start_Listening_BGP_Speaker_Case_3" line="346">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.586511" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.586265" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.586246" elapsed="0.000349"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.586078" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.587658" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.587549" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.587532" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.592704" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.592512" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.592494" elapsed="0.000282"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.593811" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.593391" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.594295" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.594001" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.594365" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:41:45.594541" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.593012" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.600163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.600053" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.600034" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.601486" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.601328" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.601311" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.602031" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.601710" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.602462" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.602225" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.639516" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.602991" elapsed="0.036681"/>
</kw>
<msg time="2026-05-01T00:41:45.639872" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.639918" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.602654" elapsed="0.037303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.659336" level="INFO">". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.640610" elapsed="0.018835"/>
</kw>
<msg time="2026-05-01T00:41:45.659634" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.659681" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.640177" elapsed="0.019539"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.660082" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.659816" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.659786" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.660674" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.660317" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.661041" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.660819" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.660800" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.661163" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.663907" elapsed="0.000156"/>
</kw>
<msg time="2026-05-01T00:41:45.664126" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.662761" elapsed="0.001504"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.664646" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.664985" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.662096" elapsed="0.003077"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.661520" elapsed="0.003721"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.601028" elapsed="0.064314"/>
</kw>
<msg time="2026-05-01T00:41:45.665474" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.665522" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.600390" elapsed="0.065169"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.665753" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.665641" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.665621" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.666273" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.666639" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.666712" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.599709" elapsed="0.067117"/>
</kw>
<msg time="2026-05-01T00:41:45.666925" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.666969" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "S "t "a "r "t "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.594962" elapsed="0.072044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.667339" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.667086" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.667070" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.594815" elapsed="0.072623"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.594629" elapsed="0.072863"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.592139" elapsed="0.075414"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.587239" elapsed="0.080375"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.586795" elapsed="0.080866"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.583852" elapsed="0.083865"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.668767" level="INFO">${command} = python3 play.py --amount 2 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=0 --insert=3 --withdraw=1 --updates=single --info &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.668405" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.669199" level="INFO">python3 play.py --amount 2 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=0 --insert=3 --withdraw=1 --updates=single --info &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.668956" elapsed="0.000288"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.669913" level="INFO">play.py.out</msg>
<msg time="2026-05-01T00:41:45.669999" level="INFO">${output} =  play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.669422" elapsed="0.000602"/>
</kw>
<arg>--amount 2 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --prefill=0 --insert=3 --withdraw=1 --updates=single --${BGP_TOOL_LOG_LEVEL}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:41:45.667945" elapsed="0.002139"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.672700" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:41:45.672783" level="INFO">${text} = [?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.672004" elapsed="0.000805"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.673205" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.672966" elapsed="0.000285"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="PASS" start="2026-05-01T00:41:45.671732" elapsed="0.001574"/>
</kw>
<msg time="2026-05-01T00:41:45.673400" level="FAIL">Expected error 'No match found for '&gt;' in *.' did not occur.</msg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.671283" elapsed="0.002235">Expected error 'No match found for '&gt;' in *.' did not occur.</status>
</kw>
<msg time="2026-05-01T00:41:45.673614" level="INFO">${passed} = False</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.670878" elapsed="0.002761"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-05-01T00:41:45.673792" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.673717" elapsed="0.000115"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.673698" elapsed="0.000156"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.674479" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:45.686921" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:45.687062" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:45.674325" elapsed="0.012773"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.687763" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.687344" elapsed="0.000480"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:45.674049" elapsed="0.013860"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.688555" level="FAIL">The prompt was seen but it was not expected yet</msg>
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.688131" elapsed="0.000520">The prompt was seen but it was not expected yet</status>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.670344" elapsed="0.018464">The prompt was seen but it was not expected yet</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.691225" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.690540" elapsed="0.000778"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.689803" elapsed="0.001629"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.689267" elapsed="0.002320"/>
</kw>
<doc>BGP Speaker introduces 3 prefixes while the first one occures again in the withdrawn list (to be ignored by controller)</doc>
<status status="FAIL" start="2026-05-01T00:41:45.583167" elapsed="0.108507">The prompt was seen but it was not expected yet</status>
</test>
<test id="s1-s4-t34" name="Check_Listening_Connection_Is_Established_Case_3" line="352">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.700298" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.699664" elapsed="0.000775">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:45.699121" elapsed="0.001492">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:45.699074" elapsed="0.001617">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.698702" elapsed="0.002188">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.701258" elapsed="0.000048"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.693729" elapsed="0.007847">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.703114" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.702796" elapsed="0.000361"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.702420" elapsed="0.000787"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.702120" elapsed="0.001141"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.692423" elapsed="0.010992">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t35" name="Check_Listening_Topology_Is_Filled_Case_3" line="356">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.707584" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.707281" elapsed="0.000366">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T00:41:45.707051" elapsed="0.000659">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T00:41:45.707031" elapsed="0.000714">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.706864" elapsed="0.000967">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.707997" elapsed="0.000025"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.704358" elapsed="0.003752">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.709372" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.709051" elapsed="0.000364"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.708694" elapsed="0.000790"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:45.708379" elapsed="0.001163"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:41:45.703736" elapsed="0.005844">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s4-t36" name="Kill_Listening_BGP_Speaker_Case_3" line="361">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:45.712835" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:41:45.712569" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.714138" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.714022" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.714002" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.719171" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.719060" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.719042" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.720270" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.719876" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.720773" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.720473" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.720843" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:41:45.721007" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.719493" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.728564" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.728440" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.728421" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.729880" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.729773" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.729755" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.730610" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.730103" elapsed="0.000534"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.731016" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.730798" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.770263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.731618" elapsed="0.038760"/>
</kw>
<msg time="2026-05-01T00:41:45.770605" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.770653" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.731204" elapsed="0.039484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.792121" level="INFO">". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.771252" elapsed="0.020973"/>
</kw>
<msg time="2026-05-01T00:41:45.792384" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.792430" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.770881" elapsed="0.021610"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.792819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.792580" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.792555" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.793363" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.793049" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.793733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.793515" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.793495" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.793848" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.796527" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:41:45.796738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.795359" elapsed="0.001513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.797151" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.797530" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.794724" elapsed="0.002991"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.794159" elapsed="0.003619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.729430" elapsed="0.068444"/>
</kw>
<msg time="2026-05-01T00:41:45.797966" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.798010" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.728789" elapsed="0.069258"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.798236" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.798127" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.798105" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.798750" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.799096" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.799168" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.728097" elapsed="0.071183"/>
</kw>
<msg time="2026-05-01T00:41:45.799373" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.799417" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "K "i "l "l "_ "L "i "s "t "e "n "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "_ "C "a ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.721443" elapsed="0.078068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.799849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.799592" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.799574" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.721284" elapsed="0.078671"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.721097" elapsed="0.078892"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.718694" elapsed="0.081354"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.713725" elapsed="0.086382"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.713244" elapsed="0.086910"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:41:45.710434" elapsed="0.089773"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.801628" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.801106" elapsed="0.000550"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.801814" elapsed="0.000234"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:41:45.800837" elapsed="0.001270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.804317" level="INFO">python3 play.py --amount 2 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=0 --insert=3 --withdraw=1 --updates=single --info &amp;&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.802875" elapsed="0.001497"/>
</kw>
<msg time="2026-05-01T00:41:45.804490" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.804537" level="INFO">${message} =  python3 play.py --amount 2 --listen --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --prefill=0 --insert=3 --withdraw=1 --updates=single --info &amp;&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.802273" elapsed="0.002289"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.805171" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:41:45.817549" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:45.817690" level="INFO">${output_log} = 2026-05-01 00:41:45,750 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:45.805031" elapsed="0.012702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.818355" level="INFO">2026-05-01 00:41:45,750 INFO BGP-Thread-1 (job): Connecting in the listening mode.
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.817972" elapsed="0.000457"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:41:45.804757" elapsed="0.013783"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:41:45.818796" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.818634" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.818607" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.819143" elapsed="0.000032"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.819390" elapsed="0.000029"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:41:45.800511" elapsed="0.019012"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.820714" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.820220" elapsed="0.000554"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:45.819802" elapsed="0.001058"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:41:45.821722" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:41:45.821230" elapsed="0.000877"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:45.709881" elapsed="0.112280"/>
</test>
<test id="s1-s4-t37" name="Check_For_Empty_Topology_After_Listening_Case_3" line="370">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.828161" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.827842" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.827816" elapsed="0.000463"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:45.827570" elapsed="0.000776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.829899" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.829737" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.829710" elapsed="0.000293"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.836296" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.836191" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.836173" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.837382" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.836984" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.837886" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:45.837589" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:45.837957" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:45.838113" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.836610" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.843688" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.843579" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.843560" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.844927" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:45.844821" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.844803" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:45.845500" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.845144" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.845909" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.845693" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.881887" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:45.846437" elapsed="0.035707"/>
</kw>
<msg time="2026-05-01T00:41:45.882390" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:45.882440" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.846099" elapsed="0.036422"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:45.906736" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:45.883307" elapsed="0.023543"/>
</kw>
<msg time="2026-05-01T00:41:45.907012" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:45.907057" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.882818" elapsed="0.024275"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.907497" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.907203" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.907168" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.908062" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e "r "_ "L "i "s "t "e "n "i "n "g "_ "C "a "s "e "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.907740" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.908521" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.908274" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.908256" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:45.908640" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:45.911559" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:41:45.911772" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.910300" elapsed="0.001611"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.912192" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.912721" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:45.909638" elapsed="0.003273"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:45.909010" elapsed="0.003967"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:45.844524" elapsed="0.068552"/>
</kw>
<msg time="2026-05-01T00:41:45.913170" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.913214" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.843914" elapsed="0.069350"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:45.913468" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:45.913344" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.913326" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.913974" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.914328" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.914399" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:45.843229" elapsed="0.071300"/>
</kw>
<msg time="2026-05-01T00:41:45.914625" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:45.914669" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "y "_ "A "f "t "e ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.838537" elapsed="0.076169"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.915037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.914783" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.914766" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:45.838377" elapsed="0.076762"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:45.838197" elapsed="0.076978"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:45.835833" elapsed="0.079401"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.829239" elapsed="0.086052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:45.828592" elapsed="0.086746"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:45.823762" elapsed="0.091630"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.967301" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:45.966901" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.968250" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:45.967869" elapsed="0.000460">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:45.968424" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:45.967516" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.969031" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:45.968646" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:45.969404" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:45.969582" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:45.969258" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.970027" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.969769" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.971293" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:45.970838" elapsed="0.000516"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.971891" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:45.971532" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.972329" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.973110" elapsed="0.000051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.973508" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:41:45.972139" elapsed="0.001547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:41:45.971973" elapsed="0.001782"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:45.973806" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:41:45.973977" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:45.970487" elapsed="0.003515"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:45.970154" elapsed="0.003885"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.974214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:45.974064" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:45.970129" elapsed="0.004174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:45.974918" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.974468" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:45.974994" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:45.966187" elapsed="0.008932"/>
</kw>
<msg time="2026-05-01T00:41:45.975173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:45.953731" elapsed="0.021491"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:45.987913" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.000337" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.012550" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.012828" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.013021" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.013501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.013330" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:46.013311" elapsed="0.000277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.013738" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.013910" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.014083" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:46.013263" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.013109" elapsed="0.001058"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.014318" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.014400" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:41:46.014585" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:45.949501" elapsed="0.065113"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.016086" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:46.015777" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:46.016262" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:46.015343" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.016649" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.016357" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.017246" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.016916" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.016733" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.016339" elapsed="0.000997"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.019669" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.017507" elapsed="0.002189"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:41:46.019748" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:41:46.019907" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:46.014977" elapsed="0.005018"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.021300" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:46.020996" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:46.021485" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:46.020660" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:41:46.021721" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:46.021583" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.021565" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.021957" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.022139" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.022205" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:41:46.024256" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:41:46.020318" elapsed="0.003965"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.025722" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.025464" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.026165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.025925" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:46.035482" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:46.035633" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:41:46.035752" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:46.028316" elapsed="0.007463"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.026272" elapsed="0.009552"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.036016" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.035852" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.026254" elapsed="0.009853"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.039974" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.037537" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.037106" elapsed="0.002950"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.037088" elapsed="0.002994"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.042633" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.040363" elapsed="0.002316"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.040137" elapsed="0.002576"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.040121" elapsed="0.002617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.043322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.042916" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.043677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.043419" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.044225" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.043925" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.043760" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.043401" elapsed="0.001003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.044952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.044582" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.045301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.045049" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.045859" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.045562" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.045383" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.045031" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.046100" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:46.046936" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.046631" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.047120" elapsed="0.002296"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:46.036674" elapsed="0.012829"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.049687" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.049576" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.049558" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:46.052572" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.049911" elapsed="0.002690"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:41:46.052652" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:41:46.052821" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:41:46.024619" elapsed="0.028228"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:46.052911" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:41:46.053070" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:41:45.927124" elapsed="0.125972"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.081581" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.080817" elapsed="0.000794"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.083701" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:46.083087" elapsed="0.000779">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:46.084002" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:46.081780" elapsed="0.002247"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.084981" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.084195" elapsed="0.000814"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.085524" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:46.085782" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:46.085258" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.086394" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.085970" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:41:46.087194" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.086550" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.088201" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.087579" elapsed="0.000664"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.087384" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.086527" elapsed="0.001823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.089312" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.088531" elapsed="0.000810"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:46.089393" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:46.080070" elapsed="0.009614"/>
</kw>
<msg time="2026-05-01T00:41:46.089739" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.067590" elapsed="0.022201"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.102004" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.114201" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.126337" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.126592" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.126782" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.127223" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.127068" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:46.127048" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.127545" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.127720" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.127889" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:46.127003" elapsed="0.000939"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.126870" elapsed="0.001117"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.128160" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.128242" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:41:46.128397" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:46.064964" elapsed="0.063463"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.128627" elapsed="0.002573"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:46.132423" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.132028" elapsed="0.000452"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:41:46.132942" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.132639" elapsed="0.000332"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:41:46.133127" elapsed="0.000371"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:41:46.131575" elapsed="0.001985"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.131283" elapsed="0.002310"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.133769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.133619" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.131263" elapsed="0.002582"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:41:46.054269" elapsed="0.079627"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:41:46.053444" elapsed="0.080533"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.053192" elapsed="0.080833"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.053164" elapsed="0.080887"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:46.134091" elapsed="0.000035"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:41:45.920967" elapsed="0.213263"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.916439" elapsed="0.217857"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:41:45.915919" elapsed="0.218425"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:41:45.915569" elapsed="0.218837"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:46.135007" elapsed="0.000237"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:46.134704" elapsed="0.000691"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:41:45.822906" elapsed="0.312532"/>
</test>
<test id="s1-s4-t38" name="Delete_Bgp_Peer_Configuration" line="375">
<kw name="Setup_Test_With_Logging_And_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.139649" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.139415" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.139398" elapsed="0.000332"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.139064" elapsed="0.000711"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.140788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.140680" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.140663" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.145729" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.145621" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.145603" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.146809" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.146404" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.147292" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:46.146997" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:46.147362" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:41:46.147539" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:46.146029" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.153226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.153099" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.153081" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.154504" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.154370" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.154351" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:46.155025" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.154723" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.155462" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:46.155227" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.188834" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:46.155984" elapsed="0.033002"/>
</kw>
<msg time="2026-05-01T00:41:46.189225" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:46.189272" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.155650" elapsed="0.033657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.208718" level="INFO">". "t "x "t ". "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:46.189944" elapsed="0.018899"/>
</kw>
<msg time="2026-05-01T00:41:46.209013" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:46.209058" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.189550" elapsed="0.019543"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.209513" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.209215" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.209183" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.210152" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.209831" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.210519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.210284" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.210265" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:46.210637" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:46.213526" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:41:46.213746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.212190" elapsed="0.001696"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.214207" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.214568" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:46.211546" elapsed="0.003226"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:46.210964" elapsed="0.003875"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:46.154069" elapsed="0.060871"/>
</kw>
<msg time="2026-05-01T00:41:46.215050" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:46.215096" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.153471" elapsed="0.061666"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:46.215331" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:46.215218" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.215198" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.215971" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.216369" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.216443" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:46.152760" elapsed="0.063815"/>
</kw>
<msg time="2026-05-01T00:41:46.216672" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:46.216715" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.147947" elapsed="0.068806"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.217251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.216844" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.216814" elapsed="0.000516"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:46.147801" elapsed="0.069555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:46.147622" elapsed="0.069769"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:46.145235" elapsed="0.072242"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:46.140365" elapsed="0.077174"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.139926" elapsed="0.077662"/>
</kw>
<doc>Test case setup which skips on previous failure. If not, logs test case name to Karaf log.
Recommended to be used as the default test case setup.</doc>
<status status="PASS" start="2026-05-01T00:41:46.136437" elapsed="0.081208"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.218423" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.217823" elapsed="0.000651"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.261401" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.260985" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.262239" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:41:46.261958" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:41:46.262420" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:41:46.261620" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.263031" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.262628" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:41:46.263364" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:41:46.263565" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:41:46.263223" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.264002" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.263754" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.265060" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.264802" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.265574" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.265286" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.266280" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.265981" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:46.267066" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.266839" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:46.267145" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:41:46.267311" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:46.266515" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.267511" elapsed="0.000266"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:41:46.265841" elapsed="0.001978"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.268395" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.268083" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:46.269365" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.268956" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:46.269479" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:41:46.269635" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:46.268637" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.269826" elapsed="0.000252"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:41:46.267949" elapsed="0.002179"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.270713" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.270390" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:46.271564" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.271330" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:46.271641" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:46.271794" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:46.270997" elapsed="0.000822"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.271971" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:41:46.270250" elapsed="0.001989"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.272823" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:41:46.272506" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:41:46.273691" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.273470" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:41:46.273768" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:41:46.273917" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:41:46.273112" elapsed="0.000830"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.274093" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:41:46.272354" elapsed="0.001998"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:41:46.265657" elapsed="0.008730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:41:46.274431" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:41:46.274608" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:41:46.264461" elapsed="0.010173"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.264129" elapsed="0.010537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.274851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.274696" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.264103" elapsed="0.010825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.275754" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.275077" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:41:46.275832" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:41:46.260348" elapsed="0.015608"/>
</kw>
<msg time="2026-05-01T00:41:46.276015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.247824" elapsed="0.028244"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.288425" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.300632" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.313186" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.313446" elapsed="0.000047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.313665" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.314129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.313958" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:41:46.313938" elapsed="0.000279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.314365" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.314552" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.314721" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:41:46.313890" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.313752" elapsed="0.001052"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.314969" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.315051" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:41:46.315227" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:41:46.243536" elapsed="0.071722"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.316624" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.316268" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:46.335667" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0tscu4nshh4l41lde9xjls1xiy4.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:46.335717" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:41:46.335833" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:41:46.319151" elapsed="0.016708"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.316744" elapsed="0.019157"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.336180" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.335928" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.316726" elapsed="0.019657"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.344534" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.338893" elapsed="0.005740"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.338313" elapsed="0.006401"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.338271" elapsed="0.006498"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.348220" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.345586" elapsed="0.002681"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.344893" elapsed="0.003409"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.344856" elapsed="0.003471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.348940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.348525" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.349294" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.349052" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.349858" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.349557" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.349375" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.349022" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.350494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.350101" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.350826" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.350592" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.351366" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.351073" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:46.350908" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.350575" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.351622" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:41:46.352445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:41:46.352142" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.352646" elapsed="0.002284"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:41:46.337315" elapsed="0.017681"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:41:46.355048" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:41:46.357277" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:41:46.315590" elapsed="0.041714"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:41:46.357362" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:41:46.218781" elapsed="0.138725"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:41:46.358138" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:41:46.357816" elapsed="0.000626"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:41:46.135894" elapsed="0.222606"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.360570" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:41:46.383922" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:41:46.384139" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:46.360410" elapsed="0.023784"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:41:46.384303" elapsed="0.000071"/>
</return>
<msg time="2026-05-01T00:41:46.384693" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:41:46.360131" elapsed="0.024618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.385716" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.385125" elapsed="0.000685"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.387672" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:41:46.387911" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:41:46.387049" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:41:46.392123" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-05-01T00:41:46.388234" elapsed="0.004033"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.388189" elapsed="0.004138"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.392716" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.393161" elapsed="0.000049"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.393582" elapsed="0.000048"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:41:46.386355" elapsed="0.007424"/>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:41:46.359651" elapsed="0.034242"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:46.394223" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:41:46.394146" elapsed="0.000165"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:41:46.394473" elapsed="0.000369"/>
</kw>
<doc>Make sure Python tool was killed, delete all sessions, tear down imported Resources.</doc>
<status status="PASS" start="2026-05-01T00:41:46.359335" elapsed="0.035567"/>
</kw>
<doc>Basic tests for odl-bgpcep-bgp-all feature.

Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic BGP functional test cases:
BGP peer initiated connection
- introduce and check 3 prefixes in one update message
ODL controller initiated connection:
- introduce and check 3 prefixes in one update message
- introduce 2 prefixes in first update message and then additional 2 prefixes
in another update while the very first prefix is withdrawn
- introduce 3 prefixes and try to withdraw the first one
(to be ignored by controller) in a single update message

TC_R (test case reset) tests session-reset functionality.
Resets the session, and than verifies that example-ipv4-topology is empty again.

TC_LA (test case local address) tests configuration of internal peer
with local-address configured
- configure peer with local-address and connect bgp-speaker to it
with tools_system_ip
- check filled topology

TC_PG (test case peer group) tests configuration and reconfiguration
of peer-groups and neighbors configured by them.
- configure peer-group, and assign neighbor to this peer-group
- check filled topology
- reconfigure peer-group without ipv4 unicast afi-safi
- check empty topology
- reconfigre neighbor without peer-group, delete peer-group

Brief description how to perform BGP functional test:
https://wiki.opendaylight.org/view/BGP_LS_PCEP:Lithium_Feature_Tests#How_to_test_2</doc>
<status status="FAIL" start="2026-05-01T00:40:54.497295" elapsed="51.897639"/>
</suite>
<suite id="s1-s5" name="Bgp Ipv6 Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.483368" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.478913" elapsed="0.004505"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:41:46.478668" elapsed="0.004830"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.488370" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:41:46.484585" elapsed="0.003813"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:41:46.488603" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.488493" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.488470" elapsed="0.000200"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.489200" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.488823" elapsed="0.000420"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.489771" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:41:46.489429" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:41:46.490315" elapsed="0.000303"/>
</kw>
<msg time="2026-05-01T00:41:46.490714" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:46.490760" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:46.489979" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.491312" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.490949" elapsed="0.000389"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.492308" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:46.492046" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.492752" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:46.492496" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.493303" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.492932" elapsed="0.000399"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.496722" elapsed="0.000209"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.497430" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.497108" elapsed="0.000363"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.497624" elapsed="0.000226"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.498646" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.498335" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:41:46.498720" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:41:46.498876" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:41:46.498044" elapsed="0.000858"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:41:46.499495" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a0ccf10&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:41:46.499056" elapsed="0.000576"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.499793" elapsed="0.000188"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:41:46.496150" elapsed="0.003892"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:46.495955" elapsed="0.004135"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:41:46.493389" elapsed="0.006732"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.500694" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.500282" elapsed="0.000454"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.501304" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.500895" elapsed="0.000451"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.501902" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:46.501518" elapsed="0.000426"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:41:46.491599" elapsed="0.010403"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:41:46.484230" elapsed="0.017826"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:46.502233" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:46.502121" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.502103" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.505505" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:46.505113" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.505979" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:46.505688" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:46.506052" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:46.506207" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:46.504763" elapsed="0.001468"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:46.507213" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.506952" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.508024" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:41:46.508124" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:41:46.507867" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:46.511658" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:46.511073" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:46.511054" elapsed="0.000728"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.512419" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:41:46.512667" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:41:46.511983" elapsed="0.000736"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.513693" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:46.513008" elapsed="0.000804"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.515031" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:46.514092" elapsed="0.000990"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:41:46.516854" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:41:46.517054" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:41:46.516491" elapsed="0.000607"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.517436" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:41:46.519085" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:41:47.102856" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:41:46 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:40:54 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:41:46.518762" elapsed="0.584298"/>
</kw>
<msg time="2026-05-01T00:41:47.103160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.518280" elapsed="0.585065"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:41:46.515561" elapsed="0.587968"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.104410" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:41:47.117507" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:41:47.117764" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:41:47.117911" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:47.103927" elapsed="0.014053"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.118408" elapsed="0.000732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.120852" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.119982" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.121932" elapsed="0.000113"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.121343" elapsed="0.000880"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.121290" elapsed="0.001020"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:41:47.123149" elapsed="0.000144"/>
</return>
<status status="PASS" start="2026-05-01T00:41:47.122525" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.122484" elapsed="0.001115"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.123736" elapsed="0.000038"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.131596" elapsed="0.001305"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.133262" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.133833" elapsed="0.000226"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:47.124972" elapsed="0.009159"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:41:46.510118" elapsed="0.624189"/>
</kw>
<msg time="2026-05-01T00:41:47.134364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.509308" elapsed="0.625109"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:41:46.508815" elapsed="0.625700"/>
</kw>
<msg time="2026-05-01T00:41:47.134558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.508302" elapsed="0.626302"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.137293" elapsed="0.000330"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.137785" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.138098" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:47.134896" elapsed="0.003350"/>
</kw>
<msg time="2026-05-01T00:41:47.138336" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:41:46.507466" elapsed="0.630895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.138799" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.138551" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:41:47.138882" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:41:46.506602" elapsed="0.632405"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:46.506408" elapsed="0.632639"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:46.506282" elapsed="0.632804"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:41:46.502552" elapsed="0.636588"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:41:47.139303" elapsed="0.000253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.153614" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.153503" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.153483" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.153972" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:41:47.154081" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.153837" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.154530" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.154256" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.154964" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.154724" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:47.155768" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:41:47.155539" elapsed="0.000333">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:41:47.156019" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:41:47.156066" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.155168" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.156387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:47.156166" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.156148" elapsed="0.000354"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:47.157262" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.156998" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:41:47.157335" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:41:47.157504" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:41:47.156728" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.157683" elapsed="0.000405"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.158359" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:41:47.158473" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.158255" elapsed="0.000246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.158645" elapsed="0.002403"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.161488" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:41:47.311198" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.161212" elapsed="0.150084"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.314501" elapsed="0.000339"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.315004" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.315305" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:47.312181" elapsed="0.003294"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:47.311604" elapsed="0.003920"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.153212" elapsed="0.162363"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:41:47.140275" elapsed="0.175348"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.139908" elapsed="0.175766"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:47.139767" elapsed="0.175947"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:41:47.139617" elapsed="0.176133"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:41:46.483787" elapsed="0.832021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.318592" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.318475" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.318443" elapsed="0.000222"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.323588" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.323479" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.323460" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.324632" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:47.324209" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.325119" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:41:47.324823" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:41:47.325189" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:41:47.325349" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:41:47.323882" elapsed="0.001492"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.331049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.330941" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.330923" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.332311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:47.332184" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.332166" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:41:47.332888" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.332545" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.333336" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:41:47.333088" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.371782" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:41:47.334039" elapsed="0.037910"/>
</kw>
<msg time="2026-05-01T00:41:47.372097" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:41:47.372145" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.333539" elapsed="0.038641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.455267" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "i "p "[78Cv "[A[78C6
 "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:41:47.372927" elapsed="0.082492"/>
</kw>
<msg time="2026-05-01T00:41:47.455567" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:41:47.455613" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.372364" elapsed="0.083285"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.455986" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:47.455730" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.455708" elapsed="0.000454"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.456718" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "i "p "[78Cv "[A[78C6
 "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.456310" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.457104" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:47.456867" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.456849" elapsed="0.000480"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:41:47.457365" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.459323" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.460138" elapsed="0.000290"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:41:47.460825" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:41:47.458560" elapsed="0.002601"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:41:47.457659" elapsed="0.003638"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:41:47.331895" elapsed="0.129505"/>
</kw>
<msg time="2026-05-01T00:41:47.461510" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:47.461556" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.331272" elapsed="0.130320"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:41:47.461780" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:41:47.461671" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.461651" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.462265" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.462651" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:41:47.462726" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:41:47.330654" elapsed="0.132182"/>
</kw>
<msg time="2026-05-01T00:41:47.462928" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:41:47.462973" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.325764" elapsed="0.137244"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:47.463335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:41:47.463085" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:47.463067" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:41:47.325621" elapsed="0.137817"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:41:47.325430" elapsed="0.138219"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:41:47.323175" elapsed="0.140532"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:41:47.316466" elapsed="0.147295"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:47.316014" elapsed="0.147789"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:41:46.478150" elapsed="0.985705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.464369" level="INFO">${conn_id} = 7</msg>
<var>${conn_id}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=10s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:41:47.464012" elapsed="0.000384"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.464935" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:41:47.464614" elapsed="0.000363"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.466729" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:41:47.466808" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:41:47.466366" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.466990" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.468438" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:41:47.784652" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:41:46 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:41:47 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:41:47.468117" elapsed="0.316698"/>
</kw>
<msg time="2026-05-01T00:41:47.784899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.467748" elapsed="0.317240"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:41:47.465924" elapsed="0.319183"/>
</kw>
<msg time="2026-05-01T00:41:47.785165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:47.465530" elapsed="0.319681"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:41:47.465179" elapsed="0.320112"/>
</kw>
<kw name="Configure_Ipv6_Network">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.786058" level="INFO">Executing command 'ip route | grep '^default' | awk '{print $5}''.</msg>
<msg time="2026-05-01T00:41:47.798292" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:47.798476" level="INFO">${main_net_interface} = ens3</msg>
<var>${main_net_interface}</var>
<arg>ip route | grep '^default' | awk '{print $5}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:47.785932" elapsed="0.012585"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:47.799363" level="INFO">Using network interface: ens3</msg>
<arg>Using network interface: ${main_net_interface}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:47.798814" elapsed="0.000676"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.800267" level="INFO">Executing command 'sudo ip -6 addr add 2607:f0d0:1002:0011:0000:0000:0000:0002/64 dev ens3'.</msg>
<msg time="2026-05-01T00:41:47.869559" level="INFO">Command exited with return code 0.</msg>
<arg>sudo ip -6 addr add ${IPV6_IP}/${IPV6_PREFIX_LENGTH} dev ${main_net_interface}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:47.799838" elapsed="0.069852"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.870358" level="INFO">Executing command 'sudo ip -6 route add default via 2607:f0d0:1002:0011:0000:0000:0000:0001'.</msg>
<msg time="2026-05-01T00:41:47.942052" level="INFO">Command exited with return code 0.</msg>
<arg>sudo ip -6 route add default via ${IPV6_IP_GW}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:47.870052" elapsed="0.072147"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:47.942860" level="INFO">Executing command 'sudo ip -6 addr show'.</msg>
<msg time="2026-05-01T00:41:48.000123" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:48.000378" level="INFO">${stdout} = 1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1458 state U...</msg>
<var>${stdout}</var>
<arg>sudo ip -6 addr show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:47.942631" elapsed="0.057811"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.001543" level="INFO">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1458 state UP qlen 1000
    inet6 2607:f0d0:1002:11::2/64 scope global tentative 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe37:e935/64 scope link 
       valid_lft forever preferred_lft forever</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:48.000910" elapsed="0.000742"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:48.002207" level="INFO">Executing command 'sudo ip -6 route show'.</msg>
<msg time="2026-05-01T00:41:48.060143" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:48.060377" level="INFO">${stdout} = ::1 dev lo proto kernel metric 256 pref medium
2607:f0d0:1002:11::/64 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev ens3 proto kernel metric 256 pref medium
default via 2607:f0d0:1002:11:...</msg>
<var>${stdout}</var>
<arg>sudo ip -6 route show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:48.002002" elapsed="0.058436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.061421" level="INFO">::1 dev lo proto kernel metric 256 pref medium
2607:f0d0:1002:11::/64 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev ens3 proto kernel metric 256 pref medium
default via 2607:f0d0:1002:11::1 dev ens3 metric 1024 pref medium</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:48.060862" elapsed="0.000696"/>
</kw>
<doc>Reconfigures basic network settings on controller</doc>
<status status="PASS" start="2026-05-01T00:41:47.785583" elapsed="0.276112"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.071970" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:48.071645" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:48.073608" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:41:48.698022" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:41:48.698401" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 284ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:41:48.698545" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:41:48.698639" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:48.073408" elapsed="0.625285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.700782" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:41:48.700135" elapsed="0.000750"/>
</kw>
<msg time="2026-05-01T00:41:48.701098" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:41:48.701199" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:41:48.699198" elapsed="0.002052"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.702638" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:41:48.701650" elapsed="0.001047"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.705124" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 284ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:48.704569" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.706131" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:48.705599" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.707113" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:41:48.706589" elapsed="0.000622"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:41:48.703719" elapsed="0.003615"/>
</kw>
<status status="PASS" start="2026-05-01T00:41:48.702889" elapsed="0.004525"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:48.702838" elapsed="0.004665"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:41:48.707862" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:41:48.707633" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:48.707593" elapsed="0.000472"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:41:48.708348" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:41:48.708183" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:41:48.708148" elapsed="0.000297"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:41:48.708608" elapsed="0.000022"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:41:48.072861" elapsed="0.635868"/>
</kw>
<msg time="2026-05-01T00:41:48.708788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.072268" elapsed="0.636573"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:41:48.070991" elapsed="0.637965"/>
</kw>
<msg time="2026-05-01T00:41:48.709012" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.063775" elapsed="0.645282"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:41:48.062833" elapsed="0.646332"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:41:48.716159" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:41:48.715814" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:41:48.718093" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:42:03.252172" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:42:03.252759" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-05-01T00:42:03.252945" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:42:03.253158" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:41:48.717744" elapsed="14.535508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.258545" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:42:03.257438" elapsed="0.001357"/>
</kw>
<msg time="2026-05-01T00:42:03.259128" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:42:03.259288" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:42:03.254113" elapsed="0.005261"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.262026" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:42:03.259984" elapsed="0.002084"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.264631" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 23.8 MB/s eta 0:00:00
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:03.264236" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.265519" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:03.265119" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.266347" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:03.265987" elapsed="0.000459"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:42:03.263318" elapsed="0.003295"/>
</kw>
<status status="PASS" start="2026-05-01T00:42:03.262253" elapsed="0.004464"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:03.262226" elapsed="0.004521"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:42:03.266986" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:42:03.266806" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:03.266789" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:42:03.267346" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:42:03.267183" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:03.267167" elapsed="0.000367"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:42:03.267684" elapsed="0.000022"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:41:48.717072" elapsed="14.550797"/>
</kw>
<msg time="2026-05-01T00:42:03.267929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.716410" elapsed="14.551574"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:41:48.715199" elapsed="14.552868"/>
</kw>
<msg time="2026-05-01T00:42:03.268121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.711052" elapsed="14.557114"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:41:48.710510" elapsed="14.557736"/>
</kw>
<msg time="2026-05-01T00:42:03.268368" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.710117" elapsed="14.558298"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:41:48.709782" elapsed="14.558726"/>
</kw>
<msg time="2026-05-01T00:42:03.268551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:48.709323" elapsed="14.559272"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:41:48.062179" elapsed="15.206492"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:42:03.277375" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:42:03.277023" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:42:03.279194" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:42:43.027942" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:42:43.028519" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Downloading setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-05-01T00:42:43.028641" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:42:43.028738" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:42:03.278837" elapsed="39.749959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.033673" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:42:43.032390" elapsed="0.001532"/>
</kw>
<msg time="2026-05-01T00:42:43.034270" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:42:43.034370" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:42:43.029529" elapsed="0.004892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.036907" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:42:43.034978" elapsed="0.001989"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.040062" level="INFO">Collecting setuptools==44.0.0
  Downloading setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 583.2/583.2 kB 188.5 kB/s  0:00:01
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:43.039725" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.040771" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:43.040434" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.041441" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:42:43.041130" elapsed="0.000409"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:42:43.038817" elapsed="0.002795"/>
</kw>
<status status="PASS" start="2026-05-01T00:42:43.037283" elapsed="0.004423"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:43.037227" elapsed="0.004510"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:42:43.041957" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:42:43.041797" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:43.041780" elapsed="0.000304"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:42:43.042276" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:42:43.042138" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-05-01T00:42:43.042122" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:42:43.042651" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:42:03.278204" elapsed="39.764594"/>
</kw>
<msg time="2026-05-01T00:42:43.042857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:03.277579" elapsed="39.765336"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:42:03.276376" elapsed="39.766721"/>
</kw>
<msg time="2026-05-01T00:42:43.043158" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:03.271037" elapsed="39.772169"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:42:03.270360" elapsed="39.772940"/>
</kw>
<msg time="2026-05-01T00:42:43.043353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:03.269978" elapsed="39.773420"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:42:03.269605" elapsed="39.773899"/>
</kw>
<msg time="2026-05-01T00:42:43.043550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:03.269152" elapsed="39.774442"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:42:03.268876" elapsed="39.774803"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:42:43.051336" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:42:43.051003" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:42:43.053148" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate'.</msg>
<msg time="2026-05-01T00:43:35.144005" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:35.144738" level="INFO">${stdout} = Collecting exabgp==4.2.4
  Downloading exabgp-4.2.4.tar.gz (394 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to buil...</msg>
<msg time="2026-05-01T00:43:35.144867" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:43:35.144963" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:42:43.052795" elapsed="52.092223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.149917" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:43:35.148674" elapsed="0.001489"/>
</kw>
<msg time="2026-05-01T00:43:35.150531" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:43:35.150640" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:35.145790" elapsed="0.004908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.153112" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:35.151191" elapsed="0.001962"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.156581" level="INFO">Collecting exabgp==4.2.4
  Downloading exabgp-4.2.4.tar.gz (394 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
  Preparing metadata (pyproject.toml): started
  Preparing metadata (pyproject.toml): finished with status 'done'
Requirement already satisfied: setuptools in /tmp/defaultvenv/lib/python3.10/site-packages (from exabgp==4.2.4) (44.0.0)
Building wheels for collected packages: exabgp
  Building wheel for exabgp (pyproject.toml): started
  Building wheel for exabgp (pyproject.toml): finished with status 'done'
  Created wheel for exabgp: filename=exabgp-4.2.4-py3-none-any.whl size=567682 sha256=d55dac99d4eb6b9d6d260941daf2dceaacbb81dd7d4295cbb88d13ad83c38527
  Stored in directory: /home/jenkins/.cache/pip/wheels/a2/6f/9a/9097d00837dae2b5fae0fc5727809e5b2619b3cb393b9463d7
Successfully built exabgp
Installing collected packages: exabgp
Successfully installed exabgp-4.2.4</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:35.156020" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.157630" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:35.157127" elapsed="0.000706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.158837" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:35.158273" elapsed="0.000662"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:43:35.154728" elapsed="0.004312"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:35.153363" elapsed="0.005814"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:35.153325" elapsed="0.005896"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:43:35.159572" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:35.159308" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:35.159283" elapsed="0.000472"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:43:35.160025" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-05-01T00:43:35.159836" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:35.159812" elapsed="0.000454"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:35.160505" elapsed="0.000034"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:42:43.052162" elapsed="52.108553"/>
</kw>
<msg time="2026-05-01T00:43:35.160804" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:43.051545" elapsed="52.109338"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:42:43.050355" elapsed="52.110690"/>
</kw>
<msg time="2026-05-01T00:43:35.161132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:43.045883" elapsed="52.115315"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:42:43.045290" elapsed="52.116057"/>
</kw>
<msg time="2026-05-01T00:43:35.161425" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:43.044901" elapsed="52.116628"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:42:43.044527" elapsed="52.117152"/>
</kw>
<msg time="2026-05-01T00:43:35.161747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:42:43.044142" elapsed="52.117666"/>
</kw>
<arg>exabgp==4.2.4</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:42:43.043882" elapsed="52.118063"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:35.162770" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19f76990&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:43:35.162200" elapsed="0.000814"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.192300" level="INFO">[chan 10] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:43:35.201693" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/exaipv6.cfg' -&gt; '/home/jenkins//exaipv6.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${EXABGP_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:43:35.163668" elapsed="0.038113"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.218502" level="INFO">1 file:
exaipv6.cfg</msg>
<msg time="2026-05-01T00:43:35.218752" level="INFO">@{cfgfiles} = [ exaipv6.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:43:35.202027" elapsed="0.016779"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.220015" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.232252" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${IPV6_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.219650" elapsed="0.012689"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.232920" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.278399" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${CONTROLLER_IPV6}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.232611" elapsed="0.046008"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.279549" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.326662" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/${EXABGP_ID}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.279080" elapsed="0.047803"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.327814" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.374797" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.327374" elapsed="0.047622"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.375849" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.423101" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.375445" elapsed="0.047877"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.424328" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:43:35.470480" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:35.470716" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        route-refresh disable;
        add-pat...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.423880" elapsed="0.046895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.471901" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:35.471218" elapsed="0.000813"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-05-01T00:43:35.219309" elapsed="0.252800"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:43:35.218940" elapsed="0.253250"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:43:35.163320" elapsed="0.309016"/>
</kw>
<kw name="Upload_Config_Files_exabgp_ipv4">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.514761" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/exaipv4.cfg' -&gt; '/home/jenkins//exaipv4.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${EXABGP2_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:43:35.473415" elapsed="0.041429"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.522647" level="INFO">1 file:
exaipv4.cfg</msg>
<msg time="2026-05-01T00:43:35.522801" level="INFO">@{cfgfiles} = [ exaipv4.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*ipv4.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:43:35.515070" elapsed="0.007766"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.523593" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.535761" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/127.0.0.1/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.523366" elapsed="0.012525"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.536693" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.582751" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.536274" elapsed="0.046612"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.583633" level="INFO">Executing command 'sed -i -e 's/ROUTERID/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.634395" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/127.0.0.1/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.583255" elapsed="0.051307"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.635244" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.682708" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.634933" elapsed="0.047906"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.683550" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.734731" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.683202" elapsed="0.051660"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.735581" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:43:35.787842" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:35.788060" level="INFO">${stdout} = neighbor 10.30.170.185 {
                  router-id 127.0.0.1;
                  local-address 127.0.0.1;
                  local-as 64496;
                  peer-as 64496;
                  family {...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.735230" elapsed="0.052887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:35.789166" level="INFO">neighbor 10.30.170.185 {
                  router-id 127.0.0.1;
                  local-address 127.0.0.1;
                  local-as 64496;
                  peer-as 64496;
                  family {
                        ipv4 unicast;
                  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:35.788568" elapsed="0.000700"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:43:35.523167" elapsed="0.266272"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:43:35.522922" elapsed="0.266630"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:43:35.472842" elapsed="0.316846"/>
</kw>
<kw name="Upload_Config_Files_exabgp_graceful_restart">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.834172" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/exabgp_graceful_restart.cfg' -&gt; '/home/jenkins//exabgp_graceful_restart.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${EXABGP3_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:43:35.790672" elapsed="0.043631"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.843274" level="INFO">1 file:
exabgp_graceful_restart.cfg</msg>
<msg time="2026-05-01T00:43:35.843438" level="INFO">@{cfgfiles} = [ exabgp_graceful_restart.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*restart.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:43:35.834703" elapsed="0.008793"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.844264" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:35.856490" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${IPV6_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.844034" elapsed="0.012538"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.857028" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:35.906662" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${CONTROLLER_IPV6}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.856797" elapsed="0.049994"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.907556" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:35.954566" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/${EXABGP_ID}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.907152" elapsed="0.047556"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:35.955406" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:36.002638" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:35.955082" elapsed="0.047767"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.003812" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:36.050834" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.003323" elapsed="0.047675"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.051974" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:43:36.098708" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:36.098938" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        graceful-restart 40;
    }

    family...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.051536" elapsed="0.047462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.100224" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        graceful-restart 40;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.099496" elapsed="0.000836"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-05-01T00:43:35.843839" elapsed="0.256571"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:43:35.843579" elapsed="0.256947"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:43:35.790133" elapsed="0.310544"/>
</kw>
<kw name="Upload_Config_Files_Exabgp_AS_Value_Reconfigured">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.142054" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/exa4.cfg' -&gt; '/home/jenkins//exa4.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${EXABGP4_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:43:36.101866" elapsed="0.040324"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.149896" level="INFO">1 file:
exa4.cfg</msg>
<msg time="2026-05-01T00:43:36.150049" level="INFO">@{cfgfiles} = [ exa4.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*exa4.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:43:36.142622" elapsed="0.007462"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.150889" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.162942" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${IPV6_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.150652" elapsed="0.012374"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.163817" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.214249" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${CONTROLLER_IPV6}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.163327" elapsed="0.051056"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.215173" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.262532" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/${EXABGP_ID}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.214799" elapsed="0.047869"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.263445" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.310378" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.263033" elapsed="0.047534"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.311258" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.362774" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.310942" elapsed="0.051964"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.363676" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-05-01T00:43:36.410680" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:36.410897" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 4210010000;
    peer-as 4210010000;

    capability {
        route-refresh disable;
     ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:36.363272" elapsed="0.047685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.412135" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 4210010000;
    peer-as 4210010000;

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.411370" elapsed="0.000914"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-05-01T00:43:36.150408" elapsed="0.261979"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:43:36.150168" elapsed="0.262364"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:43:36.101150" elapsed="0.311559"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:41:46.477865" elapsed="109.934980"/>
</kw>
<test id="s1-s5-t1" name="Reconfigure_ODL_To_Accept_Connections" line="61">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:36.420690" elapsed="0.000245"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:36.420384" elapsed="0.000607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.422092" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.421950" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.421927" elapsed="0.000240"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.427307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.427195" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.427176" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.428512" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.428104" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.428998" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:36.428701" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:36.429069" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:43:36.429233" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:36.427712" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.435033" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.434923" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.434905" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.436297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.436189" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.436171" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:36.436851" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.436536" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.437254" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:36.437038" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.472976" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:36.437789" elapsed="0.035288"/>
</kw>
<msg time="2026-05-01T00:43:36.473258" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:36.473304" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.437438" elapsed="0.035951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.501223" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:36.473943" elapsed="0.027389"/>
</kw>
<msg time="2026-05-01T00:43:36.501512" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:36.501559" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.473588" elapsed="0.028007"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.501901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.501676" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.501655" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.502425" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.502126" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.502808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.502594" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.502575" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:36.502920" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:36.505411" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:43:36.505630" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.504382" elapsed="0.001382"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.506039" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.506380" elapsed="0.000115"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:36.503766" elapsed="0.002845"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:36.503198" elapsed="0.003478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:36.435878" elapsed="0.070895"/>
</kw>
<msg time="2026-05-01T00:43:36.506866" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:36.506909" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.435257" elapsed="0.071689"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:36.507131" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:36.507024" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.507005" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.507674" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.508023" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.508095" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:36.434584" elapsed="0.073626"/>
</kw>
<msg time="2026-05-01T00:43:36.508304" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:36.508347" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.429653" elapsed="0.078731"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.508724" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.508473" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.508441" elapsed="0.000428"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:36.429508" elapsed="0.079385"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:36.429314" elapsed="0.079610"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:36.426826" elapsed="0.082155"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:36.421631" elapsed="0.087405"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.421150" elapsed="0.087932"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:36.415033" elapsed="0.094102"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.510042" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:0011:0000:0000:0000:0002 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=ex...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.509326" elapsed="0.000746"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.544723" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.544329" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:36.545542" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:36.545246" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:36.545716" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:36.544915" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.546286" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.545904" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:36.546628" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:36.546787" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:36.546488" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.547210" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.546969" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.548249" level="INFO">mapping: {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.547990" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.548736" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.548470" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.549436" level="INFO">${value} = 2607:f0d0:1002:0011:0000:0000:0000:0002</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.549130" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.550211" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.549982" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.550286" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:36.550441" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.549667" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.550673" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-05-01T00:43:36.548994" elapsed="0.001963"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.551539" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.551204" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.552422" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.552212" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.552514" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:36.552668" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.551750" elapsed="0.000942"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.552844" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:36.551072" elapsed="0.002031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.553671" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.553354" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.554578" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.554193" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.554653" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.554804" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.553881" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.554978" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:36.553216" elapsed="0.002027"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.555836" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.555532" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.556591" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.556365" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.556666" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.556817" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.556046" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.556990" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:36.555356" elapsed="0.001893"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.557804" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.557508" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.558551" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.558327" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.558627" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.558776" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.558012" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.558948" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:36.557362" elapsed="0.001844"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.559787" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.559486" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.560532" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.560308" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.560607" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.560757" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.559997" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.560969" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:36.559326" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.561793" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.561494" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.562542" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.562317" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.562618" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.562779" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.562005" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.562953" elapsed="0.000265"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:36.561347" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.564063" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:36.563543" elapsed="0.000553"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:36.564843" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.564633" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:36.564919" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:36.565072" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:36.564299" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.565247" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:36.563380" elapsed="0.002146"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:36.548812" elapsed="0.016750"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:36.565605" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:36.565765" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:36.547669" elapsed="0.018123"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.547323" elapsed="0.018501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.565995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.565849" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.547303" elapsed="0.018769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.566926" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:36.566214" elapsed="0.000741"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:36.567004" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:36.543710" elapsed="0.023421"/>
</kw>
<msg time="2026-05-01T00:43:36.567186" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.530665" elapsed="0.036569"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.580002" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.592883" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.605688" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.605887" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.606063" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.606440" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.606286" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:36.606272" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.606679" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.606846" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.607012" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:36.606242" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.606138" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.607235" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.607311" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:36.607500" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:36.526283" elapsed="0.081247"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.634698" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.634309" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:36.635485" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:36.635216" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:36.635651" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:36.634887" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.636219" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.635838" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:36.636556" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:36.636751" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:36.636405" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.637190" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.636941" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:36.637623" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.637317" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.638341" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.637851" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.637707" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.637298" elapsed="0.001129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.639323" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:36.638589" elapsed="0.000765"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:36.639422" elapsed="0.000052"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:36.633694" elapsed="0.005884"/>
</kw>
<msg time="2026-05-01T00:43:36.639636" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.620733" elapsed="0.018950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.652383" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.665029" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.677625" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.677819" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.678053" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.678429" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.678285" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:36.678271" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.678667" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.678834" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.678998" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:36.678241" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.678132" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.679266" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.679349" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:36.679532" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:36.617991" elapsed="0.061571"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:36.680829" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:36.680575" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:36.680986" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:36.680220" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.681325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.681081" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.681882" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.681592" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.681405" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.681063" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.684363" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.682119" elapsed="0.002271"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:36.684441" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:43:36.684611" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:36.679895" elapsed="0.004741"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.686006" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.685760" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.686475" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.686204" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.686969" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.686724" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.687445" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.687162" elapsed="0.000355"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:36.688325" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:36.688126" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:36.688702" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:36.688526" elapsed="0.000210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.688885" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.689691" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.689257" elapsed="0.000479"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:36.689781" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:36.689939" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:36.687724" elapsed="0.002240"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:36.710981" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1013', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:36.711080" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:43:36 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:36.711538" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:36.692174" elapsed="0.019430"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.690034" elapsed="0.021674"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.712203" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.711767" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.690017" elapsed="0.022393"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.720229" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.714660" elapsed="0.005614"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.714085" elapsed="0.006224"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.714045" elapsed="0.006290"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.722932" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.720627" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.720391" elapsed="0.002623"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.720375" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.723617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:36.723209" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.723983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.723714" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.724544" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.724228" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.724067" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.723696" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.725145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:36.724786" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.725489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.725241" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.726027" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.725732" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.725572" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.725224" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.726266" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:36.727073" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:36.726790" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.727252" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:36.713260" elapsed="0.016417"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:36.729853" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:43:36.729745" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.729727" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.730094" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.730163" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:36.732520" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:36.684964" elapsed="0.047583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:36.732612" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:36.732769" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:36.515090" elapsed="0.217705"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.733132" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.732893" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.732877" elapsed="0.000346"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:36.733256" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:36.510349" elapsed="0.223037"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:43:36.413006" elapsed="0.320518"/>
</test>
<test id="s1-s5-t2" name="Start_Exabgp" line="77">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:36.736976" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:36.736711" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.738234" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.738118" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.738100" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.743428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.743291" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.743273" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.744513" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.744116" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.744997" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:36.744701" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:36.745068" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:36.745222" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:36.743741" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.750839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.750733" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.750714" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.752100" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:36.751993" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.751975" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:36.752647" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:36.752313" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.753052" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:36.752831" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.786466" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:36.753585" elapsed="0.032983"/>
</kw>
<msg time="2026-05-01T00:43:36.786731" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:36.786777" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.753234" elapsed="0.033578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.807962" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:36.787379" elapsed="0.020807"/>
</kw>
<msg time="2026-05-01T00:43:36.808587" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:36.808693" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.786982" elapsed="0.021794"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.809505" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.808953" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.808910" elapsed="0.000778"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.810709" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.810001" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.811543" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.810993" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.810953" elapsed="0.000766"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:36.811792" elapsed="0.000064"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:36.815732" elapsed="0.000214"/>
</kw>
<msg time="2026-05-01T00:43:36.816088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.814066" elapsed="0.002217"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.816709" elapsed="0.000112"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.817200" elapsed="0.000108"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:36.813115" elapsed="0.004393"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:36.812297" elapsed="0.005312"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:36.751691" elapsed="0.066064"/>
</kw>
<msg time="2026-05-01T00:43:36.817890" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:36.817955" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.751059" elapsed="0.066952"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:36.818286" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:43:36.818124" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.818097" elapsed="0.000315"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.819038" elapsed="0.000037"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.819765" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:36.819873" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:36.750383" elapsed="0.069656"/>
</kw>
<msg time="2026-05-01T00:43:36.820164" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:36.820209" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.745638" elapsed="0.074608"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:36.820584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:36.820321" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.820304" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:36.745494" elapsed="0.075192"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:36.745304" elapsed="0.075413"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:36.742927" elapsed="0.077844"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:36.737833" elapsed="0.082993"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.737388" elapsed="0.083482"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:36.734174" elapsed="0.086747"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.821413" level="INFO">${cmd} = exaipv6.cfg &gt; exaipv6.log</msg>
<var>${cmd}</var>
<arg>${EXABGP_CFG} &gt; ${EXABGP_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.821082" elapsed="0.000358"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.824939" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.824605" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.825365" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.825123" elapsed="0.000287"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.827696" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:36.826037" elapsed="0.001720"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.831256" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:36.831382" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:36.827917" elapsed="0.003553"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.832050" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.831799" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:36.831548" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:36.831529" elapsed="0.000628"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:43:36.825678" elapsed="0.006525"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:36.833818" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<msg time="2026-05-01T00:43:36.833906" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:36.832353" elapsed="0.001579"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.834334" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.834090" elapsed="0.000289"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:36.824222" elapsed="0.010212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.838073" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:36.837723" elapsed="0.000377"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.840234" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:36.838261" elapsed="0.002000"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:36.846712" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:36.846854" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:43:36.846959" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:36.840423" elapsed="0.006561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.849605" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:36.847151" elapsed="0.002502"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:43:36.852526" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:43:36.849809" elapsed="0.002822">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:43:36.837248" elapsed="0.015550">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.856037" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:39.855118" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.861200" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:39.856524" elapsed="0.004739"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:39.870641" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:39.872874" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1499'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:43:39.873228" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:39.861658" elapsed="0.011633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.879253" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:39.873701" elapsed="0.005683"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:43:39.879768" elapsed="0.003919"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:43:39.853688" elapsed="0.030066"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:36.834990" elapsed="3.048819"/>
</kw>
<msg time="2026-05-01T00:43:39.883914" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:39.883960" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:36.834609" elapsed="3.049375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.884371" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:39.884086" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.884062" elapsed="0.000403"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:43:39.884635" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:43:39.884524" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.884508" elapsed="0.000222"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:43:36.824043" elapsed="3.060714"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:43:36.823823" elapsed="3.060971"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.884950" elapsed="0.000022"/>
</kw>
<arg>${cmd}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${EXABGP_ID}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:43:36.821774" elapsed="3.063257"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:36.733733" elapsed="3.151417"/>
</test>
<test id="s1-s5-t3" name="Verify_Ipv6_Topology_Filled" line="83">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:39.888906" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:39.888641" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:39.890231" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:39.890111" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.890089" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:39.895388" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:39.895280" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.895261" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.896471" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:39.896075" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.896950" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:39.896656" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:39.897020" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:39.897177" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:39.895702" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:39.902908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:39.902799" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.902781" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:39.904153" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:39.904046" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.904028" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:39.904696" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:39.904368" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:39.905101" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:39.904882" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:39.937341" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:39.905643" elapsed="0.031824"/>
</kw>
<msg time="2026-05-01T00:43:39.937634" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:39.937680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:39.905287" elapsed="0.032429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:39.962651" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:39.938295" elapsed="0.024517"/>
</kw>
<msg time="2026-05-01T00:43:39.963058" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:39.963127" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:39.937922" elapsed="0.025260"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.963674" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:39.963302" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.963271" elapsed="0.000522"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:39.964473" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:39.964005" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.964997" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:39.964677" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.964650" elapsed="0.000462"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:39.965162" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:39.968904" elapsed="0.000210"/>
</kw>
<msg time="2026-05-01T00:43:39.969202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:39.967309" elapsed="0.002084"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.969853" elapsed="0.000120"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.970349" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:39.966374" elapsed="0.004182"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:39.965579" elapsed="0.005041"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:39.903745" elapsed="0.066972"/>
</kw>
<msg time="2026-05-01T00:43:39.970807" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:39.970851" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:39.903129" elapsed="0.067760"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:39.971111" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:39.971002" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.970983" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.971735" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.972143" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:39.972217" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:39.902447" elapsed="0.069880"/>
</kw>
<msg time="2026-05-01T00:43:39.972421" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:39.972487" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:39.897590" elapsed="0.074935"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:39.972853" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:39.972602" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:39.972584" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:39.897431" elapsed="0.075523"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:39.897256" elapsed="0.075728"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:39.894914" elapsed="0.078125"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:39.889769" elapsed="0.083326"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:39.889322" elapsed="0.083817"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:39.886149" elapsed="0.087042"/>
</kw>
<kw name="Verify_Rib_Status_Filled">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.027106" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.026729" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.027941" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.027657" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.028118" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.027307" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.028703" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.028305" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.029026" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.029194" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.028891" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.029634" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.029376" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.030695" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.030393" elapsed="0.000346"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.031210" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.030900" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.031588" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.031795" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.031969" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.031432" elapsed="0.000598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.031290" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.032106" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.032268" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:40.030073" elapsed="0.002221"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.029755" elapsed="0.002571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.032519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.032351" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.029736" elapsed="0.002861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.033179" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.032739" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.033256" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.026097" elapsed="0.007284"/>
</kw>
<msg time="2026-05-01T00:43:40.033435" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.013027" elapsed="0.020473"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.046758" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.059433" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.072233" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.072430" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.072622" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.072989" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.072843" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.072828" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.073250" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.073418" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.073638" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.072799" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.072696" elapsed="0.001037"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.073922" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.074003" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:43:40.074132" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.008609" elapsed="0.065549"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.075515" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.075224" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.075684" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.074833" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.076036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.075783" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.076613" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.076298" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.076121" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.075763" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.079241" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.076918" elapsed="0.002350"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:40.079322" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:40.079497" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:40.074502" elapsed="0.005022"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.080755" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.080512" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.080913" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.080160" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:40.081149" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:40.081012" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.080994" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.081381" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.081567" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.081633" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.083828" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:40.079836" elapsed="0.004021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.085323" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.085069" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.085808" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.085540" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:40.096819" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:40.097339" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:40.097528" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:40.088057" elapsed="0.009512"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.085921" elapsed="0.011714"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.097920" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.097674" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.085902" elapsed="0.012148"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.103231" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.099581" elapsed="0.003723"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.099234" elapsed="0.004122"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.099207" elapsed="0.004187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.107370" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.103826" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.103499" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.103472" elapsed="0.004077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.108373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.107794" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.108894" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.108543" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.109717" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.109252" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.109015" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.108515" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.110674" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.110108" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.111154" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.110816" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.111960" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.111527" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.111272" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.110790" elapsed="0.001291"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.112303" elapsed="0.000531"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:40.113528" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.113076" elapsed="0.000492"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.113810" elapsed="0.003540"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:40.098611" elapsed="0.018910"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.117818" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.117627" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.117599" elapsed="0.000324"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.121144" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.118139" elapsed="0.003034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:40.121226" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:40.121418" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:40.084228" elapsed="0.037221"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.121529" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:40.121684" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:39.985161" elapsed="0.136549"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.150542" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.150054" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.151416" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.151138" elapsed="0.000418">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.151733" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.150733" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.152365" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.151925" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.152731" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.152887" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.152569" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.153336" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
                            {
                                "prefix": "2a04:6d80::1/128"
                            }
                        ]
                    },
                    "node-id": "2607:f0d0:1002:11::2"
                }
            ],
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.153071" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:40.153908" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.153468" elapsed="0.000503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.154708" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.154142" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.153997" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.153434" elapsed="0.001362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.155417" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.154942" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.155518" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.149403" elapsed="0.006245"/>
</kw>
<msg time="2026-05-01T00:43:40.155706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.136465" elapsed="0.019290"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.168767" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.181551" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.194302" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.194512" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.194688" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.195075" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.194925" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.194911" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.195292" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.195471" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.195638" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.194879" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.194769" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.195876" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.195953" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.196073" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.133778" elapsed="0.062355"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.196313" elapsed="0.002537"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.200025" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.199599" elapsed="0.000454"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.200641" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.200207" elapsed="0.000462"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:40.200828" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:40.199173" elapsed="0.002042"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.198932" elapsed="0.002317"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.201426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.201275" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.198914" elapsed="0.002607"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:40.122910" elapsed="0.078659"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:40.122066" elapsed="0.079579"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.121818" elapsed="0.079872"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.121796" elapsed="0.079946"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.201781" elapsed="0.000030"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:39.978035" elapsed="0.223881"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:39.973621" elapsed="0.228353"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-05-01T00:43:39.973324" elapsed="0.228716"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled after starting exabgp.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:39.885520" elapsed="0.316632"/>
</test>
<test id="s1-s5-t4" name="Delete_Bgp_Peer_Configuration" line="88">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:40.205577" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:40.205295" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.206848" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.206738" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.206720" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.212103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.211996" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.211978" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.213164" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.212787" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.213737" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:40.213388" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:40.213811" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.213968" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.212398" elapsed="0.001595"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.219643" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.219536" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.219516" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.220864" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.220758" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.220741" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:40.221382" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.221075" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.221826" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.221587" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.247478" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:40.222347" elapsed="0.025246"/>
</kw>
<msg time="2026-05-01T00:43:40.247762" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:40.247808" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.222013" elapsed="0.025832"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.266351" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:40.248390" elapsed="0.018083"/>
</kw>
<msg time="2026-05-01T00:43:40.266636" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:40.266681" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.248021" elapsed="0.018697"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.267042" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.266797" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.266776" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.267636" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.267296" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.267993" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.267774" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.267755" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:40.268110" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.270784" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:43:40.270993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.269627" elapsed="0.001496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.271573" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.271919" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:40.268984" elapsed="0.003124"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:40.268408" elapsed="0.003801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:40.220435" elapsed="0.051876"/>
</kw>
<msg time="2026-05-01T00:43:40.272402" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.272447" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.219865" elapsed="0.052643"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:40.272694" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:40.272586" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.272567" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.273176" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.273529" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.273602" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:40.219180" elapsed="0.054571"/>
</kw>
<msg time="2026-05-01T00:43:40.273848" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.273892" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.214398" elapsed="0.059531"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.274258" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.274006" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.273989" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:40.214250" elapsed="0.060111"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:40.214045" elapsed="0.060347"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:40.211637" elapsed="0.062811"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:40.206435" elapsed="0.068087"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.206012" elapsed="0.068555"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:40.203087" elapsed="0.071534"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.275532" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:0011:0000:0000:0000:0002 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=ex...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.274809" elapsed="0.000754"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.318923" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.318551" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.319689" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.319443" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.319852" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.319113" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.320417" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.320039" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.320802" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.320944" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.320663" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.321370" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.321127" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.322385" level="INFO">mapping: {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.322125" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.322870" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.322607" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.323577" level="INFO">${value} = 2607:f0d0:1002:0011:0000:0000:0000:0002</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.323262" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.324504" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.324263" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.324582" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:40.324738" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.323791" elapsed="0.000972"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.324915" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-05-01T00:43:40.323128" elapsed="0.002066"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.325779" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.325441" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.326529" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.326304" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.326604" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.326755" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.325991" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.326929" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:40.325308" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.327746" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.327436" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.328490" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.328268" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.328567" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.328718" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.327955" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.328897" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:40.327305" elapsed="0.001851"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.329756" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.329410" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.330541" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.330306" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.330653" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:43:40.330812" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.329978" elapsed="0.000859"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.330988" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:40.329271" elapsed="0.001978"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.331809" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.331512" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.332564" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.332336" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.332641" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.332793" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.332021" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.332969" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.331365" elapsed="0.001864"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.333864" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.333494" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.334804" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.334405" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.334882" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:40.335035" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.334088" elapsed="0.000972"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.335209" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:40.333343" elapsed="0.002143"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.336029" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.335734" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.336773" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.336564" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.336848" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.336998" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.336239" elapsed="0.000784"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.337171" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.335601" elapsed="0.001829"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.338000" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.337703" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.338744" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.338537" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.338820" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.338970" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.338210" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.339143" elapsed="0.000225"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.337562" elapsed="0.001999"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.322947" elapsed="0.016650"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.339640" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.339809" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:40.321805" elapsed="0.018032"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.321500" elapsed="0.018402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.340081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.339931" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.321481" elapsed="0.018677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.341007" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.340305" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.341084" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.317928" elapsed="0.023281"/>
</kw>
<msg time="2026-05-01T00:43:40.341263" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.304979" elapsed="0.036330"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.354044" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.366803" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.379498" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.379692" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.379865" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.380227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.380084" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.380070" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.380445" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.380628" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.380791" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.380041" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.379939" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.381014" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.381089" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.381212" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.300590" elapsed="0.080680"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.382397" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.382149" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:40.395205" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:40.395255" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:40.395362" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:40.386149" elapsed="0.009239"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.382528" elapsed="0.012901"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.395632" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.395476" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.382510" elapsed="0.013206"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.400240" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.396715" elapsed="0.003623"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.396495" elapsed="0.003924"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.396476" elapsed="0.004032"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.406510" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.401130" elapsed="0.005487"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.400634" elapsed="0.006062"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.400598" elapsed="0.006154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.407988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.407114" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.408757" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.408207" elapsed="0.000681"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.410088" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.409299" elapsed="0.000848"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.408943" elapsed="0.001286"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.408168" elapsed="0.002110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.410838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.410466" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.411166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.410934" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.411724" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.411411" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.411248" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.410916" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.411955" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:40.412804" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.412522" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.412982" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:40.396071" elapsed="0.019305"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:40.415422" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:43:40.417736" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:40.381554" elapsed="0.036209"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.417817" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:40.275805" elapsed="0.142137"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:43:40.202500" elapsed="0.215555"/>
</test>
<test id="s1-s5-t5" name="Verify_Ipv6_Topology_Empty" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:40.421414" elapsed="0.000249"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:40.421154" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.422733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.422624" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.422605" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.428061" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.427953" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.427936" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.429123" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.428747" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.429629" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:40.429308" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:40.429701" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.429856" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.428359" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.435505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.435383" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.435364" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.436732" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.436626" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.436608" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:40.437240" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.436944" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.437668" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.437422" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.463007" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:40.438187" elapsed="0.025041"/>
</kw>
<msg time="2026-05-01T00:43:40.463517" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:40.463588" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.437855" elapsed="0.025784"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.484148" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:40.464684" elapsed="0.019568"/>
</kw>
<msg time="2026-05-01T00:43:40.484414" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:40.484479" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.463890" elapsed="0.020628"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.484819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.484598" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.484577" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.485340" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.485038" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.485752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.485522" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.485503" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:40.485864" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.488401" elapsed="0.000161"/>
</kw>
<msg time="2026-05-01T00:43:40.488623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.487283" elapsed="0.001470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.489025" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.489355" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:40.486671" elapsed="0.002892"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:40.486122" elapsed="0.003529"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:40.436299" elapsed="0.053451"/>
</kw>
<msg time="2026-05-01T00:43:40.489841" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.489888" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.435726" elapsed="0.054199"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:40.490272" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:40.490003" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.489984" elapsed="0.000376"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.490777" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.491115" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.491185" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:40.435048" elapsed="0.056245"/>
</kw>
<msg time="2026-05-01T00:43:40.491390" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.491433" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.430245" elapsed="0.061238"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.491809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.491561" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.491543" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:40.430104" elapsed="0.061804"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:40.429934" elapsed="0.062037"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:40.427588" elapsed="0.064442"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:40.422314" elapsed="0.069771"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.421865" elapsed="0.070264"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:40.418965" elapsed="0.073216"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.546203" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.545750" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.547148" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.546829" elapsed="0.000404">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.547352" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.546404" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.547971" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.547582" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.548321" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.548518" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.548162" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.548946" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.548702" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.550252" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.549758" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.550766" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.550488" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.551126" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.551342" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.551537" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.550989" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.550846" elapsed="0.000784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.551675" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:40.551845" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:40.549376" elapsed="0.002494"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.549063" elapsed="0.002840"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.552077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.551928" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.549042" elapsed="0.003113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.552757" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.552298" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.552835" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.545007" elapsed="0.007995"/>
</kw>
<msg time="2026-05-01T00:43:40.553058" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.530769" elapsed="0.022339"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.566896" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.579765" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.594990" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.595195" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.595402" elapsed="0.000026"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.595812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.595666" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.595651" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.596033" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.596199" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.596361" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.595619" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.595511" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.596601" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.596678" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:40.596804" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.526328" elapsed="0.070503"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.598248" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.597923" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.598417" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.597511" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.598778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.598530" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.599332" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.599035" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.598860" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.598510" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.601873" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.599587" elapsed="0.002313"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:40.601953" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.602111" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:40.597162" elapsed="0.004974"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.603357" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.603118" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.603532" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.602785" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:40.603766" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:40.603628" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.603610" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.603999" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.604169" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.604235" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.606543" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:40.602446" elapsed="0.004125"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.608019" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.607766" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.608480" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.608217" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:40.618435" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:40.618862" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:40.618999" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:40.610809" elapsed="0.008226"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.608593" elapsed="0.010501"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.619343" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.619131" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.608574" elapsed="0.010958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.624571" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.620974" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.620665" elapsed="0.004024"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.620640" elapsed="0.004084"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.628492" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.625115" elapsed="0.003443"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.624804" elapsed="0.003803"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.624780" elapsed="0.003862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.629402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.628870" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.629980" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.629611" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.630657" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.630340" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.630132" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.629577" elapsed="0.001164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.631259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.630899" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.631602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.631355" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.632134" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.631841" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.631683" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.631337" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.632365" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:40.633184" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.632889" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.633367" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:40.620051" elapsed="0.015878"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.636107" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.636000" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.635981" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.639096" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.636327" elapsed="0.002798"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:40.639177" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.639335" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:40.606888" elapsed="0.032473"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.639424" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:43:40.639595" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:40.503262" elapsed="0.136359"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.668793" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.668302" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.669666" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.669322" elapsed="0.000465">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.669966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.668991" elapsed="0.001000"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.670659" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.670160" elapsed="0.000526"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.671006" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.671165" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.670848" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.671634" level="INFO">{
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.671349" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:40.672155" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.671749" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.672904" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.672386" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.672241" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.671730" elapsed="0.001257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.673785" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.673132" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.673863" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.667567" elapsed="0.006424"/>
</kw>
<msg time="2026-05-01T00:43:40.674045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.654343" elapsed="0.019750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.687192" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.700199" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.712951" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.713150" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.713321" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.713732" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.713588" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.713573" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.713955" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.714120" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.714281" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.713542" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.713399" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.714519" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.714596" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:40.714715" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.651649" elapsed="0.063093"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.714916" elapsed="0.002261"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.723959" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.723638" elapsed="0.000350"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:40.724429" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.724143" elapsed="0.000329"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:40.724629" elapsed="0.000332"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:40.722780" elapsed="0.002242"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.717257" elapsed="0.007798"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.725231" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.725082" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.717238" elapsed="0.008110"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:40.640823" elapsed="0.084576"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:40.640001" elapsed="0.085506"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.639756" elapsed="0.085800"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.639737" elapsed="0.085844"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.725616" elapsed="0.000031"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:40.496940" elapsed="0.228809"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:40.492619" elapsed="0.233188"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-05-01T00:43:40.492322" elapsed="0.233551"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:40.418348" elapsed="0.307653"/>
</test>
<test id="s1-s5-t6" name="Reconfigure_ODL_To_Accept_Connections_2" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:40.729516" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:40.729225" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.730772" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.730661" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.730642" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.736114" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.736008" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.735991" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.737173" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.736796" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.737686" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:40.737361" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:40.737757" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.737913" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.736409" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.743540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.743414" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.743396" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.744762" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:40.744656" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.744638" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:40.745274" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.744977" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.745721" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.745493" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.776621" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:40.746239" elapsed="0.030492"/>
</kw>
<msg time="2026-05-01T00:43:40.776900" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:40.776948" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.745907" elapsed="0.031122"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:40.810076" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:40.777610" elapsed="0.032577"/>
</kw>
<msg time="2026-05-01T00:43:40.810357" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:40.810404" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.777211" elapsed="0.033230"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.810777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.810546" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.810524" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.811307" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.811004" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.811681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.811446" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.811427" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:40.811794" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:40.814399" elapsed="0.000161"/>
</kw>
<msg time="2026-05-01T00:43:40.814623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.813251" elapsed="0.001502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.815171" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.815534" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:40.812638" elapsed="0.003082"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:40.812068" elapsed="0.003717"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:40.744331" elapsed="0.071552"/>
</kw>
<msg time="2026-05-01T00:43:40.815974" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.816018" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.743761" elapsed="0.072294"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:40.816242" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:40.816133" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.816114" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.816748" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.817083" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.817155" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:40.743076" elapsed="0.074186"/>
</kw>
<msg time="2026-05-01T00:43:40.817354" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:40.817398" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.738308" elapsed="0.079180"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.817851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.817583" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.817561" elapsed="0.000406"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:40.738165" elapsed="0.079826"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:40.737991" elapsed="0.080030"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:40.735649" elapsed="0.082427"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:40.730356" elapsed="0.087775"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:40.729932" elapsed="0.088244"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:40.726972" elapsed="0.091256"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.819131" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:11:0:0:0:2 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib ...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP_2}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.818417" elapsed="0.000744"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.853822" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.853202" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.854603" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.854363" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.854770" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.854027" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.855333" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.854957" elapsed="0.000403"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.855673" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.855816" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.855536" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.856243" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.856002" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.857242" level="INFO">mapping: {'IP': '2607:f0d0:1002:11:0:0:0:2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.856986" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.858019" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.857506" elapsed="0.000544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.858767" level="INFO">${value} = 2607:f0d0:1002:11:0:0:0:2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.858441" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.859536" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.859301" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.859612" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.859764" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.858984" elapsed="0.000837"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.859978" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-05-01T00:43:40.858305" elapsed="0.001954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.860821" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.860522" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.861614" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.861344" elapsed="0.000301"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.861705" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:43:40.861874" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.861032" elapsed="0.000866"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.862049" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:40.860372" elapsed="0.001939"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.862867" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.862571" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.863608" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.863385" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.863682" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.863832" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.863075" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.864004" elapsed="0.000218"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:40.862422" elapsed="0.001841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.864813" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.864519" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.865630" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.865340" elapsed="0.000326"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.865721" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:40.865875" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.865022" elapsed="0.000878"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.866053" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:40.864373" elapsed="0.001941"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.866866" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.866574" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.867607" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.867383" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.867682" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.867831" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.867076" elapsed="0.000779"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.868007" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.866427" elapsed="0.001838"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.869000" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.868524" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.869755" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.869548" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.869829" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.869980" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.869210" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.870202" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:40.868377" elapsed="0.002104"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.871021" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.870728" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.871802" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.871596" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.871876" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:40.872026" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.871230" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.872198" elapsed="0.000216"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.870597" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.873005" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:40.872714" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:40.873777" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.873561" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:40.873852" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.874004" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:40.873212" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:40.874178" elapsed="0.000264"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:40.872584" elapsed="0.001918"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.858107" elapsed="0.016431"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:40.874580" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:43:40.874783" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:40.856667" elapsed="0.018143"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.856355" elapsed="0.018487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.875022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.874868" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.856337" elapsed="0.018762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.876017" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.875301" elapsed="0.000745"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.876094" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.852592" elapsed="0.023627"/>
</kw>
<msg time="2026-05-01T00:43:40.876273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.839575" elapsed="0.036745"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.889544" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.902601" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.915484" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.915687" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.915860" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.916221" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.916079" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.916065" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.916439" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.916624" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.916787" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.916037" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.915935" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.917008" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.917084" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.917217" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.835121" elapsed="0.082124"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.944440" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.944066" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.945184" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.944976" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.945340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.944647" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.945992" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.945596" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.946313" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:40.946494" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:40.946177" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.946919" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.946679" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:40.947334" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.947043" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.947904" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:11:0:0:0:2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_IN...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.947605" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.947416" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.947025" elapsed="0.000964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.948893" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11:0:0:0:2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:40.948132" elapsed="0.000791"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:40.948973" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:40.943440" elapsed="0.005660"/>
</kw>
<msg time="2026-05-01T00:43:40.949156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:40.930326" elapsed="0.018875"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.963636" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.976606" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.989479" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.989706" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.989915" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.990279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.990136" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:40.990122" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.990515" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.990683" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.990849" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:40.990093" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.989990" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.991072" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:40.991147" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:40.991280" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11:0:0:0:2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:40.927575" elapsed="0.063734"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:40.992575" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:40.992323" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:40.992730" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:40.991980" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:40.993068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:40.992824" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.993676" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:40.993313" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:40.993148" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:40.992807" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.996143" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:40.993911" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:40.996221" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:40.996376" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:40.991656" elapsed="0.004744"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.997872" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.997623" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.998308" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11:0:0:0:2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.998071" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.998816" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.998572" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:40.999248" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:40.999010" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:41.000102" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:40.999910" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:41.000465" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:41.000280" elapsed="0.000213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:41.000641" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.001235" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.000991" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:41.001321" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:43:41.001521" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:40.999509" elapsed="0.002038"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:41.027029" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '999', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11:0:0:0:2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:41.027176" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:41.027400" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:41.003922" elapsed="0.023568"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.001620" elapsed="0.025976"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.028000" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.027656" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.001601" elapsed="0.026600"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.035958" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.030422" elapsed="0.005636"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.029937" elapsed="0.006198"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.029896" elapsed="0.006295"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.040053" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.036850" elapsed="0.003248"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.036315" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.036278" elapsed="0.003879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.040715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.040319" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.041049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.040812" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.041713" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.041344" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.041166" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.040794" elapsed="0.001006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.042328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.041960" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.042676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.042425" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.043209" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.042916" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.042758" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.042407" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.043438" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:41.044243" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.043958" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:41.044420" elapsed="0.002449"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:41.029024" elapsed="0.017908"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:41.047106" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:41.047000" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.046981" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.047337" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.047405" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:41.049772" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:40.996748" elapsed="0.053052"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:41.049865" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:41.050020" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:40.824042" elapsed="0.226002"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.050380" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.050141" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.050125" elapsed="0.000362"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:41.050522" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:40.819442" elapsed="0.231204"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with ipv6 address without "::" shortened version.</doc>
<status status="PASS" start="2026-05-01T00:43:40.726335" elapsed="0.324422"/>
</test>
<test id="s1-s5-t7" name="Verify_Ipv6_Topology_Filled_2" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:41.054216" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:41.053957" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.055478" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:41.055352" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.055334" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.060845" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:41.060738" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.060720" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.061999" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:41.061616" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.062546" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:41.062184" elapsed="0.000390"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:41.062620" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:41.062776" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:41.061139" elapsed="0.001661"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.068343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:41.068234" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.068216" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.069599" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:41.069490" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.069470" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:41.070104" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:41.069810" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:41.070518" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:41.070286" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:41.107078" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:41.071032" elapsed="0.036256"/>
</kw>
<msg time="2026-05-01T00:43:41.107712" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:41.107759" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:41.070703" elapsed="0.037093"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:41.135523" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:41.108516" elapsed="0.027137"/>
</kw>
<msg time="2026-05-01T00:43:41.135825" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:41.135870" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:41.108045" elapsed="0.027862"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.136284" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.136013" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.135980" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.136885" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.136545" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.137238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.137024" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.137005" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:41.137384" elapsed="0.000089"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:41.140188" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:43:41.140400" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.139040" elapsed="0.001604"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.140925" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.141292" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:41.138367" elapsed="0.003174"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:41.137784" elapsed="0.003826"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:41.069156" elapsed="0.072556"/>
</kw>
<msg time="2026-05-01T00:43:41.141809" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:41.141854" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:41.068578" elapsed="0.073314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:41.142329" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:41.141973" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.141954" elapsed="0.000466"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.142858" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.143204" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.143277" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:41.067896" elapsed="0.075490"/>
</kw>
<msg time="2026-05-01T00:43:41.143494" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:41.143539" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:41.063165" elapsed="0.080411"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.143902" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.143653" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.143636" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:41.063025" elapsed="0.080979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:41.062854" elapsed="0.081184"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:41.060361" elapsed="0.083735"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:41.055067" elapsed="0.089089"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:41.054642" elapsed="0.089562"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:41.051687" elapsed="0.092571"/>
</kw>
<kw name="Verify_Rib_Status_Filled">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.199966" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.199523" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.200821" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.200544" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:41.201004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:41.200184" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.201725" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:41.201313" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.202062" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:41.202267" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:41.201916" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.202716" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.202467" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.204137" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.203552" elapsed="0.000631"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.204657" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:41.204351" elapsed="0.000333"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.205033" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.205284" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.205528" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:41.204896" elapsed="0.000703"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.204741" elapsed="0.000899"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:41.205700" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:43:41.205879" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:41.203209" elapsed="0.002696"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.202849" elapsed="0.003088"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.206113" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.205964" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.202821" elapsed="0.003369"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.206818" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.206334" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:41.206895" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:41.198794" elapsed="0.008226"/>
</kw>
<msg time="2026-05-01T00:43:41.207076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.185010" elapsed="0.022116"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.220216" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.233308" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.246385" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.246612" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.246791" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.247186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.247037" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:41.247020" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.247410" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.247591" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.247756" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:41.246984" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.246872" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.247982" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.248060" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:43:41.248198" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:41.180392" elapsed="0.067833"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.249679" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.249333" elapsed="0.000426">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:41.249854" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:41.248920" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.250209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.249952" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.250779" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.250483" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.250289" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.249933" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.253316" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:41.251013" elapsed="0.002334"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:41.253411" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T00:43:41.253617" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:41.248576" elapsed="0.005070"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.254937" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.254696" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:41.255154" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:41.254338" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:41.255391" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:41.255252" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.255232" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.255643" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.255813" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.255879" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:41.258161" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:41.254001" elapsed="0.004188"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.259640" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.259365" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.260080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.259841" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:41.268275" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:41.268472" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:41.268584" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:41.262430" elapsed="0.006181"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.260190" elapsed="0.008469"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.268859" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.268690" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.260172" elapsed="0.008774"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.272677" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.270131" elapsed="0.002594"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.269902" elapsed="0.002857"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.269882" elapsed="0.002902"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.276332" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.273058" elapsed="0.003340"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.272839" elapsed="0.003608"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.272823" elapsed="0.003680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.277414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.276748" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.277956" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.277608" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.278745" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.278299" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.278073" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.277576" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.279638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.279103" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.280096" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.279774" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.280966" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.280546" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.280293" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.279749" elapsed="0.001334"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.281345" elapsed="0.000560"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:41.282611" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.282139" elapsed="0.000512"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:41.282881" elapsed="0.003750"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:41.269402" elapsed="0.017297"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.286885" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:41.286773" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.286754" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:41.290798" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:41.287106" elapsed="0.003736"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:41.290925" elapsed="0.000062"/>
</return>
<msg time="2026-05-01T00:43:41.291191" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:41.258540" elapsed="0.032693"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:41.291332" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:43:41.291580" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:41.157043" elapsed="0.134577"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.321687" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.321099" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.322589" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.322252" elapsed="0.000468">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:41.322902" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:41.321899" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.323550" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:41.323092" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:41.323905" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:41.324077" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:41.323740" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.324627" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
                            {
                                "prefix": "2a04:6d80::1/128"
                            }
                        ]
                    },
                    "node-id": "2607:f0d0:1002:11::2"
                }
            ],
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:41.324340" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:41.325230" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.324762" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.326001" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:41.325492" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:41.325324" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:41.324736" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.326742" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:41.326234" elapsed="0.000537"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:41.326825" elapsed="0.000038"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:41.320365" elapsed="0.006602"/>
</kw>
<msg time="2026-05-01T00:43:41.327025" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.306933" elapsed="0.020142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.340184" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.353099" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.365723" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.365964" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.366151" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.366596" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.366426" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:41.366408" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.366827" elapsed="0.000098"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.367078" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.367247" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:41.366365" elapsed="0.000936"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.366238" elapsed="0.001091"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.367494" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.367578" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:43:41.367740" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:41.304112" elapsed="0.063657"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:41.367949" elapsed="0.002412"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:41.371700" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:41.371162" elapsed="0.000567"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:41.372173" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:41.371883" elapsed="0.000318"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:43:41.372705" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
     "node-id": "2607:f0d0:1002:11::2"
    }
   ],
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:43:41.372895" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.372357" elapsed="0.000615">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.370721" elapsed="0.002390">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<status status="FAIL" start="2026-05-01T00:43:41.370444" elapsed="0.002767">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:41.373396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:41.373247" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:43:41.370425" elapsed="0.003068">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.293114" elapsed="0.080537">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.292193" elapsed="0.081596">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<status status="FAIL" start="2026-05-01T00:43:41.291749" elapsed="0.082124">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</branch>
<status status="FAIL" start="2026-05-01T00:43:41.291722" elapsed="0.082185">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:41.373956" elapsed="0.000017"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:43:41.149866" elapsed="0.224203">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.433013" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.432599" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.433863" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.433588" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.434041" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.433231" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.434679" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.434234" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.435014" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:43.435186" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:43.434869" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.435635" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.435368" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.436767" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.436438" elapsed="0.000374"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.437289" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.437012" elapsed="0.000365"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.437772" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.437987" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.438164" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:43.437632" elapsed="0.000589"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.437444" elapsed="0.000811"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:43.438308" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:43:43.438532" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:43.436086" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.435762" elapsed="0.002840"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.438777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.438629" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.435736" elapsed="0.003118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.439442" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.438994" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.439535" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.431897" elapsed="0.007763"/>
</kw>
<msg time="2026-05-01T00:43:43.439715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.418661" elapsed="0.021104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.452701" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.465659" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.478420" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.478649" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.478831" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.479236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.479088" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:43.479071" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.479568" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.479739" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.479904" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:43.479030" elapsed="0.000926"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.478912" elapsed="0.001073"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.480132" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.480238" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:43:43.480414" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:43.414093" elapsed="0.066354"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.481843" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.481549" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.482012" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.481150" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.482366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.482108" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.482949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.482653" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.482448" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.482089" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.485527" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.483180" elapsed="0.002374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:43.485606" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:43:43.485768" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:43.480800" elapsed="0.004993"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.487026" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.486782" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.487186" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.486430" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:43.487418" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:43.487282" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.487263" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.487668" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.487837" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.487901" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:43.490085" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:43.486106" elapsed="0.004007"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.491594" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.491320" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.492032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.491792" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:43.504486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:43.504681" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:43.504815" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:43.494363" elapsed="0.010487"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.492142" elapsed="0.012766"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.505153" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.504945" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.492123" elapsed="0.013148"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.510257" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.506710" elapsed="0.003617"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.506374" elapsed="0.004003"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.506349" elapsed="0.004064"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.513890" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.510830" elapsed="0.003108"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.510518" elapsed="0.003455"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.510493" elapsed="0.003511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.514605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.514183" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.514939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.514703" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.515498" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.515182" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.515021" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.514685" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.516101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.515741" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.516447" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.516210" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.516997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.516704" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.516543" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.516192" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.517240" elapsed="0.000389"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:43.518100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.517793" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.518280" elapsed="0.002497"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:43.505789" elapsed="0.015098"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.521066" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.520958" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.520940" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:43.524066" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.521279" elapsed="0.002816"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:43.524171" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:43.524332" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:43.490499" elapsed="0.033860"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.524421" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:43.524593" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:43.390072" elapsed="0.134547"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.553349" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.552893" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.554175" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.553900" elapsed="0.000392">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.554504" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.553567" elapsed="0.000963"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.555136" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.554694" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.555495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:43.555732" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:43.555321" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.556227" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
                            {
                                "prefix": "2a04:6d80::1/128"
                            }
                        ]
                    },
                    "node-id": "2607:f0d0:1002:11::2"
                }
            ],
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.555914" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:43.556805" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.556367" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.557594" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.557036" elapsed="0.000585"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.556891" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.556344" elapsed="0.001335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.558291" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.557823" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.558368" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.552249" elapsed="0.006268"/>
</kw>
<msg time="2026-05-01T00:43:43.558574" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.539229" elapsed="0.019393"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.573035" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.585995" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.598794" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.598989" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.599164" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.599554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.599397" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:43.599382" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.599774" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.599938" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.600132" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:43.599352" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.599245" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.600368" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.600447" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:43.600585" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:43.536571" elapsed="0.064074"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.600827" elapsed="0.002260"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:43.604314" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.603834" elapsed="0.000515"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:43.604968" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.604548" elapsed="0.000449"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:43.605153" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:43.603410" elapsed="0.002148"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.603169" elapsed="0.002423"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.605768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.605618" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.603150" elapsed="0.002696"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:43.525753" elapsed="0.080141"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:43.524944" elapsed="0.081024"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.524704" elapsed="0.081309"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.524687" elapsed="0.081349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.606069" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:43.382963" elapsed="0.223231"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:41.144706" elapsed="2.461542"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-05-01T00:43:41.144410" elapsed="2.461900"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled after configuring the peer for the second time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:41.051065" elapsed="2.555353"/>
</test>
<test id="s1-s5-t8" name="Delete_Bgp_Peer_Configuration_2" line="127">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:43.610013" elapsed="0.000244"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:43.609750" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.611332" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.611222" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.611204" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.616834" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.616708" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.616689" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.617916" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.617530" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.618443" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:43.618142" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:43.618532" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:43.618690" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.617137" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.624385" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.624255" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.624232" elapsed="0.000246"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.625639" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.625530" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.625512" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:43.626150" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.625851" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.626572" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:43.626336" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.661948" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:43.627098" elapsed="0.034953"/>
</kw>
<msg time="2026-05-01T00:43:43.662237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:43.662283" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.626762" elapsed="0.035557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.695094" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:43.662861" elapsed="0.032341"/>
</kw>
<msg time="2026-05-01T00:43:43.695363" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:43.695412" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.662513" elapsed="0.032956"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.695777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.695552" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.695531" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.696349" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.695997" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.696722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.696506" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.696486" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:43.696833" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:43.699353" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:43:43.699580" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.698262" elapsed="0.001449"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.699986" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.700391" elapsed="0.000102"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:43.697645" elapsed="0.002961"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:43.697098" elapsed="0.003608"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:43.625205" elapsed="0.075603"/>
</kw>
<msg time="2026-05-01T00:43:43.700899" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:43.700943" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.624632" elapsed="0.076348"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:43.701332" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:43.701057" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.701038" elapsed="0.000382"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.701844" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.702178" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.702251" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:43.623862" elapsed="0.078498"/>
</kw>
<msg time="2026-05-01T00:43:43.702473" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:43.702519" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.619083" elapsed="0.083473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.702882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.702632" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.702614" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:43.618942" elapsed="0.084042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:43.618768" elapsed="0.084245"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:43.616325" elapsed="0.086742"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:43.610933" elapsed="0.092188"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.610479" elapsed="0.092686"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:43.607399" elapsed="0.095818"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.704176" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:11:0:0:0:2 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib ...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP_2}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.703400" elapsed="0.000812"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.749524" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.749126" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.750337" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.750080" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.750526" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.749716" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.751102" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.750717" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.751511" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:43.751665" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:43.751354" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.752129" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.751849" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.753147" level="INFO">mapping: {'IP': '2607:f0d0:1002:11:0:0:0:2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.752886" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.753645" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.753351" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.754331" level="INFO">${value} = 2607:f0d0:1002:11:0:0:0:2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.754036" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.755285" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.754878" elapsed="0.000434"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.755364" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:43:43.755537" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.754560" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.755718" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-05-01T00:43:43.753903" elapsed="0.002096"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.756590" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.756267" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.757331" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.757120" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.757407" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:43.757578" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.756805" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.757753" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:43.756134" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.758577" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.758262" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.759312" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.759102" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.759388" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:43.759561" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.758789" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.759744" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:43.758128" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.760603" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.760286" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.761347" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.761137" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.761488" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:43:43.761648" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.760817" elapsed="0.000856"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.761825" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:43.760151" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.762648" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.762333" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.763380" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.763171" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.763470" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:43.763625" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.762859" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.763800" elapsed="0.000252"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:43.762201" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.764671" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.764351" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.765408" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.765200" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.765499" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:43.765651" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.764885" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.765825" elapsed="0.000219"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:43.764213" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.766834" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.766329" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.767586" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.767361" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.767663" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:43.767814" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.767047" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.767987" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:43.766197" elapsed="0.002071"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.768837" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:43.768533" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:43.769586" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.769363" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:43.769663" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:43.769816" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:43.769049" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.769999" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:43.768384" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:43.753722" elapsed="0.016576"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:43.770342" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:43.770520" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:43.752565" elapsed="0.017982"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.752250" elapsed="0.018378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.770810" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.770658" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.752230" elapsed="0.018658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.771739" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.771030" elapsed="0.000738"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.771818" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.748508" elapsed="0.023437"/>
</kw>
<msg time="2026-05-01T00:43:43.772000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.735381" elapsed="0.036689"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.784779" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.797479" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.810235" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.810430" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.810620" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.810984" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.810842" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:43.810827" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.811209" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.811377" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.811557" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:43.810798" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.810694" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.811783" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.811860" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:43.811982" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:43.730946" elapsed="0.081143"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.813206" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.812956" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:43.826151" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:43.826220" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A0%3A0%3A0%3A2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:43.826367" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:43.815601" elapsed="0.010804"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.813320" elapsed="0.013172"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.826749" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.826532" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.813302" elapsed="0.013563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.831683" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.828286" elapsed="0.003457"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.827949" elapsed="0.003844"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.827925" elapsed="0.003903"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.835527" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.832247" elapsed="0.003345"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.831905" elapsed="0.003737"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.831882" elapsed="0.003794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.836449" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.835906" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.836939" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.836611" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.837722" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.837276" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.837054" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.836586" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.838592" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.838063" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.839051" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.838728" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.839820" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.839386" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.839165" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.838704" elapsed="0.001234"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.840163" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:43.841338" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.840944" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.841618" elapsed="0.003218"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:43.827363" elapsed="0.017536"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:43.844945" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:43.847232" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:43.812364" elapsed="0.034896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.847314" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:43.704485" elapsed="0.142957"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:43:43.606824" elapsed="0.240752"/>
</test>
<test id="s1-s5-t9" name="Verify_Ipv6_Topology_Empty_2" line="140">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:43.851036" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:43.850774" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.852346" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.852225" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.852202" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.857676" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.857569" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.857551" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.858748" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.858343" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.859226" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:43.858933" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:43.859297" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:43.859471" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.857971" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.865116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.865001" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.864983" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.866336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:43.866229" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.866212" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:43.866868" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.866572" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.867265" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:43.867050" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.904410" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:43.867799" elapsed="0.036734"/>
</kw>
<msg time="2026-05-01T00:43:43.904697" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:43.904743" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.867448" elapsed="0.037331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:43.932246" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:43.905290" elapsed="0.027061"/>
</kw>
<msg time="2026-05-01T00:43:43.932530" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:43.932576" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.904950" elapsed="0.027663"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.932912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.932691" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.932672" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.933425" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.933129" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.933807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.933592" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.933574" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:43.933917" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:43.936415" elapsed="0.000160"/>
</kw>
<msg time="2026-05-01T00:43:43.936636" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.935332" elapsed="0.001431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.937167" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.937534" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:43.934719" elapsed="0.003004"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:43.934175" elapsed="0.003613"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:43.865928" elapsed="0.071957"/>
</kw>
<msg time="2026-05-01T00:43:43.937976" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:43.938020" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.865334" elapsed="0.072723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:43.938240" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:43.938133" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.938115" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.938747" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.939087" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.939159" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:43.864660" elapsed="0.074608"/>
</kw>
<msg time="2026-05-01T00:43:43.939360" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:43.939404" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.859862" elapsed="0.079579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.939780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.939533" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.939515" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:43.859721" elapsed="0.080160"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:43.859551" elapsed="0.080590"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:43.857190" elapsed="0.083018"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:43.851891" elapsed="0.088373"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:43.851449" elapsed="0.088860"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:43.848576" elapsed="0.091785"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.992992" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:43.992620" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.993753" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:43.993529" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:43.993915" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:43.993180" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.994497" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:43.994102" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:43.994820" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:43.994955" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:43.994685" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.995372" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.995133" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.996624" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:43.996324" elapsed="0.000346"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.997095" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:43.996831" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.997437" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.997673" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.997843" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:43.997305" elapsed="0.000595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:43.997170" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:43.997972" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:43.998131" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:43.995788" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:43.995498" elapsed="0.002689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:43.998356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:43.998211" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:43.995478" elapsed="0.002955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:43.999020" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:43.998594" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:43.999096" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:43.991956" elapsed="0.007301"/>
</kw>
<msg time="2026-05-01T00:43:43.999312" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:43.979003" elapsed="0.020356"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.012236" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.025147" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.038035" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.038232" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.038405" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.038782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.038639" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.038625" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.039000" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.039165" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.039328" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.038597" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.038494" elapsed="0.000912"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.039568" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.039645" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.039761" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:43.974602" elapsed="0.065184"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.041189" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.040917" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.041347" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.040577" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.041700" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.041442" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.042235" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.041944" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.041782" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.041423" elapsed="0.000895"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.044939" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.042480" elapsed="0.002486"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:44.045018" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:44.045174" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:44.040186" elapsed="0.005012"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.046442" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.046210" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.046614" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.045875" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:44.046844" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:44.046709" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.046691" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.047070" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.047238" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.047304" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.049345" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:44.045549" elapsed="0.003823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.050766" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.050520" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.051203" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.050963" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:44.060611" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:44.060744" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:44.060838" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:44.053487" elapsed="0.007377"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.051312" elapsed="0.009594"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.061082" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.060932" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.051294" elapsed="0.009906"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.066813" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.062386" elapsed="0.004498"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.062170" elapsed="0.004766"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.062152" elapsed="0.004821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.070656" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.067369" elapsed="0.003352"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.067054" elapsed="0.003715"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.067030" elapsed="0.003775"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.071591" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.071037" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.072085" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.071727" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.072869" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.072432" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.072202" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.071702" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.073753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.073206" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.074401" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.073940" elapsed="0.000613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.075322" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.074893" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.074607" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.073903" elapsed="0.001594"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.075821" elapsed="0.000735"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:44.077202" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.076793" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.077489" elapsed="0.003475"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:44.061609" elapsed="0.019450"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.081322" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.081167" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.081139" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.084436" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.081672" elapsed="0.002810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:44.084537" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:43:44.084702" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:44.049696" elapsed="0.035032"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.084791" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:44.084942" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:43.951400" elapsed="0.133568"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.113745" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.113270" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.114606" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.114269" elapsed="0.000467">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.114913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.113935" elapsed="0.001003"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.115622" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.115101" elapsed="0.000549"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.115997" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:44.116153" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:44.115811" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.116623" level="INFO">{
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.116339" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:44.117136" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.116737" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.117879" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.117363" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.117220" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.116718" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.118597" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.118105" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.118673" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.112655" elapsed="0.006144"/>
</kw>
<msg time="2026-05-01T00:43:44.118853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.099606" elapsed="0.019294"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.131781" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.144713" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.157401" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.157607" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.157782" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.158158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.158017" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.158003" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.158380" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.158563" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.158728" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.157973" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.157863" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.158951" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.159026" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.159142" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:44.096910" elapsed="0.062259"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.159341" elapsed="0.004265"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.164709" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.164382" elapsed="0.000355"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.165172" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.164890" elapsed="0.000309"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:44.165349" elapsed="0.000395"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:44.163973" elapsed="0.001834"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.163687" elapsed="0.002153"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.166038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.165865" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.163669" elapsed="0.002482"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:44.086189" elapsed="0.080021"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:44.085364" elapsed="0.080926"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.085108" elapsed="0.081228"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.085089" elapsed="0.081270"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.166392" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:43.945149" elapsed="0.221385"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:43.940787" elapsed="0.225802"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-05-01T00:43:43.940509" elapsed="0.226142"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the second time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:43.847871" elapsed="0.318888"/>
</test>
<test id="s1-s5-t10" name="Reconfigure_ODL_To_Accept_Connections_3" line="145">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:44.170268" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:44.170008" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.171523" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.171391" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.171373" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.176653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.176546" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.176528" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.177703" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.177312" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.178175" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:44.177885" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:44.178245" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.178397" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.176944" elapsed="0.001477"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.223253" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.223111" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.223085" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.224772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.224665" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.224646" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:44.225307" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.224986" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.225729" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:44.225509" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.260032" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:44.226240" elapsed="0.033963"/>
</kw>
<msg time="2026-05-01T00:43:44.260404" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:44.260472" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.225910" elapsed="0.034689"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.288698" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:44.261224" elapsed="0.027578"/>
</kw>
<msg time="2026-05-01T00:43:44.288959" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:44.289004" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.260818" elapsed="0.028220"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.289374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.289130" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.289104" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.289932" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.289629" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.290279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.290067" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.290049" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:44.290393" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:44.293091" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:43:44.293303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.291971" elapsed="0.001468"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.293739" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.294073" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:44.291285" elapsed="0.002976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:44.290726" elapsed="0.003601"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:44.224316" elapsed="0.070108"/>
</kw>
<msg time="2026-05-01T00:43:44.294553" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:44.294601" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.223545" elapsed="0.071092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:44.294824" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:44.294717" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.294698" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.295315" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.295680" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.295754" elapsed="0.000027"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:44.222635" elapsed="0.073243"/>
</kw>
<msg time="2026-05-01T00:43:44.295973" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:44.296017" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.178807" elapsed="0.117248"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.296380" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.296132" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.296114" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:44.178667" elapsed="0.117866"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:44.178495" elapsed="0.118072"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:44.176171" elapsed="0.120453"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:44.171108" elapsed="0.125571"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.170690" elapsed="0.126033"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:44.167746" elapsed="0.129030"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.297678" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:11::2 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP_3}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.296970" elapsed="0.000736"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.331934" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.331550" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.332727" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.332470" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.332900" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.332124" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.333499" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.333086" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.333829" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:44.334030" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:44.333694" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.334472" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.334212" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.335477" level="INFO">mapping: {'IP': '2607:f0d0:1002:11::2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.335202" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.335975" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.335682" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.336689" level="INFO">${value} = 2607:f0d0:1002:11::2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.336372" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.337435" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.337214" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.337528" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.337681" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.336902" elapsed="0.000835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.337893" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-05-01T00:43:44.336237" elapsed="0.001936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.338878" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.338417" elapsed="0.000487"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.339631" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.339402" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.339707" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.339881" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.339091" elapsed="0.000815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.340058" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:44.338285" elapsed="0.002035"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.340878" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.340581" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.341623" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.341399" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.341699" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:44.341849" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.341088" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.342021" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:44.340433" elapsed="0.001849"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.342836" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.342538" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.343583" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.343359" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.343657" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.343829" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.343047" elapsed="0.000807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.344003" elapsed="0.000220"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:44.342393" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.344820" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.344525" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.345569" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.345345" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.345645" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.345797" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.345030" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.345972" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:44.344378" elapsed="0.001854"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.346789" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.346493" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.347535" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.347310" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.347609" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.347771" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.346999" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.347984" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:44.346347" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.348808" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.348511" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.349723" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.349509" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.349800" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.349951" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.349019" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.350127" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:44.348360" elapsed="0.002028"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.350946" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.350650" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:44.351694" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.351485" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:44.351796" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.351948" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:44.351157" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.352123" elapsed="0.000218"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:44.350517" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:44.336053" elapsed="0.016363"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:44.352473" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:44.352635" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A11%3A%3A2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:44.334881" elapsed="0.017781"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.334587" elapsed="0.018106"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.352864" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.352718" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.334568" elapsed="0.018372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.353780" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.353080" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.353858" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.330931" elapsed="0.023051"/>
</kw>
<msg time="2026-05-01T00:43:44.354036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.318032" elapsed="0.036052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.366803" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.379540" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.392256" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.392465" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.392641" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.393047" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.392903" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.392889" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.393269" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.393436" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.393625" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.392858" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.392715" elapsed="0.000989"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.393848" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.393924" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:43:44.394045" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:44.313682" elapsed="0.080390"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.421122" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.420749" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.421862" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.421655" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.422018" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.421311" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.422641" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.422203" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.422957" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:44.423117" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:44.422825" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.423562" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.423301" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:44.423989" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.423689" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.424526" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:11::2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANC...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.424216" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.424072" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.423670" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.425514" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11::2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.424755" elapsed="0.000797"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.425613" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.420125" elapsed="0.005617"/>
</kw>
<msg time="2026-05-01T00:43:44.425799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.407120" elapsed="0.018725"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.438483" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.451168" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.463996" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.464189" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.464395" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.464773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.464632" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.464618" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.464989" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.465153" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.465313" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.464589" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.464485" elapsed="0.000906"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.465547" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.465625" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:43:44.465757" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11::2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:44.404407" elapsed="0.061378"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.467017" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.466786" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.467169" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.466434" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.467523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.467264" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.468095" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.467791" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.467605" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.467246" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.470568" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.468326" elapsed="0.002269"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:44.470647" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.470802" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:44.466115" elapsed="0.004711"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.472224" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.471979" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.472672" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11::2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.472420" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.473159" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.472916" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.473609" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.473351" elapsed="0.000301"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:44.474439" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:44.474249" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:44.474938" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:44.474633" elapsed="0.000331"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.475111" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.475733" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.475477" elapsed="0.000300"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:44.475819" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.475974" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:44.473853" elapsed="0.002145"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:44.494124" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '994', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:11::2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:44.494270" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:44.494542" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:44.478323" elapsed="0.016280"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.476068" elapsed="0.018636"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.495102" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.494763" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.476050" elapsed="0.019248"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.501960" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.497490" elapsed="0.004530"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.496977" elapsed="0.005091"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.496937" elapsed="0.005166"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.505736" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.502502" elapsed="0.003297"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.502179" elapsed="0.003668"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.502156" elapsed="0.003726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.506644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.506104" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.507101" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.506778" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.507952" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.507519" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.507266" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.506754" elapsed="0.001315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.508822" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.508290" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.509276" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.508956" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.510079" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.509671" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.509388" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.508931" elapsed="0.001263"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.510399" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:44.511528" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.511125" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.511811" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:44.496153" elapsed="0.018234"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:44.514575" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:44.514468" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.514436" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.514808" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.514877" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.517203" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:44.471157" elapsed="0.046073"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.517294" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:44.517447" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:44.302646" elapsed="0.214842"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.517821" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.517586" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.517569" elapsed="0.000344"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.517945" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:44.297978" elapsed="0.220090"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with full text ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:43:44.167115" elapsed="0.351069"/>
</test>
<test id="s1-s5-t11" name="Verify_Ipv6_Topology_Filled_3" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:44.521581" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:44.521308" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.522817" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.522710" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.522692" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.528248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.528140" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.528122" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.529310" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.528934" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.529804" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:44.529510" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:44.529875" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.530029" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.528564" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.535594" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.535484" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.535464" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.536853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.536745" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.536727" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:44.537363" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.537066" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.537778" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:44.537563" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.572168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:44.538294" elapsed="0.033973"/>
</kw>
<msg time="2026-05-01T00:43:44.572431" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:44.572504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.537961" elapsed="0.034579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:44.600506" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:44.573050" elapsed="0.027554"/>
</kw>
<msg time="2026-05-01T00:43:44.600760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:44.600805" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.572711" elapsed="0.028128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.601135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.600916" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.600897" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.601673" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "F "i "l "l "e "d "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.601357" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.602019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.601807" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.601788" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:44.602129" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:44.604634" elapsed="0.000272"/>
</kw>
<msg time="2026-05-01T00:43:44.604968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.603565" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.605410" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.605771" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:44.602935" elapsed="0.003020"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:44.602391" elapsed="0.003627"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:44.536423" elapsed="0.069691"/>
</kw>
<msg time="2026-05-01T00:43:44.606205" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:44.606248" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.535842" elapsed="0.070441"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:44.606488" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:44.606359" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.606340" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.606974" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.607311" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.607384" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:44.535135" elapsed="0.072377"/>
</kw>
<msg time="2026-05-01T00:43:44.607604" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:44.607661" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.530420" elapsed="0.077277"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.608024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.607777" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.607757" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:44.530278" elapsed="0.077847"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:44.530107" elapsed="0.078047"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:44.527735" elapsed="0.080473"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:44.522404" elapsed="0.085859"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:44.521988" elapsed="0.086320"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:44.519113" elapsed="0.089246"/>
</kw>
<kw name="Verify_Rib_Status_Filled">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.660885" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.660509" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.661658" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.661402" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.661828" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.661075" elapsed="0.000777"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.662393" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.662014" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.662777" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:44.662924" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:44.662639" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.663345" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.663105" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.664403" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.664123" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.664903" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.664635" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.665253" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.665474" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.665649" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.665119" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.664980" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:44.665779" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.665938" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:44.663794" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.663473" elapsed="0.002521"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.666162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.666018" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.663439" elapsed="0.002799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.666830" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.666378" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.666906" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.659872" elapsed="0.007157"/>
</kw>
<msg time="2026-05-01T00:43:44.667083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.646724" elapsed="0.020406"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.679804" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.692613" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.705475" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.705676" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.705848" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.706210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.706067" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.706052" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.706426" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.706609" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.706772" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.706024" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.705922" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.706994" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.707069" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.707186" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:44.642267" elapsed="0.064944"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.708482" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.708229" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.708644" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.707894" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.708984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.708739" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.709536" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.709230" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.709064" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.708721" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.712009" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.709768" elapsed="0.002268"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:44.712087" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:44.712240" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:44.707549" elapsed="0.004715"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.713494" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.713246" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.713688" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.712914" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:44.713919" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:44.713784" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.713765" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.714150" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.714319" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.714384" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:44.716540" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:44.712594" elapsed="0.003973"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.717990" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.717742" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.718425" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.718186" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:44.727823" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:44.727962" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:44.728059" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:44.720697" elapsed="0.007387"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.718552" elapsed="0.009574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.728305" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.728152" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.718534" elapsed="0.009856"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.731905" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.729420" elapsed="0.002532"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.729202" elapsed="0.002786"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.729184" elapsed="0.002829"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.735541" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.732286" elapsed="0.003345"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.732068" elapsed="0.003618"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.732052" elapsed="0.003670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.736513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.735950" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.737001" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.736653" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.737873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.737394" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.737121" elapsed="0.000840"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.736628" elapsed="0.001365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.738748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.738214" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.739208" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.738886" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.740084" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.739657" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.739376" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.738861" elapsed="0.001340"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.740408" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:44.741589" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.741148" elapsed="0.000479"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:44.741842" elapsed="0.004344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:44.728785" elapsed="0.017468"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.746435" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:44.746325" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.746306" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.749428" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.746672" elapsed="0.002805"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:44.749532" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:44.749692" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:44.716908" elapsed="0.032810"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.749781" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:43:44.749989" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:44.619551" elapsed="0.130465"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.778750" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.778286" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.779575" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.779270" elapsed="0.000425">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:44.779870" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:44.778940" elapsed="0.000961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.780521" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:44.780063" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:44.780866" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:44.781009" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:44.780709" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.781518" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
                            {
                                "prefix": "2a04:6d80::1/128"
                            }
                        ]
                    },
                    "node-id": "2607:f0d0:1002:11::2"
                }
            ],
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:44.781226" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:44.782030" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.781635" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.782773" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:44.782259" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:44.782115" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:44.781616" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.783475" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:44.783002" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:44.783588" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:44.777674" elapsed="0.006042"/>
</kw>
<msg time="2026-05-01T00:43:44.783773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.764784" elapsed="0.019037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.796753" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.809322" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.822041" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.822237" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.822411" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.822805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.822662" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:44.822647" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.823024" elapsed="0.000052"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.823230" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.823397" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:44.822616" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.822506" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.823651" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.823728" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:44.823849" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:44.761994" elapsed="0.061883"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:44.824050" elapsed="0.002249"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.827489" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.827040" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:44.827971" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:44.827686" elapsed="0.000313"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:43:44.828482" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
     "node-id": "2607:f0d0:1002:11::2"
    }
   ],
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:43:44.828654" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.828153" elapsed="0.000566">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.826634" elapsed="0.002221">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<status status="FAIL" start="2026-05-01T00:43:44.826379" elapsed="0.002548">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:44.829107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:44.828959" elapsed="0.000205"/>
</branch>
<status status="FAIL" start="2026-05-01T00:43:44.826361" elapsed="0.002826">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.751171" elapsed="0.078158">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.750345" elapsed="0.079136">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<status status="FAIL" start="2026-05-01T00:43:44.750102" elapsed="0.079464">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</branch>
<status status="FAIL" start="2026-05-01T00:43:44.750084" elapsed="0.079515">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:44.829646" elapsed="0.000017"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:43:44.613302" elapsed="0.216455">Multiline strings are different:
--- first
+++ second
@@ -1,18 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "l3-unicast-igp-topology:igp-node-attributes": {
-      "prefix": [
-       {
-        "prefix": "2a04:6d80::1/128"
-       }
-      ]
-     },
-     "node-id": "2607:f0d0:1002:11::2"
-    }
-   ],
    "odl-bgp-topology-config:rib-id": "example-bgp-rib",
    "server-provided": true,
    "topology-id": "example-ipv6-topology",</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.894758" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:46.894246" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:46.895839" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:46.895500" elapsed="0.000445">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:46.896068" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:46.895029" elapsed="0.001071"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.896817" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:46.896316" elapsed="0.000535"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:46.897231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:46.897434" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:46.897057" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.897983" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.897679" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.899226" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.898837" elapsed="0.000437"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.899761" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:46.899441" elapsed="0.000404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.900223" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.900444" elapsed="0.000044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.900678" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:46.900074" elapsed="0.000682"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:46.899904" elapsed="0.000893"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:46.900855" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:43:46.901053" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:46.898491" elapsed="0.002590"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.898133" elapsed="0.002988"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.901347" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.901158" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.898106" elapsed="0.003375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.902340" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:46.901692" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:46.902435" elapsed="0.000055"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:46.893491" elapsed="0.009142"/>
</kw>
<msg time="2026-05-01T00:43:46.902714" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:46.878488" elapsed="0.024303"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.916338" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.929134" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.941802" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.942014" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.942195" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.942623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.942448" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:46.942431" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.942918" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.943088" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.943253" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:46.942392" elapsed="0.000914"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:46.942277" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.943498" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:46.943578" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:43:46.943721" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:46.874037" elapsed="0.069711"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:46.945115" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:46.944830" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:46.945284" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:46.944427" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.945659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.945379" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.946219" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:46.945921" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.945741" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.945361" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.948732" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:46.946466" elapsed="0.002292"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:46.948810" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:46.948970" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:46.944075" elapsed="0.004919"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:46.950212" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:46.949977" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:46.950369" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:46.949641" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:46.950636" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:46.950497" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.950445" elapsed="0.000278"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.950870" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.951041" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:46.951105" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:46.953266" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:46.949303" elapsed="0.003991"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.954774" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.954512" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.955215" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.954973" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:46.964522" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:46.964685" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:46.964790" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:46.957493" elapsed="0.007324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.955324" elapsed="0.009537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.965057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.964889" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.955306" elapsed="0.009838"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.968727" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","node":[{"node-id":"2607:f0d0:1002:11::2","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"2a04:6d80::1/128"}]}}],"server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.966197" elapsed="0.002578"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.965964" elapsed="0.002849"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.965946" elapsed="0.002893"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.971849" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:46.969115" elapsed="0.002801"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.968894" elapsed="0.003072"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.968877" elapsed="0.003126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.972834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:46.972246" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.973326" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.972977" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.974129" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:46.973713" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.973446" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.972951" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.975031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:46.974517" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:46.975514" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:46.975165" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:46.976264" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:46.975855" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.975629" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.975140" elapsed="0.001238"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:46.976616" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:46.977768" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:46.977326" elapsed="0.000479"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:46.978021" elapsed="0.003503"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:46.965534" elapsed="0.016150"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:46.981949" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:46.981789" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.981762" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:46.985298" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:46.982304" elapsed="0.003025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:46.985384" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:43:46.985585" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:46.953668" elapsed="0.031946"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:46.985679" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:46.985838" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:46.849694" elapsed="0.136171"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.014828" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.014332" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.015693" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.015361" elapsed="0.000460">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.015997" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.015023" elapsed="0.001000"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.016659" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.016193" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.017011" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_filled/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:47.017173" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:47.016848" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.017646" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
                            {
                                "prefix": "2a04:6d80::1/128"
                            }
                        ]
                    },
                    "node-id": "2607:f0d0:1002:11::2"
                }
            ],
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.017356" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:47.018193" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.017788" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.018994" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.018424" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.018279" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.017767" elapsed="0.001312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.019751" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.019237" elapsed="0.000543"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.019831" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.013697" elapsed="0.006262"/>
</kw>
<msg time="2026-05-01T00:43:47.020015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.000727" elapsed="0.019337"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.033120" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.045862" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.058655" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.058849" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.059023" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.059415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.059272" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:47.059258" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.059654" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.059820" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.059986" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:47.059227" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.059114" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.060214" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.060290" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:47.060410" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "l3-unicast-igp-topology:igp-node-attributes": {
                        "prefix": [
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:46.998032" elapsed="0.062459"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.060675" elapsed="0.002289"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:47.064150" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.063712" elapsed="0.000468"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:47.064772" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "2a04:6d80::1/128"
       }
      ]
     },
...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.064336" elapsed="0.000465"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:47.064958" elapsed="0.000351"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:47.063289" elapsed="0.002082"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.063049" elapsed="0.002356"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.065600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.065430" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.063030" elapsed="0.002749"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:46.987203" elapsed="0.078626"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:46.986219" elapsed="0.079686"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:46.985950" elapsed="0.080001"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:46.985933" elapsed="0.080042"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.066010" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:46.839297" elapsed="0.226843"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_filled</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:44.608784" elapsed="2.457424"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-05-01T00:43:44.608507" elapsed="2.457790"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled after configuring the peer for the third time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:44.518500" elapsed="2.547937"/>
</test>
<test id="s1-s5-t12" name="Delete_Bgp_Peer_Configuration_3" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:47.070001" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:47.069731" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.071310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.071197" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.071177" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.076655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.076548" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.076529" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.077785" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.077370" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.078329" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:47.078011" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:47.078401" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.078582" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.076957" elapsed="0.001650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.084261" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.084149" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.084129" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.085556" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.085422" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.085404" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:47.086094" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.085780" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.086547" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.086291" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.117772" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.087247" elapsed="0.030636"/>
</kw>
<msg time="2026-05-01T00:43:47.118058" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:47.118107" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.086883" elapsed="0.031262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.144292" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.118708" elapsed="0.025694"/>
</kw>
<msg time="2026-05-01T00:43:47.144627" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:47.144674" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.118325" elapsed="0.026386"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.145023" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.144792" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.144771" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.145596" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.145256" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.145968" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.145747" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.145727" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:47.146082" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.148669" elapsed="0.000298"/>
</kw>
<msg time="2026-05-01T00:43:47.149031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.147559" elapsed="0.001607"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.149444" elapsed="0.000118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.149826" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:47.146921" elapsed="0.003092"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:47.146357" elapsed="0.003755"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:47.085106" elapsed="0.065108"/>
</kw>
<msg time="2026-05-01T00:43:47.150307" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.150352" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.084503" elapsed="0.065885"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:47.150603" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:47.150490" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.150448" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.151094" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.151437" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.151528" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:47.083803" elapsed="0.067835"/>
</kw>
<msg time="2026-05-01T00:43:47.151732" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.151777" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.078978" elapsed="0.072835"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.152144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.151890" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.151873" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:47.078836" elapsed="0.073410"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:47.078660" elapsed="0.073617"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:47.076171" elapsed="0.076174"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:47.070899" elapsed="0.081508"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.070440" elapsed="0.082033"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:47.067478" elapsed="0.085054"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.153432" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:11::2 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP_3}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.152726" elapsed="0.000763"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.197610" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.197203" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.198382" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.198142" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.198571" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.197806" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.199152" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.198763" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.199545" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:47.199699" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:47.199386" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.200153" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.199902" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.201184" level="INFO">mapping: {'IP': '2607:f0d0:1002:11::2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.200920" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.201680" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.201395" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.202385" level="INFO">${value} = 2607:f0d0:1002:11::2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.202079" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.203544" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.203295" elapsed="0.000276"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.203624" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:47.203811" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.202962" elapsed="0.000881"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.204007" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-05-01T00:43:47.201941" elapsed="0.002357"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.204877" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.204571" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.205647" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.205418" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.205725" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.205879" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.205094" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.206056" elapsed="0.000226"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:47.204418" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.206896" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.206592" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.207658" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.207430" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.207759" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:43:47.207934" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.207112" elapsed="0.000849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.208116" elapsed="0.000225"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:47.206440" elapsed="0.001941"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.208956" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.208652" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.209722" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.209506" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.209802" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:47.209998" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.209173" elapsed="0.000851"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.210178" elapsed="0.000226"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:47.208515" elapsed="0.001931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.211027" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.210718" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.211827" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.211588" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.211906" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:47.212065" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.211247" elapsed="0.000844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.212243" elapsed="0.000242"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:47.210581" elapsed="0.001947"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.213079" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.212779" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.214041" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.213646" elapsed="0.000423"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.214121" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.214276" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.213302" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.214469" elapsed="0.000229"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:47.212645" elapsed="0.002094"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.215298" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.214994" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.216157" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.215939" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.216232" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:47.216384" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.215570" elapsed="0.000839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.216581" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:47.214859" elapsed="0.001985"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.217393" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.217094" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:47.218153" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.217945" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:47.218229" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:47.218380" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:47.217628" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.218574" elapsed="0.000221"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:47.216957" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:47.201757" elapsed="0.017115"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:47.218915" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:47.219077" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A11%3A%3A2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:47.200594" elapsed="0.018510"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.200272" elapsed="0.018864"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.219353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.219197" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.200253" elapsed="0.019178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.220322" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.219625" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.220400" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.196580" elapsed="0.023971"/>
</kw>
<msg time="2026-05-01T00:43:47.220605" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.183343" elapsed="0.037309"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.233577" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.246282" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.259251" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.259476" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.259658" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.260026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.259883" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:47.259869" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.260245" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.260410" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.260597" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:47.259839" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.259734" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.260820" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.260895" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:47.261016" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:47.178878" elapsed="0.082197"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.262179" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.261929" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:47.274385" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:47.274436" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A11%3A%3A2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:47.274586" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:47.264406" elapsed="0.010241"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.262293" elapsed="0.012445"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.275179" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.274797" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.262275" elapsed="0.013098"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.283146" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.277673" elapsed="0.005574"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.277147" elapsed="0.006179"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.277108" elapsed="0.006275"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.286162" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.283801" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.283540" elapsed="0.002704"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.283501" elapsed="0.002767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.286840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.286435" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.287190" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.286949" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.287749" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.287431" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.287272" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.286930" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.288353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.287990" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.288702" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.288448" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.289238" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.288942" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.288784" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.288431" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.289483" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:47.290321" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.289997" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.290518" elapsed="0.003673"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:47.276196" elapsed="0.018061"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:47.294305" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:43:47.296665" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:47.261342" elapsed="0.035350"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.296747" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:47.153737" elapsed="0.143136"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:43:47.066844" elapsed="0.230145"/>
</test>
<test id="s1-s5-t13" name="Verify_Ipv6_Topology_Empty_3" line="179">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:47.300394" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:47.300132" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.301673" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.301562" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.301544" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.306822" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.306668" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.306650" elapsed="0.000243"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.307902" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.307510" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.308382" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:47.308088" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:47.308468" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:47.308628" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.307119" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.314402" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.314291" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.314272" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.315710" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.315601" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.315583" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:47.316229" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.315926" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.316652" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.316412" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.349994" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.317177" elapsed="0.032921"/>
</kw>
<msg time="2026-05-01T00:43:47.350294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:47.350349" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.316841" elapsed="0.033544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.389297" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.350924" elapsed="0.038600"/>
</kw>
<msg time="2026-05-01T00:43:47.389711" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:47.389758" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.350581" elapsed="0.039213"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.390187" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.389910" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.389875" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.390790" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.390422" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.391169" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.390930" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.390910" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:47.391287" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.394099" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:43:47.394317" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.392871" elapsed="0.001606"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.394759" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.395105" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:47.392190" elapsed="0.003105"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:47.391621" elapsed="0.003741"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:47.315261" elapsed="0.080216"/>
</kw>
<msg time="2026-05-01T00:43:47.395576" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.395622" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.314658" elapsed="0.081002"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:47.395849" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:47.395739" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.395720" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.396358" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.396731" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.396804" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:47.313941" elapsed="0.082978"/>
</kw>
<msg time="2026-05-01T00:43:47.397016" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.397061" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.309023" elapsed="0.088075"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.397427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.397176" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.397157" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:47.308878" elapsed="0.088669"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:47.308706" elapsed="0.088876"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:47.306288" elapsed="0.091396"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:47.301261" elapsed="0.096484"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.300829" elapsed="0.096978"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:47.297903" elapsed="0.099961"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.451170" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.450748" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.451973" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.451720" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.452148" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.451364" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.452736" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.452336" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.453061" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:47.453243" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:47.452926" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.453702" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.453431" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.454740" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.454439" elapsed="0.000347"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.455266" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.454948" elapsed="0.000344"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.455662" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.455875" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.456049" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:47.455519" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.455347" elapsed="0.000789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:47.456180" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.456343" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:47.454116" elapsed="0.002254"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.453817" elapsed="0.002585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.456590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.456426" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.453798" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.457270" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.456809" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.457346" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.450117" elapsed="0.007384"/>
</kw>
<msg time="2026-05-01T00:43:47.457628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.437047" elapsed="0.020635"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.470662" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.483494" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.496269" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.496480" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.496657" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.497031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.496888" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:47.496874" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.497251" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.497417" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.497597" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:47.496844" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.496742" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.497821" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.497897" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:47.498015" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:47.432612" elapsed="0.065429"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.499301" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.499048" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.499509" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.498707" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.499853" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.499607" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.500394" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.500104" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.499935" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.499589" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.502918" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.500646" elapsed="0.002299"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:47.502998" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.503153" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:47.498369" elapsed="0.004808"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.504394" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.504161" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.504568" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.503825" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:47.504820" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:47.504682" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.504660" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.505055" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.505226" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.505291" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:47.507448" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:47.503504" elapsed="0.003987"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.508914" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.508661" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.509355" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.509113" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:47.518552" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:47.518693" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:47.518789" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:47.511614" elapsed="0.007202"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.509481" elapsed="0.009376"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.519036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.518884" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.509447" elapsed="0.009707"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.522646" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.520178" elapsed="0.002515"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.519960" elapsed="0.002767"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.519942" elapsed="0.002811"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.525363" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.523034" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.522809" elapsed="0.002633"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.522792" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.526049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.525661" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.526382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.526147" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.526942" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.526641" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.526479" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.526129" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.527562" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.527185" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.527890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.527659" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.528472" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.528129" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.527971" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.527641" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.528707" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:47.529521" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.529214" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.529701" elapsed="0.002460"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:47.519538" elapsed="0.012685"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.532415" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.532295" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.532276" elapsed="0.000232"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:47.535365" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.532653" elapsed="0.002741"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:47.535445" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:43:47.535621" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:47.507809" elapsed="0.027838"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.535710" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:47.535860" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:47.409385" elapsed="0.126500"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.564498" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.564031" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.565271" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:47.565014" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:47.565578" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:47.564687" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.566198" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.565765" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.566557" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:47.566691" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:47.566382" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.567133" level="INFO">{
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.566870" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:47.567653" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.567247" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.568395" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.567883" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.567738" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.567228" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.569190" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.568641" elapsed="0.000577"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.569267" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.563391" elapsed="0.006003"/>
</kw>
<msg time="2026-05-01T00:43:47.569446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.550527" elapsed="0.018990"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.582553" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.595262" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.607999" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.608193" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.608367" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.608750" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.608607" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:47.608593" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.608967" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.609133" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.609297" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:47.608563" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.608442" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.609534" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.609612" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:47.609730" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:47.547815" elapsed="0.061941"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.609930" elapsed="0.002267"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:47.613238" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.612942" elapsed="0.000324"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:47.613721" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:47.613418" elapsed="0.000330"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:47.613901" elapsed="0.000322"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:47.612537" elapsed="0.001746"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.612281" elapsed="0.002034"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.614501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.614340" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.612263" elapsed="0.002350"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:47.537074" elapsed="0.077587"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:47.536243" elapsed="0.078492"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.536005" elapsed="0.078776"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.535987" elapsed="0.078817"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:47.614837" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:47.402966" elapsed="0.211998"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:47.398294" elapsed="0.216726"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-05-01T00:43:47.398007" elapsed="0.217077"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after final deconfiguration.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:47.297306" elapsed="0.317884"/>
</test>
<test id="s1-s5-t14" name="Stop_All_Exabgps" line="184">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:47.618557" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:47.618277" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.619847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.619734" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.619715" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.625116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.625010" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.624992" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.626179" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.625803" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.626682" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:47.626365" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:47.626752" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:47.626907" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.625409" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.632506" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.632383" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.632364" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.633724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.633617" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.633599" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:47.634231" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.633936" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.634646" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.634415" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.668203" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.635180" elapsed="0.033126"/>
</kw>
<msg time="2026-05-01T00:43:47.668486" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:47.668534" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.634831" elapsed="0.033779"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.688493" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.669257" elapsed="0.019336"/>
</kw>
<msg time="2026-05-01T00:43:47.688754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:47.688799" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "[K"
[?1l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.668915" elapsed="0.019922"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.689135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.688915" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.688895" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.689679" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.689357" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.690025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.689811" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.689793" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:47.690137" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.692674" elapsed="0.000268"/>
</kw>
<msg time="2026-05-01T00:43:47.693006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.691596" elapsed="0.001541"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.693413" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.693778" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:47.690960" elapsed="0.003003"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:47.690396" elapsed="0.003632"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:47.633292" elapsed="0.060833"/>
</kw>
<msg time="2026-05-01T00:43:47.694217" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.694260" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "[K"
[?1l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.632726" elapsed="0.061577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:47.694518" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:47.694381" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.694362" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.695014" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.695346" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.695418" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:47.632045" elapsed="0.063499"/>
</kw>
<msg time="2026-05-01T00:43:47.695639" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.695683" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "[K"
[?1l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.627293" elapsed="0.068428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.696043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.695796" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.695779" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:47.627152" elapsed="0.069027"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:47.626982" elapsed="0.069227"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:47.624651" elapsed="0.071612"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:47.619408" elapsed="0.076910"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.618982" elapsed="0.077380"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:47.616061" elapsed="0.080353"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.705648" level="INFO">Executing command 'cat exaipv6.log'.</msg>
<msg time="2026-05-01T00:43:47.718899" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:47.718997" level="INFO">${output_log} = 00:43:36 | 3674   | welcome         | Thank you for using ExaBGP
00:43:36 | 3674   | version         | 4.2.4
00:43:36 | 3674   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:47.705507" elapsed="0.013517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.719449" level="INFO">00:43:36 | 3674   | welcome         | Thank you for using ExaBGP
00:43:36 | 3674   | version         | 4.2.4
00:43:36 | 3674   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00:43:36 | 3674   | os              | Linux releng-26932-215-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
00:43:36 | 3674   | installation    | /tmp/defaultvenv
00:43:36 | 3674   | advice          | environment file missing
00:43:36 | 3674   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:43:37 | 3674   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:43:37 | 3674   | cli             | we scanned the following folders (the number is your PID):
00:43:37 | 3674   | cli control     |  - /run/exabgp/
00:43:37 | 3674   | cli control     |  - /run/1001/
00:43:37 | 3674   | cli control     |  - /run/
00:43:37 | 3674   | cli control     |  - /var/run/exabgp/
00:43:37 | 3674   | cli control     |  - /var/run/1001/
00:43:37 | 3674   | cli control     |  - /var/run/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/run/1001/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/run/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:43:37 | 3674   | cli control     |  - /tmp/defaultvenv/var/run/
00:43:37 | 3674   | cli control     | please make them in one of the folder with the following commands:
00:43:37 | 3674   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:43:37 | 3674   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:43:37 | 3674   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:43:37 | 3674   | configuration   | performing reload of exabgp 4.2.4
00:43:37 | 3674   | configuration   | &gt; neighbor         | '::1'
00:43:37 | 3674   | configuration   | . router-id        | '1.2.3.4'
00:43:37 | 3674   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:43:37 | 3674   | configuration   | . local-as         | '64496'
00:43:37 | 3674   | configuration   | . peer-as          | '64496'
00:43:37 | 3674   | configuration   | &gt; capability       | 
00:43:37 | 3674   | configuration   | . route-refresh    | 'disable'
00:43:37 | 3674   | configuration   | . add-path         | 'disable'
00:43:37 | 3674   | configuration   | &lt; capability       | 
00:43:37 | 3674   | configuration   | &gt; family           | 
00:43:37 | 3674   | configuration   | . ipv6             | 'unicast'
00:43:37 | 3674   | configuration   | &lt; family           | 
00:43:37 | 3674   | configuration   | &gt; static           | 
00:43:37 | 3674   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:43:37 | 3674   | configuration   | &lt; static           | 
00:43:37 | 3674   | configuration   | &lt; neighbor         | 
00:43:37 | 3674   | reactor         | new peer: neighbor ::1 local-ip 2607:f0d0:1002:0011:0000:0000:0000:0002 local-as 64496 peer-as 64496 router-id 1.2.3.4 family-allowed in-open
00:43:37 | 3674   | reactor         | loaded new configuration successfully
00:43:37 | 3674   | reactor         | initialising connection to peer-1
00:43:37 | 3674   | outgoing-1      | attempting connection to ::1:1790
00:43:37 | 3674   | outgoing-1      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0102 0304 1402 0601 0400 0200 0102 0641 0400 00FB F002 0206 00
00:43:37 | 3674   | outgoing-1      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), ASN4(64496)]
00:43:37 | 3674   | ka-outgoing-1   | receive-timer 60 second(s) left
00:43:37 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:37 | 3674   | outgoing-1      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 00B4 4700
00:43:37 | 3674   | outgoing-1      | &lt;&lt; message of type OPEN
00:43:37 | 3674   | outgoing-1      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:37 | 3674   | outgoing-1      | --------------------------------------------------------------------
00:43:37 | 3674   | outgoing-1      | the connection can not carry the following family/families
00:43:37 | 3674   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:43:37 | 3674   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:43:37 | 3674   | outgoing-1      | --------------------------------------------------------------------
00:43:37 | 3674   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:37 | 3674   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:37 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:37 | 3674   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:43:37 | 3674   | ka-outgoing-1   | receive-timer 180 second(s) left
00:43:37 | 3674   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:43:37 | 3674   | outgoing-1      | sending TCP payload (  78) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004E 0200 0000 3740 0101 0040 0200 4005 0400 0000 6480 0E26 0002 0110 2607 F0D0 1002 0011 0000 0000 0000 0002 0080 2A04 6D80 0000 0000 0000 0000 0000 0001
00:43:37 | 3674   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:43:37 | 3674   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:43:37 | 3674   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:43:37 | 3674   | peer-1          | &gt;&gt; EOR(s)
00:43:37 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:37 | 3674   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:37 | 3674   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:37 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:37 | 3674   | peer-1          | &lt;&lt; UPDATE #1
00:43:37 | 3674   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:37 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:37 | 3674   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:37 | 3674   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:37 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:37 | 3674   | peer-1          | &lt;&lt; UPDATE #2
00:43:37 | 3674   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:37 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:43:37 | 3674   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:43:37 | 3674   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:37 | 3674   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:43:37 | 3674   | routes          | withdrawn NLRI none
00:43:37 | 3674   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:43:37 | 3674   | routes          | announced NLRI none
00:43:37 | 3674   | peer-1          | &lt;&lt; UPDATE #3
00:43:37 | 3674   | peer-1          |    UPDATE #3 nlri  (  11) eor 2/1 (ipv6 unicast)
00:43:37 | 3674   | ka-outgoing-1   | receive-timer 179 second(s) left
00:43:37 | 3674   | ka-outgoing-1   | send-timer 59 second(s) left
00:43:38 | 3674   | ka-outgoing-1   | receive-timer 178 second(s) left
00:43:38 | 3674   | ka-outgoing-1   | send-timer 58 second(s) left
00:43:39 | 3674   | ka-outgoing-1   | receive-timer 177 second(s) left
00:43:39 | 3674   | ka-outgoing-1   | send-timer 57 second(s) left
00:43:40 | 3674   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:40 | 3674   | outgoing-1      | received TCP payload (   2) 0600
00:43:40 | 3674   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:43:40 | 3674   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:40 | 3674   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:43:40 | 3674   | reactor         | initialising connection to peer-1
00:43:40 | 3674   | outgoing-2      | attempting connection to ::1:1790
00:43:40 | 3674   | outgoing-2      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0102 0304 1402 0601 0400 0200 0102 0641 0400 00FB F002 0206 00
00:43:40 | 3674   | outgoing-2      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), ASN4(64496)]
00:43:40 | 3674   | ka-outgoing-2   | receive-timer 60 second(s) left
00:43:40 | 3674   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:40 | 3674   | outgoing-2      | received TCP payload (   2) 0605
00:43:40 | 3674   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:43:40 | 3674   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:43:40 | 3674   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:43:41 | 3674   | reactor         | initialising connection to peer-1
00:43:41 | 3674   | outgoing-3      | attempting connection to ::1:1790
00:43:41 | 3674   | outgoing-3      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0102 0304 1402 0601 0400 0200 0102 0641 0400 00FB F002 0206 00
00:43:41 | 3674   | outgoing-3      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), ASN4(64496)]
00:43:41 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:41 | 3674   | outgoing-3      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 00B4 4700
00:43:41 | 3674   | outgoing-3      | &lt;&lt; message of type OPEN
00:43:41 | 3674   | outgoing-3      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:41 | 3674   | ka-outgoing-3   | receive-timer 60 second(s) left
00:43:41 | 3674   | outgoing-3      | --------------------------------------------------------------------
00:43:41 | 3674   | outgoing-3      | the connection can not carry the following family/families
00:43:41 | 3674   | outgoing-3      |  - exabgp is not configured for ipv4/unicast
00:43:41 | 3674   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:43:41 | 3674   | outgoing-3      | --------------------------------------------------------------------
00:43:41 | 3674   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:41 | 3674   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:41 | 3674   | ka-outgoing-3   | receive-timer 180 second(s) left
00:43:41 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:41 | 3674   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:43:41 | 3674   | reactor         | connected to peer-1 with outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:43:41 | 3674   | outgoing-3      | sending TCP payload (  78) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004E 0200 0000 3740 0101 0040 0200 4005 0400 0000 6480 0E26 0002 0110 2607 F0D0 1002 0011 0000 0000 0000 0002 0080 2A04 6D80 0000 0000 0000 0000 0000 0001
00:43:41 | 3674   | outgoing-3      | &gt;&gt; 1 UPDATE(s)
00:43:41 | 3674   | outgoing-3      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:43:41 | 3674   | outgoing-3      | &gt;&gt; EOR ipv6 unicast
00:43:41 | 3674   | peer-1          | &gt;&gt; EOR(s)
00:43:41 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:41 | 3674   | outgoing-3      | received TCP payload (   4) 0000 0000
00:43:41 | 3674   | outgoing-3      | &lt;&lt; message of type UPDATE
00:43:41 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:41 | 3674   | peer-1          | &lt;&lt; UPDATE #1
00:43:41 | 3674   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:41 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:43:41 | 3674   | outgoing-3      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:43:41 | 3674   | outgoing-3      | &lt;&lt; message of type UPDATE
00:43:41 | 3674   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:43:41 | 3674   | routes          | withdrawn NLRI none
00:43:41 | 3674   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:43:41 | 3674   | routes          | announced NLRI none
00:43:41 | 3674   | peer-1          | &lt;&lt; UPDATE #2
00:43:41 | 3674   | peer-1          |    UPDATE #2 nlri  (  11) eor 2/1 (ipv6 unicast)
00:43:41 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:41 | 3674   | outgoing-3      | received TCP payload (   4) 0000 0000
00:43:41 | 3674   | outgoing-3      | &lt;&lt; message of type UPDATE
00:43:41 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:41 | 3674   | peer-1          | &lt;&lt; UPDATE #3
00:43:41 | 3674   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:41 | 3674   | ka-outgoing-3   | receive-timer 179 second(s) left
00:43:41 | 3674   | ka-outgoing-3   | send-timer 59 second(s) left
00:43:42 | 3674   | ka-outgoing-3   | receive-timer 178 second(s) left
00:43:42 | 3674   | ka-outgoing-3   | send-timer 58 second(s) left
00:43:43 | 3674   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:43 | 3674   | outgoing-3      | received TCP payload (   2) 0600
00:43:43 | 3674   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:43:43 | 3674   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:43 | 3674   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:43:45 | 3674   | reactor         | initialising connection to peer-1
00:43:45 | 3674   | outgoing-4      | attempting connection to ::1:1790
00:43:45 | 3674   | outgoing-4      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0102 0304 1402 0601 0400 0200 0102 0641 0400 00FB F002 0206 00
00:43:45 | 3674   | outgoing-4      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), ASN4(64496)]
00:43:45 | 3674   | ka-outgoing-4   | receive-timer 60 second(s) left
00:43:45 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:45 | 3674   | outgoing-4      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 00B4 4700
00:43:45 | 3674   | outgoing-4      | &lt;&lt; message of type OPEN
00:43:45 | 3674   | outgoing-4      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:45 | 3674   | outgoing-4      | --------------------------------------------------------------------
00:43:45 | 3674   | outgoing-4      | the connection can not carry the following family/families
00:43:45 | 3674   | outgoing-4      |  - exabgp is not configured for ipv4/unicast
00:43:45 | 3674   | outgoing-4      | therefore no routes of this kind can be announced on the connection
00:43:45 | 3674   | outgoing-4      | --------------------------------------------------------------------
00:43:45 | 3674   | outgoing-4      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:45 | 3674   | outgoing-4      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:45 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:45 | 3674   | outgoing-4      | &lt;&lt; message of type KEEPALIVE
00:43:45 | 3674   | ka-outgoing-4   | receive-timer 180 second(s) left
00:43:45 | 3674   | reactor         | connected to peer-1 with outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:43:45 | 3674   | outgoing-4      | sending TCP payload (  78) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004E 0200 0000 3740 0101 0040 0200 4005 0400 0000 6480 0E26 0002 0110 2607 F0D0 1002 0011 0000 0000 0000 0002 0080 2A04 6D80 0000 0000 0000 0000 0000 0001
00:43:45 | 3674   | outgoing-4      | &gt;&gt; 1 UPDATE(s)
00:43:45 | 3674   | outgoing-4      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:43:45 | 3674   | outgoing-4      | &gt;&gt; EOR ipv6 unicast
00:43:45 | 3674   | peer-1          | &gt;&gt; EOR(s)
00:43:45 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:45 | 3674   | outgoing-4      | received TCP payload (   4) 0000 0000
00:43:45 | 3674   | outgoing-4      | &lt;&lt; message of type UPDATE
00:43:45 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:45 | 3674   | peer-1          | &lt;&lt; UPDATE #1
00:43:45 | 3674   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:45 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:43:45 | 3674   | outgoing-4      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:43:45 | 3674   | outgoing-4      | &lt;&lt; message of type UPDATE
00:43:45 | 3674   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:43:45 | 3674   | routes          | withdrawn NLRI none
00:43:45 | 3674   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:43:45 | 3674   | routes          | announced NLRI none
00:43:45 | 3674   | peer-1          | &lt;&lt; UPDATE #2
00:43:45 | 3674   | peer-1          |    UPDATE #2 nlri  (  11) eor 2/1 (ipv6 unicast)
00:43:45 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:45 | 3674   | outgoing-4      | received TCP payload (   4) 0000 0000
00:43:45 | 3674   | outgoing-4      | &lt;&lt; message of type UPDATE
00:43:45 | 3674   | parser          | parsing UPDATE (   4) 0000 0000
00:43:45 | 3674   | peer-1          | &lt;&lt; UPDATE #3
00:43:45 | 3674   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:45 | 3674   | ka-outgoing-4   | receive-timer 179 second(s) left
00:43:45 | 3674   | ka-outgoing-4   | send-timer 59 second(s) left
00:43:46 | 3674   | ka-outgoing-4   | receive-timer 178 second(s) left
00:43:46 | 3674   | ka-outgoing-4   | send-timer 58 second(s) left
00:43:47 | 3674   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:47 | 3674   | outgoing-4      | received TCP payload (   2) 0600
00:43:47 | 3674   | outgoing-4      | &lt;&lt; message of type NOTIFICATION
00:43:47 | 3674   | outgoing-4      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:47 | 3674   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.719192" elapsed="0.000532"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:47.720262" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv6.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv6.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:43:47.719898" elapsed="0.000421"/>
</kw>
<arg>${EXABGP_LOG}</arg>
<arg>${EXABGP_LOG}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.705114" elapsed="0.015265"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.721005" level="INFO">[?2004l</msg>
<msg time="2026-05-01T00:43:47.721082" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:43:47.720899" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.721519" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.721258" elapsed="0.000306"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.722334" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:47.722030" elapsed="0.000353"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.722555" elapsed="0.000195"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:43:47.721765" elapsed="0.001043"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.878003" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:47.878128" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.722957" elapsed="0.155199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.878669" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.878348" elapsed="0.000368"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.881162" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.879374" elapsed="0.001845"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.881973" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:47.882055" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.881380" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.882679" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.882412" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:47.882156" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.882132" elapsed="0.000656"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:43:47.878990" elapsed="0.003846"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:43:47.720625" elapsed="0.162262"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-05-01T00:43:47.615516" elapsed="0.267480"/>
</test>
<test id="s1-s5-t15" name="Configure_App_Peer" line="189">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:47.886611" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:47.886335" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.887868" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.887755" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.887736" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.893067" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.892958" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.892940" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.894155" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:47.893773" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.894654" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:47.894341" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:47.894725" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:43:47.894888" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.893367" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.900602" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.900389" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.900370" elapsed="0.000306"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.901849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:47.901742" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.901724" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:47.902368" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.902063" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.902788" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.902570" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.934284" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:47.903304" elapsed="0.031086"/>
</kw>
<msg time="2026-05-01T00:43:47.934580" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:47.934628" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.902973" elapsed="0.031692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:47.957213" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:47.935176" elapsed="0.022138"/>
</kw>
<msg time="2026-05-01T00:43:47.957493" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:47.957541" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.934837" elapsed="0.022742"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.957883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.957658" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.957637" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.958401" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:47.958105" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.958767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.958553" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.958534" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:47.958876" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:47.961410" elapsed="0.000160"/>
</kw>
<msg time="2026-05-01T00:43:47.961632" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.960334" elapsed="0.001429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.962035" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.962366" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:47.959692" elapsed="0.002883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:47.959149" elapsed="0.003490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:47.901418" elapsed="0.061317"/>
</kw>
<msg time="2026-05-01T00:43:47.962826" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.962870" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.900829" elapsed="0.062079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:47.963090" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:47.962983" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.962965" elapsed="0.000250"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.963638" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.963998" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:47.964071" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:47.900055" elapsed="0.064125"/>
</kw>
<msg time="2026-05-01T00:43:47.964271" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:47.964315" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.895290" elapsed="0.069062"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:47.964704" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:47.964427" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:47.964409" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:47.895146" elapsed="0.069660"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:47.894967" elapsed="0.069870"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:47.892485" elapsed="0.072407"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:47.887467" elapsed="0.077479"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:47.887023" elapsed="0.077968"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:47.883808" elapsed="0.081233"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:47.965890" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:47.965228" elapsed="0.000691"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.000275" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:47.999896" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.001085" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.000817" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.001257" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.000481" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.001853" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.001445" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.002177" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:48.002333" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:48.002041" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.002770" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.002528" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.003815" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.003556" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.004277" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.004018" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.004988" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.004689" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.005771" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.005551" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.005848" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.006001" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.005218" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.006180" elapsed="0.000234"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:48.004549" elapsed="0.001921"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.007021" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.006722" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.007812" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.007594" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.007890" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.008041" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.007234" elapsed="0.000832"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.008216" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:48.006589" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.010691" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.008739" elapsed="0.001979"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.011476" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.011230" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.011555" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:48.011710" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.010911" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.011887" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:48.008606" elapsed="0.003546"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.012720" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.012400" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.013481" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.013256" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.013562" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:48.013719" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.012934" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.013915" elapsed="0.000223"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:48.012266" elapsed="0.001913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.014745" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.014426" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.015541" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.015274" elapsed="0.000295"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.015658" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:48.015813" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.014959" elapsed="0.000879"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.015988" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.014294" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.016826" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.016523" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.017575" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.017351" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.017651" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:48.017801" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.017038" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.017974" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:48.016376" elapsed="0.001859"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.018805" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.018493" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.019605" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.019374" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.019686" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.019837" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.019018" elapsed="0.000844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.020012" elapsed="0.000236"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.018348" elapsed="0.001939"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.020860" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.020548" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.021808" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.021400" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.021887" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.022038" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.021073" elapsed="0.000990"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.022212" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.020401" elapsed="0.002089"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:48.004350" elapsed="0.018176"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:48.022569" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:48.022731" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:48.003212" elapsed="0.019546"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.002917" elapsed="0.019872"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.022963" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.022815" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.002899" elapsed="0.020140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.023934" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.023179" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.024012" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:47.999263" elapsed="0.024889"/>
</kw>
<msg time="2026-05-01T00:43:48.024242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:47.986337" elapsed="0.037955"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.037290" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.050159" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.063210" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.063404" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.063594" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.063958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.063817" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:48.063802" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.064177" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.064344" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.064524" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:48.063772" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.063669" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.064756" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.064833" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:48.064955" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:47.981919" elapsed="0.083063"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.092028" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.091637" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.092801" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.092566" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.093002" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.092215" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.093591" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.093187" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.093919" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:48.094586" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:48.093784" elapsed="0.000832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.095031" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
        &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.094786" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:48.095467" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.095154" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.095996" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.095699" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.095554" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.095133" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.096933" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.12&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
   ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.096227" elapsed="0.000737"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.097014" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:48.090917" elapsed="0.006225"/>
</kw>
<msg time="2026-05-01T00:43:48.097197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.077885" elapsed="0.019359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.110561" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.123319" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.136062" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.136290" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.136480" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.136849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.136707" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:48.136693" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.137068" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.137238" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.137415" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:48.136664" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.136557" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.137656" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.137739" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:48.137864" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.12&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
   ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:48.075187" elapsed="0.062707"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.139203" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.138954" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.139359" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.138617" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.139718" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.139470" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.140258" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.139966" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.139798" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.139437" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.142773" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.140504" elapsed="0.002296"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:48.142853" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.143009" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:48.138261" elapsed="0.004773"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.144420" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.144176" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.144915" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.12&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
        &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.144673" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.145358" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.145115" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.145805" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.145565" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:48.146682" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:48.146485" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:48.147033" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:48.146860" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.147207" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.147821" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.147575" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:48.147907" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.148063" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:48.146050" elapsed="0.002038"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:48.166902" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '395', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.12&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
        &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:48.167027" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:48.167250" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:48.150606" elapsed="0.016701"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.148158" elapsed="0.019249"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.167846" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.167503" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.148141" elapsed="0.019904"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.175246" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.170211" elapsed="0.005094"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.169699" elapsed="0.005655"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.169658" elapsed="0.005730"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.179051" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.175792" elapsed="0.003322"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.175485" elapsed="0.003684"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.175443" elapsed="0.003760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.179973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.179426" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.180437" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.180110" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.181281" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.180862" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.180624" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.180085" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.182169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.181640" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.182647" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.182304" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.183393" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.182984" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.182762" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.182279" elapsed="0.001252"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.183738" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:48.184853" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.184441" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.185101" elapsed="0.002766"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:48.168878" elapsed="0.019052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:48.188101" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:43:48.187996" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.187978" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.188335" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.188403" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:48.190736" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:48.143370" elapsed="0.047393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.190827" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:48.190980" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:47.970695" elapsed="0.220309"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.191339" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.191102" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.191085" elapsed="0.000346"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.191478" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/application_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:47.966192" elapsed="0.225412"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-05-01T00:43:47.883311" elapsed="0.308418"/>
</test>
<test id="s1-s5-t16" name="Reconfigure_ODL_To_Accept_Connections_4" line="206">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:48.195159" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:48.194900" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.196422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.196313" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.196295" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.201728" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.201613" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.201595" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.202841" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.202443" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.203327" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:48.203026" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:48.203398" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.203573" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:48.202069" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.209132" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.209025" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.209006" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.210409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.210303" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.210285" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:48.210946" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.210648" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.211363" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:48.211130" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.244687" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:48.211901" elapsed="0.032891"/>
</kw>
<msg time="2026-05-01T00:43:48.244964" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:48.245011" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.211565" elapsed="0.033482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.270730" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:48.245613" elapsed="0.025359"/>
</kw>
<msg time="2026-05-01T00:43:48.271336" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:48.271440" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.245218" elapsed="0.026345"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.272242" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.271740" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.271696" elapsed="0.000720"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.273516" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.272767" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.274056" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.273738" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.273711" elapsed="0.000461"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:48.274220" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:48.278004" elapsed="0.000212"/>
</kw>
<msg time="2026-05-01T00:43:48.278305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.276328" elapsed="0.002189"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.278979" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.279493" elapsed="0.000114"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:48.275411" elapsed="0.004358"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:48.274625" elapsed="0.005237"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:48.210003" elapsed="0.070005"/>
</kw>
<msg time="2026-05-01T00:43:48.280144" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:48.280209" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.209349" elapsed="0.070915"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:48.280811" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:43:48.280376" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.280349" elapsed="0.000608"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.281586" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.282085" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.282190" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:48.208690" elapsed="0.073659"/>
</kw>
<msg time="2026-05-01T00:43:48.282506" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:48.282572" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.203971" elapsed="0.078655"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.283107" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.282737" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.282712" elapsed="0.000514"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:48.203830" elapsed="0.079432"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:48.203652" elapsed="0.079653"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:48.201237" elapsed="0.082146"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:48.196025" elapsed="0.087462"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.195600" elapsed="0.087958"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:48.192694" elapsed="0.090940"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.285041" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV4_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.283901" elapsed="0.001183"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.319405" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.319011" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.320185" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.319948" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.320388" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.319617" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.321008" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.320621" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.321334" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:48.321499" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:48.321196" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.321956" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.321684" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.322963" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.322705" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.323432" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.323167" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.324136" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.323838" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.325114" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.324892" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.325192" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:43:48.325351" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.324560" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.325548" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:43:48.323702" elapsed="0.002128"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.326414" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.326081" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.327186" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.326975" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.327262" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.327414" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.326658" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.327607" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:48.325946" elapsed="0.001922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.328445" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.328145" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.329246" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.329035" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.329331" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.329502" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.328702" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.329682" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:48.327992" elapsed="0.001953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.330554" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.330237" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.331433" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.331224" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.331525" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.331682" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.330910" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.331856" elapsed="0.000220"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:48.330103" elapsed="0.002014"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.332701" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.332362" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.333438" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.333229" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.333529" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.333682" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.332913" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.333857" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.332231" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.334681" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.334365" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.335642" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.335214" elapsed="0.000455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.335720" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.335874" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.334895" elapsed="0.001005"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.336052" elapsed="0.000224"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:48.334233" elapsed="0.002084"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.336933" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.336628" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.337698" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.337484" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.337775" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:48.337929" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.337149" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.338105" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.336492" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.338937" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:48.338640" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:48.339697" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.339484" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:48.339773" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.339924" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:48.339149" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.340115" elapsed="0.000219"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:48.338505" elapsed="0.001883"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:48.323522" elapsed="0.016961"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:48.340534" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:48.340713" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:48.322361" elapsed="0.018379"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.322068" elapsed="0.018704"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.340952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.340800" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.322050" elapsed="0.018979"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.341892" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.341173" elapsed="0.000747"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.341968" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:48.318392" elapsed="0.023701"/>
</kw>
<msg time="2026-05-01T00:43:48.342147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.305468" elapsed="0.036729"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.355051" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.367865" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.380908" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.381125" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.381312" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.381724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.381575" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:48.381558" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.381949" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.382116" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.382281" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:48.381520" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.381391" elapsed="0.001025"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.382590" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.382671" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:43:48.382814" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:48.301103" elapsed="0.081740"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.410328" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.409948" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.411122" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.410876" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.411292" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.410536" elapsed="0.000780"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.411902" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.411495" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.412230" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:48.412398" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-reflecto...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:48.412092" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.412847" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
    &lt;/config&gt;
  &lt;/route-reflector&gt;
  &lt;timers&gt;
    &lt;config&gt;
      &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
      &lt;connect-retry&gt;5&lt;/connect-retry&gt;
    &lt;/config&gt;
  &lt;/timers&gt;
  &lt;transport&gt;
    &lt;config&gt;
      &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
      &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
    &lt;/config&gt;
  &lt;/transport&gt;
  &lt;config&gt;
    &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
  &lt;/config&gt;
  &lt;afi-safis&gt;
    &lt;afi-safi&gt;
      &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
    &lt;/afi-safi&gt;
  &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.412602" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:48.413266" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.412970" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.413821" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.413517" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.413350" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.412952" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.414798" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-re...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.414047" elapsed="0.000782"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.414879" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:48.409311" elapsed="0.005697"/>
</kw>
<msg time="2026-05-01T00:43:48.415101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.396144" elapsed="0.019006"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.427869" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.440559" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.453438" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.453643" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.453818" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.454181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.454039" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:48.454025" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.454398" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.454577" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.454742" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:48.453996" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.453892" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.454966" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.455043" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:48.455171" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-re...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:48.393377" elapsed="0.061823"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:48.456529" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.456268" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:48.456684" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:48.455931" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.457022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.456780" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.457584" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.457276" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.457103" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.456762" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.460109" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.457857" elapsed="0.002279"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:48.460188" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.460342" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:48.455570" elapsed="0.004798"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.461757" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.461506" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.462190" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
    &lt;/config&gt;
  &lt;/route-reflector&gt;
  &lt;timers&gt;
    &lt;config&gt;
      &lt;hold-time&gt;180&lt;/hold-time&gt;
      &lt;connect-retry&gt;5&lt;/connect-retry&gt;
    &lt;/config&gt;
  &lt;/timers&gt;
  &lt;transport&gt;
    &lt;config&gt;
      &lt;remote-port&gt;17900&lt;/remote-port&gt;
      &lt;passive-mode&gt;true&lt;/passive-mode&gt;
    &lt;/config&gt;
  &lt;/transport&gt;
  &lt;config&gt;
    &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
  &lt;/config&gt;
  &lt;afi-safis&gt;
    &lt;afi-safi&gt;
      &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
    &lt;/afi-safi&gt;
  &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.461954" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.462659" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.462393" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.463252" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.462991" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:48.464118" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:48.463922" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:48.464480" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:48.464294" elapsed="0.000213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.464660" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.465265" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.465019" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:48.465352" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.465524" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:48.463520" elapsed="0.002030"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:48.479608" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '767', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
  &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
  &lt;route-reflector&gt;
    &lt;config&gt;
      &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
    &lt;/config&gt;
  &lt;/route-reflector&gt;
  &lt;timers&gt;
    &lt;config&gt;
      &lt;hold-time&gt;180&lt;/hold-time&gt;
      &lt;connect-retry&gt;5&lt;/connect-retry&gt;
    &lt;/config&gt;
  &lt;/timers&gt;
  &lt;transport&gt;
    &lt;config&gt;
      &lt;remote-port&gt;17900&lt;/remote-port&gt;
      &lt;passive-mode&gt;true&lt;/passive-mode&gt;
    &lt;/config&gt;
  &lt;/transport&gt;
  &lt;config&gt;
    &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
  &lt;/config&gt;
  &lt;afi-safis&gt;
    &lt;afi-safi&gt;
      &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
    &lt;/afi-safi&gt;
  &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:48.479711" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:48.479807" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:48.467934" elapsed="0.011898"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.465621" elapsed="0.014257"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.480058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.479905" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.465603" elapsed="0.014543"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.483556" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.481101" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.480881" elapsed="0.002771"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.480863" elapsed="0.002827"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.487355" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.484074" elapsed="0.003344"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.483767" elapsed="0.003719"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.483744" elapsed="0.003778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.488276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.487752" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.488761" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.488413" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.489532" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.489096" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.488876" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.488388" elapsed="0.001262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.490372" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.489870" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.490853" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.490529" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.491625" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.491197" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.490976" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.490503" elapsed="0.001237"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.491946" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:48.493059" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:48.492672" elapsed="0.000424"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.493308" elapsed="0.003008"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:48.480526" elapsed="0.015852"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:48.496566" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:48.496445" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.496427" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.496802" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.496869" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:48.499174" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:48.460709" elapsed="0.038492"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.499304" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:48.499478" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:48.290020" elapsed="0.209485"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.499850" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.499608" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.499590" elapsed="0.000353"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:48.499977" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_neighbor_rib</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:48.285507" elapsed="0.214595"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:48.500630" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={'Content-Type': 'application/json'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19eb2a10&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>session</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>headers=${HEADERS}</arg>
<arg>timeout=5</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:43:48.500268" elapsed="0.000508"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:43:48.192067" elapsed="0.308838"/>
</test>
<test id="s1-s5-t17" name="Start_Exabgp_2" line="228">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:48.504383" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:48.504123" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.505655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.505540" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.505522" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.510839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.510714" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.510697" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.511904" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.511522" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.512376" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:48.512086" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:48.512446" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:43:48.512619" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:48.511133" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.518246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.518120" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.518101" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.519692" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:48.519575" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.519556" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:48.520205" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:48.519908" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.520625" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:48.520389" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.550345" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:48.521140" elapsed="0.029346"/>
</kw>
<msg time="2026-05-01T00:43:48.550657" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:48.550806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.520807" elapsed="0.030041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.570471" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:48.551367" elapsed="0.019205"/>
</kw>
<msg time="2026-05-01T00:43:48.570733" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:48.570780" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "2 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.551023" elapsed="0.019795"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.571122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.570898" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.570878" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.571676" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.571349" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.572059" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.571822" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.571804" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:48.572194" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:48.574912" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:43:48.575117" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.573802" elapsed="0.001445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.575540" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.575876" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:48.573131" elapsed="0.002930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:48.572506" elapsed="0.003619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:48.519214" elapsed="0.057007"/>
</kw>
<msg time="2026-05-01T00:43:48.576312" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:48.576356" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "2 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.518485" elapsed="0.057909"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:48.576604" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:43:48.576495" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.576475" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.577090" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.577425" elapsed="0.000042"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:48.577517" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:48.517767" elapsed="0.059864"/>
</kw>
<msg time="2026-05-01T00:43:48.577721" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:48.577764" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "2 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.513007" elapsed="0.064796"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:48.578160" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:48.577877" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.577861" elapsed="0.000416"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:48.512866" elapsed="0.065435"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:48.512694" elapsed="0.065638"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:48.510338" elapsed="0.068049"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:48.505240" elapsed="0.073201"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.504814" elapsed="0.073693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:48.501751" elapsed="0.076808"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.579052" level="INFO">${cmd} = exaipv4.cfg &gt; exaipv4.log</msg>
<var>${cmd}</var>
<arg>${EXABGP2_CFG} &gt; ${EXABGP2_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.578723" elapsed="0.000356"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.582426" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.582071" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.582872" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.582629" elapsed="0.000288"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.585495" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:48.583529" elapsed="0.002023"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.590989" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:48.591080" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:48.585713" elapsed="0.005393"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.591690" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.591427" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:48.591175" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:48.591157" elapsed="0.000638"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:43:48.583157" elapsed="0.008683"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:48.593497" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<msg time="2026-05-01T00:43:48.593585" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:48.591989" elapsed="0.001622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.594010" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.593767" elapsed="0.000306"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:48.581754" elapsed="0.012374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.596201" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:48.595852" elapsed="0.000376"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.598392" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:48.596390" elapsed="0.002029"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:48.605486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:48.605633" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:43:48.605742" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:48.598596" elapsed="0.007172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.608418" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:48.605989" elapsed="0.002492"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:43:48.611467" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:43:48.608638" elapsed="0.002929">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:43:48.595381" elapsed="0.016348">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.615773" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.614310" elapsed="0.002049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.619861" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.616701" elapsed="0.003202"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:51.628987" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:51.629795" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '607'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:43:51.630016" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:51.620149" elapsed="0.009913"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.634392" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.630373" elapsed="0.004136"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:43:51.634766" elapsed="0.003836"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:43:51.612898" elapsed="0.025812"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:48.594683" elapsed="3.044121"/>
</kw>
<msg time="2026-05-01T00:43:51.638984" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:51.639052" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:48.594284" elapsed="3.044856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.639977" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.639345" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.639304" elapsed="0.000763"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:43:51.640239" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:43:51.640125" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.640109" elapsed="0.000234"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:43:48.581576" elapsed="3.058796"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:43:48.581341" elapsed="3.059074"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.640595" elapsed="0.000022"/>
</kw>
<arg>${cmd}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>127.0.0.1</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:43:48.579392" elapsed="3.061287"/>
</kw>
<doc>Start exabgp and Verify BGP connection</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:48.501232" elapsed="3.139602"/>
</test>
<test id="s1-s5-t18" name="Inject_Ipv6_Route_1" line="234">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:51.644670" elapsed="0.000329"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:51.644367" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.646145" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.646026" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.646006" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.652621" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.652506" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.652485" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.653788" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.653348" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.654323" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:51.653995" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:51.654397" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:43:51.654594" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:51.652961" elapsed="0.001658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.660873" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.660740" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.660717" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.662213" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.662104" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.662085" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:51.662785" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.662433" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:51.663278" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:51.663024" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:51.694271" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:51.663842" elapsed="0.030703"/>
</kw>
<msg time="2026-05-01T00:43:51.694824" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:51.694879" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.663487" elapsed="0.031430"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:51.714237" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:51.695736" elapsed="0.018760"/>
</kw>
<msg time="2026-05-01T00:43:51.714754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:51.714810" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "1 "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.695215" elapsed="0.019639"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.715321" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.714982" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.714943" elapsed="0.000468"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.716017" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.715607" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.716382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.716161" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.716142" elapsed="0.000427"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:51.716615" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:51.719538" elapsed="0.000181"/>
</kw>
<msg time="2026-05-01T00:43:51.719795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:51.718260" elapsed="0.001727"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.720300" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.720674" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:51.717589" elapsed="0.003293"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:51.716976" elapsed="0.003976"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:51.661789" elapsed="0.059269"/>
</kw>
<msg time="2026-05-01T00:43:51.721163" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:51.721208" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "1 "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.661116" elapsed="0.060134"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:51.721484" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:43:51.721342" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.721317" elapsed="0.000265"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.722086" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.722468" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.722594" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:51.660330" elapsed="0.062424"/>
</kw>
<msg time="2026-05-01T00:43:51.722889" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:51.722954" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "1 "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.655057" elapsed="0.067956"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.723378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.723118" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.723098" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:51.654892" elapsed="0.068626"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:51.654683" elapsed="0.068873"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:51.652102" elapsed="0.071519"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:51.645713" elapsed="0.077970"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.645219" elapsed="0.078514"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:51.641712" elapsed="0.082086"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.724877" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.724071" elapsed="0.000838"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.761248" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.760834" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:51.762268" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:51.761958" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:51.762478" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:51.761575" elapsed="0.000930"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.763109" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.762673" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:51.763466" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:51.763650" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:51.763304" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.764251" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.763850" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.765613" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.765325" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.766103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.765827" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.766890" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.766536" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.767682" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.767438" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.767765" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:43:51.767941" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.767114" elapsed="0.000853"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.768128" elapsed="0.000250"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:51.766381" elapsed="0.002038"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.769020" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.768690" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.769825" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.769602" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.769922" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:43:51.770085" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.769260" elapsed="0.000849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.770286" elapsed="0.000249"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:51.768555" elapsed="0.002023"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.771144" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.770840" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.772097" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.771882" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.772176" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:51.772330" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.771357" elapsed="0.001042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.772573" elapsed="0.000233"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:51.770693" elapsed="0.002158"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.773403" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.773102" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.774200" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.773963" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.774292" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:43:51.774487" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.773635" elapsed="0.000881"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.774671" elapsed="0.000246"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:51.772968" elapsed="0.001992"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.775530" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.775210" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.776283" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.776070" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.776361" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:51.776532" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.775743" elapsed="0.000814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.776709" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:51.775075" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.777557" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.777240" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.778337" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.778104" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.778415" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:51.778588" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.777773" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.778771" elapsed="0.000237"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:51.777103" elapsed="0.001946"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.779618" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.779298" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.780373" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.780158" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.780465" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:43:51.780665" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.779838" elapsed="0.000852"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.780872" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:51.779165" elapsed="0.002018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.781778" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:51.781437" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:51.782609" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.782373" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:51.782688" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:51.782861" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:51.782014" elapsed="0.000937"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.783112" elapsed="0.000250"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:51.781302" elapsed="0.002113"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:51.766181" elapsed="0.017289"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:51.783521" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:51.783693" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:51.764781" elapsed="0.018939"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.764380" elapsed="0.019375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.783985" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.783788" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.764356" elapsed="0.019714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.785269" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:51.784222" elapsed="0.001077"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:51.785352" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:51.760147" elapsed="0.025352"/>
</kw>
<msg time="2026-05-01T00:43:51.785558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:51.746549" elapsed="0.039065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.799018" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.811894" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.824644" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.824891" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.825084" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.825540" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.825368" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:51.825348" elapsed="0.000280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.825776" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.826054" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.826227" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:51.825304" elapsed="0.000976"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.825170" elapsed="0.001138"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.826470" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.826554" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:43:51.826714" level="INFO">${uri} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:51.741538" elapsed="0.085205"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.862321" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.861867" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:51.863167" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:51.862895" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:51.863347" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:51.862556" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.863941" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.863554" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:51.864272" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:51.864474" level="INFO">${template} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:51.864129" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.865059" level="INFO">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.864664" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:51.865539" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.865202" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.866151" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.865815" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.865635" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.865174" elapsed="0.001071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.866972" level="INFO">${final_text} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:51.866412" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:51.867122" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:51.861121" elapsed="0.006147"/>
</kw>
<msg time="2026-05-01T00:43:51.867327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:51.839077" elapsed="0.028298"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.880616" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.893427" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.906302" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.906510" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.906686" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.907076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.906931" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:51.906917" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.907297" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.907478" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.907646" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:51.906885" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.906770" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.907877" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.907953" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:51.908091" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:51.837200" elapsed="0.070919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:51.909525" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:51.909244" elapsed="0.000346">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:51.909684" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:51.908906" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.910031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.909785" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.910601" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.910292" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.910112" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.909767" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.913091" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.910841" elapsed="0.002276"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:51.913169" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:51.913325" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:51.908573" elapsed="0.004802"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.914925" level="INFO">rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.914681" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.915355" level="INFO">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.915123" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.915820" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.915574" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.916246" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.916011" elapsed="0.000277"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:51.917106" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:51.916905" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:51.917489" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:51.917284" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.917667" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.918282" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.918037" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:51.918368" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:51.918541" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:51.916505" elapsed="0.002062"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:51.947608" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 path_url=/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '759', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt; 
 </msg>
<msg time="2026-05-01T00:43:51.947833" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes/ipv6-route=1%3A1%3A1%3A%3A1%2F128,1', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:51.948079" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:51.920946" elapsed="0.027193"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.918637" elapsed="0.029603"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.948678" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.948299" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.918620" elapsed="0.030261"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.955591" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.951265" elapsed="0.004388"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.950748" elapsed="0.004954"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.950705" elapsed="0.005033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.959371" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:51.956124" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.955816" elapsed="0.003687"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.955794" elapsed="0.003745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.960299" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:51.959766" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.960790" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.960435" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.961580" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.961141" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.960903" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.960410" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.962425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:51.961921" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.962910" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.962584" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.963674" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:51.963246" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:51.963024" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.962559" elapsed="0.001231"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:51.963995" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:51.965142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:51.964723" elapsed="0.000457"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.965397" elapsed="0.002424"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:51.949740" elapsed="0.018143"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:51.968063" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:43:51.967957" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.967938" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.968300" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.968367" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:51.970689" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:51.913739" elapsed="0.056977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:51.970829" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:51.970990" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:51.730027" elapsed="0.240988"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:51.971360" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:51.971122" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.971105" elapsed="0.000362"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:51.971504" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_route_injection</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:51.725191" elapsed="0.246439"/>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="PASS" start="2026-05-01T00:43:51.641225" elapsed="0.330535"/>
</test>
<test id="s1-s5-t19" name="Check_Ipv6_Prefix_In_Bgp_Rib_1" line="250">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:51.975142" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:51.974883" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.976397" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.976288" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.976270" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.981695" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.981587" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.981569" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.982778" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:51.982376" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:51.983256" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:51.982965" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:51.983327" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:43:51.983508" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:51.981990" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.989076" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.988966" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.988946" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:51.990309" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:51.990201" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:51.990184" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:51.990854" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:51.990552" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:51.991252" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:51.991038" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.019801" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:51.991789" elapsed="0.028115"/>
</kw>
<msg time="2026-05-01T00:43:52.020067" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:52.020114" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.991433" elapsed="0.028785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.044926" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "n "_ "B "g "p "_ "R "i "b "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:52.020822" elapsed="0.024213"/>
</kw>
<msg time="2026-05-01T00:43:52.045198" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:52.045244" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.020396" elapsed="0.024885"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.045611" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.045360" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.045340" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.046255" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "n "_ "B "g "p "_ "R "i "b "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.045834" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.046653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.046408" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.046389" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:52.046766" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:52.049278" elapsed="0.000293"/>
</kw>
<msg time="2026-05-01T00:43:52.049637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.048184" elapsed="0.001582"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.050039" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.050387" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:52.047571" elapsed="0.003028"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:52.047027" elapsed="0.003637"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:51.989901" elapsed="0.060860"/>
</kw>
<msg time="2026-05-01T00:43:52.050852" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:52.050895" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.989292" elapsed="0.061640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:52.051116" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:52.051009" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.050991" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.051631" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.052139" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.052211" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:51.988608" elapsed="0.063710"/>
</kw>
<msg time="2026-05-01T00:43:52.052409" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:52.052477" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.983902" elapsed="0.068615"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.053036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.052754" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.052711" elapsed="0.000448"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:51.983761" elapsed="0.069421"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:51.983586" elapsed="0.069626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:51.981209" elapsed="0.072069"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:51.976006" elapsed="0.077329"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:51.975567" elapsed="0.077813"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:51.972647" elapsed="0.080797"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.054352" level="INFO">&amp;{mapping} = { IP=10.30.170.185 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${CONTROLLER_IPV4}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.053653" elapsed="0.000728"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.104688" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.104295" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.105441" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:52.105205" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:52.105618" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:52.104876" elapsed="0.000766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.106185" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:52.105806" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.106522" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:52.106660" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:52.106372" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.107078" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.106841" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.108247" level="INFO">mapping: {'IP': '10.30.170.185', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.107812" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.108813" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.108547" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.109566" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.109199" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.110493" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.110127" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.110572" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:52.110725" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.109784" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.110902" elapsed="0.000276"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:43:52.109063" elapsed="0.002200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.111866" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.111534" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.112784" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.112429" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.112861" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.113012" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.112079" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.113187" elapsed="0.000286"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:52.111381" elapsed="0.002136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.114086" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.113764" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.114994" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.114655" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.115071" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.115222" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.114296" elapsed="0.000950"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.115396" elapsed="0.000287"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:52.113632" elapsed="0.002098"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.116304" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.115974" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.117330" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.116992" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.117408" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:52.117576" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.116648" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.117750" elapsed="0.000274"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:52.115843" elapsed="0.002224"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.118666" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.118314" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.119573" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.119221" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.119650" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:52.119800" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.118885" elapsed="0.000940"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.119975" elapsed="0.000296"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.118181" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.122486" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.120582" elapsed="0.001933"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.123377" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.123046" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.123470" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:52.123625" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.122708" elapsed="0.000942"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.123801" elapsed="0.000269"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:52.120433" elapsed="0.003713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.124749" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.124413" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.125648" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.125298" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.125724" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.125875" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.124959" elapsed="0.000940"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.126049" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.124279" elapsed="0.002081"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.126966" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.126646" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.127860" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.127528" elapsed="0.000359"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.127937" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.128090" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.127177" elapsed="0.000937"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.128280" elapsed="0.000284"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.126513" elapsed="0.002092"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:52.108886" elapsed="0.019755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:52.128684" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:52.128843" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:52.107491" elapsed="0.021379"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.107189" elapsed="0.021712"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.129072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.128925" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.107171" elapsed="0.021978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.129980" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.129288" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:52.130056" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:52.103679" elapsed="0.026501"/>
</kw>
<msg time="2026-05-01T00:43:52.130232" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.090757" elapsed="0.039521"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.143093" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.156138" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.169279" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.169485" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.169662" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.170023" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.169881" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:52.169866" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.170240" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.170406" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.170587" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:52.169837" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.169736" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.170816" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.170892" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:43:52.171007" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:52.086391" elapsed="0.084642"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.172303" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:52.172044" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:52.172472" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:52.171694" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.172815" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.172570" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.173347" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.173058" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.172896" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.172552" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.175833" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:52.173599" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:52.175923" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:52.176080" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:52.171352" elapsed="0.004753"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.177340" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:52.177094" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:52.177550" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:52.176760" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:52.177791" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:52.177648" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.177630" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.178022" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.178194" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.178259" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:52.180272" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:52.176415" elapsed="0.003884"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.181700" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.181437" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.182138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.181897" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:52.197904" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:52.200477" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.12","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:43:52.200776" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:52.184554" elapsed="0.016260"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.182247" elapsed="0.018626"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.201119" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.200909" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.182229" elapsed="0.019009"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.206483" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.12","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"route-key":"1:1:1::1/128","path-id":1,"prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"route-key":"1:1:1::1/128","path-id":1,"prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"1:1:1::1/128","prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.202650" elapsed="0.004149"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.202327" elapsed="0.004522"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.202302" elapsed="0.004583"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.210610" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.207271" elapsed="0.003403"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.206964" elapsed="0.003758"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.206941" elapsed="0.003816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.211516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.210979" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.211995" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.211653" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.212764" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.212328" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.212108" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.211628" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.213624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.213100" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.214081" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.213758" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.214845" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.214414" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.214193" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.213734" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.215166" elapsed="0.000527"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:52.216306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.215924" elapsed="0.000418"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.216571" elapsed="0.002365"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:52.201745" elapsed="0.017255"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.219174" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.219069" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.219051" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:52.228553" level="INFO">${text_normalized} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.219391" elapsed="0.009193"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:52.228636" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.228796" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:52.180632" elapsed="0.048190"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:52.228885" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:43:52.229033" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:52.063388" elapsed="0.165671"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.229382" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.229142" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.229125" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:52.229594" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_rib</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:52.059003" elapsed="0.170717"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/bgp_rib</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>mapping=${mapping}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:52.054578" elapsed="0.175197"/>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="PASS" start="2026-05-01T00:43:51.972096" elapsed="0.257790"/>
</test>
<test id="s1-s5-t20" name="Delete_Injected_Ipv6_Routes_1" line="269">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:52.233162" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:52.232901" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.234409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.234299" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.234281" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.239511" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.239388" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.239370" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.240589" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:52.240195" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.241073" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:52.240780" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:52.241143" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.241298" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:52.239823" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.247049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.246942" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.246923" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.248266" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.248160" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.248143" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:52.248797" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.248501" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.249189" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:52.248980" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.282180" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:52.249725" elapsed="0.032569"/>
</kw>
<msg time="2026-05-01T00:43:52.282498" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:52.282546" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.249372" elapsed="0.033211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.308446" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "6 "_ "R "o "u "t "e "s "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:52.283110" elapsed="0.025466"/>
</kw>
<msg time="2026-05-01T00:43:52.308745" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:52.308792" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.282760" elapsed="0.026110"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.309187" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.308956" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.308934" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.309750" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "6 "_ "R "o "u "t "e "s "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.309411" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.310106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.309890" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.309872" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:52.310218" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:52.312736" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:43:52.312939" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.311679" elapsed="0.001390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.313340" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.313691" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:52.311026" elapsed="0.002851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:52.310495" elapsed="0.003446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:52.247861" elapsed="0.066177"/>
</kw>
<msg time="2026-05-01T00:43:52.314128" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:52.314172" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.247268" elapsed="0.066941"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:52.314394" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:52.314287" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.314268" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.314901" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.315261" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.315334" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:52.246597" elapsed="0.068846"/>
</kw>
<msg time="2026-05-01T00:43:52.315557" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:52.315600" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.241699" elapsed="0.073939"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.315960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.315714" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.315697" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:52.241558" elapsed="0.074502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:52.241373" elapsed="0.074717"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:52.239032" elapsed="0.077111"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:52.234014" elapsed="0.082183"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:52.233588" elapsed="0.082689"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:52.230671" elapsed="0.085662"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.317178" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.316531" elapsed="0.000677"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.361082" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.360700" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.361843" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:52.361628" elapsed="0.000280">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:52.362002" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:52.361272" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.362589" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:52.362190" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:52.362940" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:52.363075" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:52.362778" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.363515" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.363257" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.364507" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.364236" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.364974" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.364711" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.365667" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.365355" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.366402" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.366191" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.366493" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:52.366647" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.365878" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.366833" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:52.365222" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.367663" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.367348" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.368396" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.368187" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.368520" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:52.368678" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.367875" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.368853" elapsed="0.000491"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:52.367217" elapsed="0.002169"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.369955" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.369653" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.370710" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.370498" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.370800" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:52.370954" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.370167" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.371129" elapsed="0.000221"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:52.369518" elapsed="0.001872"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.371950" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.371656" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.372700" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.372488" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.372776" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.372925" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.372161" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.373098" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:52.371523" elapsed="0.001835"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.373920" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.373621" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.374663" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.374439" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.374744" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:43:52.374927" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.374128" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.375102" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.373487" elapsed="0.001877"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.375920" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.375625" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.376669" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.376443" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.376751" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.376902" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.376130" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.377076" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:52.375493" elapsed="0.001847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.377902" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.377603" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.378657" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.378429" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.378747" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:52.378941" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.378113" elapsed="0.000853"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.379117" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.377469" elapsed="0.001911"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.379937" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:52.379642" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:52.380873" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.380663" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:52.380949" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:52.381101" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:52.380149" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.381276" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:52.379510" elapsed="0.002044"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:52.365046" elapsed="0.016544"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:52.381632" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:52.381793" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:52.363919" elapsed="0.017899"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.363629" elapsed="0.018221"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.382021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.381875" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.363611" elapsed="0.018488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.382932" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.382240" elapsed="0.000720"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:52.383009" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:52.360074" elapsed="0.023061"/>
</kw>
<msg time="2026-05-01T00:43:52.383189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.347135" elapsed="0.036099"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.395970" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.408771" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.421646" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.421877" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.422055" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.422418" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.422275" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:52.422261" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.422685" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.422855" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.423019" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:52.422232" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.422128" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.423240" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.423316" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:52.423436" level="INFO">${uri} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:52.342702" elapsed="0.080775"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.424581" level="INFO">rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.424315" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:52.437063" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 path_url=/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:52.437110" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:52.437199" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:52.426796" elapsed="0.010428"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.424693" elapsed="0.012571"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.437439" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.437289" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.424676" elapsed="0.012871"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.442836" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.438962" elapsed="0.003935"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.438637" elapsed="0.004310"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.438611" elapsed="0.004372"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.446700" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.443370" elapsed="0.003394"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.443060" elapsed="0.003752"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.443038" elapsed="0.003809"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.447521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.447072" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.447853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.447621" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.448437" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.448137" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.447973" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.447602" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.449062" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.448700" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.449390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.449159" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.449944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.449647" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:52.449486" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.449142" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.450179" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:52.450987" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:52.450714" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.451168" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:52.437995" elapsed="0.015594"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:52.453636" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:52.455998" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:52.423745" elapsed="0.032281"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:52.456081" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_route_injection</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:52.317447" elapsed="0.138759"/>
</kw>
<kw name="Fail If Exceptions Found During Test" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.457073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.456966" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.456948" elapsed="0.000193"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.457975" level="INFO">${cmd} = sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1/d' /tmp/karaf-0.23.2/data/log/karaf.log</msg>
<var>${cmd}</var>
<arg>sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:52.457603" elapsed="0.000401"/>
</kw>
<kw name="Get Karaf Log Lines From Test Start" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:52.462358" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:52.462209" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.462188" elapsed="0.000255"/>
</if>
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:52.464552" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:52.464273" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:52.464254" elapsed="0.000379"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.464909" level="INFO">index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:43:52.465010" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:43:52.464788" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.465582" level="INFO">Attempting to execute command "sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1/d' /tmp/karaf-0.23.2/data/log/karaf.log" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:52.465187" elapsed="0.000442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.466256" level="INFO">${conn_id} = 8</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:43:52.465810" elapsed="0.000473"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:43:52.467319" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:43:52.467396" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:43:52.466911" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.467596" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:43:52.468779" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:43:53.094202" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:43:52 UTC 2026

  System load:  0.01               Processes:             127
  Usage of /:   11.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:41:47 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:43:52.468446" elapsed="0.625856"/>
</kw>
<msg time="2026-05-01T00:43:53.094367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.468088" elapsed="0.626338"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:43:52.466516" elapsed="0.628016"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.094912" level="INFO">Executing command 'sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1/d' /tmp/karaf-0.23.2/data/log/karaf.log'.</msg>
<msg time="2026-05-01T00:43:53.107184" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:53.107293" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:43:53.107337" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:53.094713" elapsed="0.012647"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:43:53.107546" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.108352" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.107947" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.108900" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.108637" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.108593" elapsed="0.000463"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:43:53.109407" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.109175" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.109141" elapsed="0.000485"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.109703" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.116941" elapsed="0.000307"/>
</kw>
<msg time="2026-05-01T00:43:53.117344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.115818" elapsed="0.001692"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.117859" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.118216" elapsed="0.000046"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:53.110405" elapsed="0.007988"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:43:52.463748" elapsed="0.654876"/>
</kw>
<msg time="2026-05-01T00:43:53.118780" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:52.463179" elapsed="0.655708"/>
</kw>
<msg time="2026-05-01T00:43:53.119125" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>${ip}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>${prompt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:43:52.462628" elapsed="0.656551"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:43:53.120185" level="INFO">@{log_lines} = [  ]</msg>
<var>@{log_lines}</var>
<arg>${output}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.119714" elapsed="0.000497"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-05-01T00:43:53.120260" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:53.120414" level="INFO">${output} = ['']</msg>
<var>${output}</var>
<arg>${ODL_SYSTEM_${i}_IP}</arg>
<arg>${test_name}</arg>
<arg>${cmd}</arg>
<doc>Scrapes all log messages that match regexp ${type} which fall after a point given by a log message that
contains bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1. This is useful if your test cases are marking karaf.log with a message indicating when
that test case has started; such that you can easily pull out any extra log messsages to parse/log/etc in the
test logic itself. For example, you can grab all ERRORS that occur during your test case.</doc>
<status status="PASS" start="2026-05-01T00:43:52.461691" elapsed="0.658748"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-05-01T00:43:53.120817" level="INFO">${exlist} = []</msg>
<msg time="2026-05-01T00:43:53.120863" level="INFO">${matchlist} = []</msg>
<var>${exlist}</var>
<var>${matchlist}</var>
<arg>${output}</arg>
<doc>Return a list of exceptions not in the whitelist for the given lines.</doc>
<status status="PASS" start="2026-05-01T00:43:53.120634" elapsed="0.000252"/>
</kw>
<kw name="Write Exceptions Map To File" owner="excepts">
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>/tmp/odl${i}_exceptions.txt</arg>
<doc>Write the exceptions map to a file under the testname header. The output
will include all lines in the exception itself as well as any previous
contextual warning or error lines. The output will be appended or overwritten
depending on the mode parameter. It is assumed that the caller has called
verify_exceptions() earlier to populate the exceptions map, otherwise only
the testname and header will be printed to the file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.121061" elapsed="0.000387"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.121901" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:43:53.121977" level="INFO">${listlength} = 0</msg>
<var>${listlength}</var>
<arg>${exlist}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:43:53.121628" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${fail}&quot;==&quot;True&quot; and ${listlength} != 0">
<kw name="Log And Fail Exceptions" owner="KarafKeywords">
<arg>${exlist}</arg>
<arg>${listlength}</arg>
<doc>Print the list of failed exceptions and fail the test</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.122414" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.122073" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-05-01T00:43:53.122808" level="INFO">List is empty.</msg>
<arg>${matchlist}</arg>
<doc>Logs contents of the ``list`` using the given ``level``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.122659" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.122517" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.122054" elapsed="0.000852"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-05-01T00:43:52.457431" elapsed="0.665500"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-05-01T00:43:52.457179" elapsed="0.665783"/>
</for>
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>fail=${True}</arg>
<doc>Create a failure if an Exception is found in the karaf.log that has not been whitelisted.
Will work for single controller jobs as well as 3node cluster jobs</doc>
<status status="PASS" start="2026-05-01T00:43:52.456568" elapsed="0.666452"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="PASS" start="2026-05-01T00:43:52.230160" elapsed="0.892973"/>
</test>
<test id="s1-s5-t21" name="Delete_Bgp_Peer_Configuration_4" line="286">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:53.126919" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:53.126636" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.128192" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.128081" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.128063" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.133272" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.133163" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.133145" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.134344" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.133967" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.134854" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:53.134546" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:53.134925" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.135080" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.133590" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.140651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.140541" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.140523" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.141924" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.141782" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.141763" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:53.142447" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.142144" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.142892" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.142673" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.173942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:53.143417" elapsed="0.030647"/>
</kw>
<msg time="2026-05-01T00:43:53.174228" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:53.174275" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.143079" elapsed="0.031234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.199026" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:53.174864" elapsed="0.024269"/>
</kw>
<msg time="2026-05-01T00:43:53.199297" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:53.199345" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.174520" elapsed="0.024863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.199717" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.199488" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.199442" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.200238" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.199941" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.200606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.200375" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.200357" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:53.200720" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.203258" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:43:53.203478" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.202165" elapsed="0.001444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.203881" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.204216" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:53.201543" elapsed="0.002858"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:53.200995" elapsed="0.003490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:53.141475" elapsed="0.063110"/>
</kw>
<msg time="2026-05-01T00:43:53.204676" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.204720" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.140871" elapsed="0.063886"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:53.204940" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.204832" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.204814" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.205418" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.205813" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.205886" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:53.140190" elapsed="0.065806"/>
</kw>
<msg time="2026-05-01T00:43:53.206088" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.206131" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.135488" elapsed="0.070679"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.206520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.206240" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.206223" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:53.135330" elapsed="0.071293"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:53.135159" elapsed="0.071492"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:53.132802" elapsed="0.073902"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:53.127791" elapsed="0.078968"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.127340" elapsed="0.079463"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:53.124173" elapsed="0.082682"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.207741" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV4_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.207041" elapsed="0.000729"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.252705" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.252314" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.253477" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.253232" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.253648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.252901" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.254229" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.253835" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.254565" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_neighbor_rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:53.254702" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.254415" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.255127" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.254886" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.256130" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.255873" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.256654" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.256372" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.257339" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.257038" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.258115" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.257884" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.258192" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.258344" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.257570" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.258541" elapsed="0.000234"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:43:53.256906" elapsed="0.001910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.259360" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.259063" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.260112" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.259904" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.260188" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.260338" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.259589" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.260527" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:53.258931" elapsed="0.001857"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.261327" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.261036" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.262094" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.261863" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.262172" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:43:53.262327" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.261552" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.262514" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:53.260902" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.263523" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.263030" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.264262" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.264054" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.264337" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.264508" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.263737" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.264684" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:53.262899" elapsed="0.002047"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.265501" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.265190" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.266244" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.266036" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.266318" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.266487" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.265713" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.266703" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.265059" elapsed="0.001907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.267520" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.267210" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.268269" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.268061" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.268344" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.268516" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.267732" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.268689" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:53.267080" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.269514" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.269197" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.270264" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.270050" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.270340" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:53.270506" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.269726" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.270680" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.269065" elapsed="0.001884"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.271506" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.271195" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.272242" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.272034" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.272316" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.272482" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.271716" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.272657" elapsed="0.000218"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.271064" elapsed="0.001852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:53.256728" elapsed="0.016223"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:53.272994" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:53.273154" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:53.255552" elapsed="0.017628"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.255239" elapsed="0.017974"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.273385" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.273238" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.255220" elapsed="0.018257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.274418" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.273621" elapsed="0.000825"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.274519" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.251699" elapsed="0.022946"/>
</kw>
<msg time="2026-05-01T00:43:53.274736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.236937" elapsed="0.037848"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.287766" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.300496" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.313327" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.313534" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.313710" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.314089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.313946" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:53.313931" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.314309" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.314491" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.314661" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.313901" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.313797" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.314886" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.314962" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:53.315084" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:53.232591" elapsed="0.082519"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.316206" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.315958" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:53.327968" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:53.328085" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:53.328220" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:53.318476" elapsed="0.009771"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.316320" elapsed="0.011975"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.328542" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.328328" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.316302" elapsed="0.012331"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.334233" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.329770" elapsed="0.004559"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.329495" elapsed="0.004911"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.329474" elapsed="0.005026"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.340387" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.335122" elapsed="0.005397"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.334631" elapsed="0.005967"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.334594" elapsed="0.006059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.341952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.341022" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.342723" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.342171" elapsed="0.000635"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.343293" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.342992" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.342830" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.342131" elapsed="0.001246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.343921" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.343552" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.344249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.344019" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.344797" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.344503" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.344329" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.344001" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.345030" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:53.345868" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.345555" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.346050" elapsed="0.002537"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:53.329035" elapsed="0.019620"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:53.348705" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:43:53.351022" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:53.315373" elapsed="0.035675"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.351105" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_neighbor_rib</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:53.208009" elapsed="0.143221"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:43:53.123411" elapsed="0.227941"/>
</test>
<test id="s1-s5-t22" name="Verify_Ipv6_Topology_Empty_4" line="302">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:53.354912" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:53.354646" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.356244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.356131" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.356113" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.362087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.361971" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.361952" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.363219" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.362798" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.363717" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:53.363405" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:53.363789" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.363944" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.362393" elapsed="0.001575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.369754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.369643" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.369624" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.371163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.371056" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.371038" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:53.371695" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.371377" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.372243" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.371881" elapsed="0.000388"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.403929" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:53.372780" elapsed="0.031251"/>
</kw>
<msg time="2026-05-01T00:43:53.404197" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:53.404243" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.372427" elapsed="0.031853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.428784" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:53.404818" elapsed="0.024077"/>
</kw>
<msg time="2026-05-01T00:43:53.429062" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:53.429107" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.404473" elapsed="0.024671"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.429508" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.429238" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.429217" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.430048" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.429737" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.430402" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.430184" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.430166" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:53.430578" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.433126" elapsed="0.000170"/>
</kw>
<msg time="2026-05-01T00:43:53.433360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.432028" elapsed="0.001490"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.433797" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.434133" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:53.431387" elapsed="0.002933"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:53.430849" elapsed="0.003535"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:53.370611" elapsed="0.063889"/>
</kw>
<msg time="2026-05-01T00:43:53.434596" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.434640" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.369974" elapsed="0.064703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:53.434862" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.434754" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.434736" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.435355" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.435721" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.435794" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:53.369278" elapsed="0.066625"/>
</kw>
<msg time="2026-05-01T00:43:53.435995" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.436039" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.364362" elapsed="0.071714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.436401" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.436152" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.436136" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:53.364214" elapsed="0.072304"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:53.364029" elapsed="0.072522"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:53.361585" elapsed="0.075022"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:53.355837" elapsed="0.080826"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.355377" elapsed="0.081334"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:53.352351" elapsed="0.084412"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.490068" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.489695" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.490871" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.490606" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.491092" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.490258" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.491683" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.491283" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.492010" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:53.492164" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.491872" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.492606" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.492344" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.493694" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.493401" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.494169" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.493896" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.494536" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.494747" elapsed="0.000028"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.494923" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.494379" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.494241" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:53.495051" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.495210" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:53.493076" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.492722" elapsed="0.002545"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.495437" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.495291" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.492703" elapsed="0.002830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.496123" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.495678" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.496199" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.489066" elapsed="0.007258"/>
</kw>
<msg time="2026-05-01T00:43:53.496377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.475880" elapsed="0.020545"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.509438" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.522193" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.535154" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.535351" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.535544" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.535929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.535773" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:53.535758" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.536154" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.536322" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.536503" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.535729" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.535625" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.536745" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.536825" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:53.536941" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:53.471441" elapsed="0.065526"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.538221" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.537981" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.538376" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.537639" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.538736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.538489" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.539273" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.538982" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.538819" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.538469" elapsed="0.000887"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.541812" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.539522" elapsed="0.002317"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:53.541891" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.542044" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:53.537294" elapsed="0.004775"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.543280" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.543048" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.543489" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.542713" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:53.543727" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.543588" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.543569" elapsed="0.000250"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.543968" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.544142" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.544209" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:53.546352" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:53.542375" elapsed="0.004004"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.547789" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.547540" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.548229" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.547987" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:53.557571" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:53.557724" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:53.557822" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:53.550498" elapsed="0.007350"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.548342" elapsed="0.009549"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.558072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.557917" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.548322" elapsed="0.009837"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.562121" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.559178" elapsed="0.003012"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.558957" elapsed="0.003285"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.558939" elapsed="0.003340"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.566182" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.562713" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.562362" elapsed="0.003938"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.562338" elapsed="0.003999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.567149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.566596" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.567657" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.567291" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.568475" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.568015" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.567779" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.567265" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.569389" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.568854" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.569898" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.569554" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.570774" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.570308" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.570069" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.569527" elapsed="0.001373"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.571118" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:53.572304" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.571890" elapsed="0.000453"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.572639" elapsed="0.002584"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:53.558540" elapsed="0.016746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.575479" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.575357" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.575338" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:53.578433" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.575699" elapsed="0.002778"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:53.578531" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.578689" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:53.546711" elapsed="0.032004"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.578778" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:53.578927" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:53.448217" elapsed="0.130736"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.607596" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.607132" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.608397" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.608113" elapsed="0.000420">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.608712" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.607784" elapsed="0.000954"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.609341" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.608902" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.609703" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:53.609832" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.609542" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.610317" level="INFO">{
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.610050" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:53.610850" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.610433" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.611605" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.611083" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.610937" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.610413" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.612320" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.611842" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.612398" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.606522" elapsed="0.006027"/>
</kw>
<msg time="2026-05-01T00:43:53.612604" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.593604" elapsed="0.019047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.625553" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.638330" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.651068" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.651259" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.651433" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.651809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.651666" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:53.651652" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.652026" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.652213" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.652418" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.651623" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.651522" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.652662" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.652739" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:53.652858" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:53.590915" elapsed="0.061970"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.653059" elapsed="0.002246"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:53.656364" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.656047" elapsed="0.000345"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:53.656844" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.656560" elapsed="0.000312"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:53.657025" elapsed="0.000321"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:53.655640" elapsed="0.001766"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.655384" elapsed="0.002055"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.657631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.657482" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.655365" elapsed="0.002341"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:53.580090" elapsed="0.077663"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:53.579274" elapsed="0.078552"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.579035" elapsed="0.078835"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.579018" elapsed="0.078875"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.657927" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:53.441794" elapsed="0.216260"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:53.437206" elapsed="0.220903"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-05-01T00:43:53.436911" elapsed="0.221260"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:53.351717" elapsed="0.306553"/>
</test>
<test id="s1-s5-t23" name="Reconfigure_ODL_To_Accept_Connections_5" line="307">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:53.661688" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:53.661400" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.662956" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.662811" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.662791" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.668213" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.668101" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.668080" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.669288" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.668912" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.669793" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:53.669490" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:53.669863" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.670018" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.668532" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.675606" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.675495" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.675476" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.676856" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.676732" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.676714" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:53.677365" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.677070" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.677778" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.677566" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.711292" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:53.678288" elapsed="0.033112"/>
</kw>
<msg time="2026-05-01T00:43:53.711590" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:53.711636" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.677959" elapsed="0.033713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.739624" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:53.712210" elapsed="0.027537"/>
</kw>
<msg time="2026-05-01T00:43:53.739906" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:53.739951" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.711869" elapsed="0.028119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.740286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.740065" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.740045" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.740826" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.740526" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.741174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.740963" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.740945" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:53.741285" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.743816" elapsed="0.000270"/>
</kw>
<msg time="2026-05-01T00:43:53.744148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.742754" elapsed="0.001523"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.744575" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.744909" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:53.742084" elapsed="0.003010"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:53.741562" elapsed="0.003597"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:53.676406" elapsed="0.068849"/>
</kw>
<msg time="2026-05-01T00:43:53.745345" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.745389" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.675827" elapsed="0.069599"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:53.745636" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.745529" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.745510" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.746118" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.746485" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.746559" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:53.675144" elapsed="0.071524"/>
</kw>
<msg time="2026-05-01T00:43:53.746760" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:53.746803" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.670403" elapsed="0.076437"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.747161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.746915" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.746898" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:53.670260" elapsed="0.077000"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:53.670094" elapsed="0.077194"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:53.667710" elapsed="0.079630"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:53.662525" elapsed="0.084870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.662093" elapsed="0.085345"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:53.659183" elapsed="0.088329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.748414" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV4_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.747730" elapsed="0.000713"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.782621" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.782230" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.783465" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.783204" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.783631" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.782811" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.784199" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.783817" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.784536" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:53.784672" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.784384" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.785093" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.784852" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.787691" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.785839" elapsed="0.001899"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.788166" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.787899" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.788860" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.788561" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.789623" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.789389" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.789698" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.789856" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.789075" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.790123" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:43:53.788414" elapsed="0.001988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.790972" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.790676" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.791737" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.791524" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.791819" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.791970" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.791182" elapsed="0.000813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.792144" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:53.790542" elapsed="0.001860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.792960" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.792664" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.793711" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.793496" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.793787" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.793938" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.793171" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.794146" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:53.792532" elapsed="0.001877"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.795106" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.794673" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.795886" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.795677" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.795962" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.796113" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.795316" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.796287" elapsed="0.000237"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:53.794538" elapsed="0.002027"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.797106" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.796811" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.797877" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.797663" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.797952" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.798102" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.797319" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.798275" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.796680" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.799097" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.798802" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.800043" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.799833" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.800119" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:43:53.800274" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.799514" elapsed="0.000784"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.800448" elapsed="0.000241"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:53.798671" elapsed="0.002058"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.801269" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.800975" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.802020" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.801813" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.802094" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.802245" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.801495" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.802417" elapsed="0.000234"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.800843" elapsed="0.001848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.803230" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:53.802937" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:53.803989" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.803779" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:53.804064" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.804215" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:53.803466" elapsed="0.000773"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.804428" elapsed="0.000238"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:53.802805" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:53.788238" elapsed="0.016503"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:53.804786" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:53.804946" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:53.785515" elapsed="0.019457"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.785204" elapsed="0.019801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.805177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.805029" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.785186" elapsed="0.020068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.806082" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.805393" elapsed="0.000717"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.806160" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.781617" elapsed="0.024668"/>
</kw>
<msg time="2026-05-01T00:43:53.806340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.768605" elapsed="0.037782"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.819119" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.831936" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.844975" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.845171" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.845346" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.845725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.845583" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:53.845569" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.845948" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.846111" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.846314" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.845539" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.845419" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.846555" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.846633" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:53.846756" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:53.764265" elapsed="0.082518"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.873617" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.873227" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.874337" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.874133" elapsed="0.000267">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.874514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.873805" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.875111" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.874703" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.875435" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:53.875592" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:53.875300" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.876018" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.875777" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:53.876431" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.876142" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.876969" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.876676" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.876531" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.876123" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.877950" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.877198" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.878063" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.872616" elapsed="0.005576"/>
</kw>
<msg time="2026-05-01T00:43:53.878249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.859709" elapsed="0.018587"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.891181" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.904227" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.916910" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.917101" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.917275" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.917653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.917509" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:53.917495" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.917872" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.918038" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.918201" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:53.917462" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.917347" elapsed="0.000933"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.918428" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.918522" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:53.918655" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:53.856986" elapsed="0.061699"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:53.919981" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:53.919746" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:53.920136" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:53.919391" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.920491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.920232" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.921028" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.920737" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.920573" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.920214" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.923529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.921262" elapsed="0.002293"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:53.923606" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:53.923763" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:53.919068" elapsed="0.004720"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.925159" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.924914" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.925609" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.925355" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.926057" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.925815" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.926501" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.926247" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:53.927372" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:53.927182" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:53.927747" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:53.927572" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.927920" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.928528" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.928267" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:53.928614" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.928770" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:53.926771" elapsed="0.002024"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:53.949483" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '983', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:53.949629" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:53.949780" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:53.931171" elapsed="0.018666"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.928866" elapsed="0.021070"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.950332" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.949995" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.928848" elapsed="0.021719"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.958126" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.952702" elapsed="0.005519"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.952187" elapsed="0.006111"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.952148" elapsed="0.006207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.961211" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:53.958900" elapsed="0.002356"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.958511" elapsed="0.002779"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.958444" elapsed="0.002871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.961870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.961490" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.962200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.961967" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.962764" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.962440" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.962281" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.961949" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.963362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.963004" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.963704" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.963473" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.964232" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:53.963943" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:53.963784" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.963440" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:53.964476" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:53.965251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:53.964978" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.965430" elapsed="0.002353"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:53.951377" elapsed="0.016469"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:53.968018" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:53.967912" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.967895" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.968253" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.968320" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:53.970660" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:53.924117" elapsed="0.046571"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.970788" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:53.970947" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:53.753254" elapsed="0.217718"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:53.971310" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:53.971071" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.971054" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:53.971437" elapsed="0.000044"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:53.748735" elapsed="0.222846"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:43:53.658569" elapsed="0.313119"/>
</test>
<test id="s1-s5-t24" name="Inject_Ipv6_Route_2" line="323">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:53.974933" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:53.974669" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.976172" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.976064" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.976046" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.981426" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.981320" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.981302" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.982528" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:53.982111" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:53.983012" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:53.982715" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:53.983083" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:53.983238" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:53.981738" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.988828" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.988721" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.988702" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:53.990055" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:53.989949" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:53.989931" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:53.990596" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:53.990264" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:53.990990" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:53.990778" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.023483" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:53.991518" elapsed="0.032065"/>
</kw>
<msg time="2026-05-01T00:43:54.023770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:54.023816" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.991171" elapsed="0.032681"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.045233" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:54.024356" elapsed="0.021013"/>
</kw>
<msg time="2026-05-01T00:43:54.045547" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:54.045594" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "2 "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.024020" elapsed="0.021610"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.045930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.045708" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.045688" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.046475" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.046149" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.046839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.046617" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.046593" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:54.046951" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:54.049412" elapsed="0.000162"/>
</kw>
<msg time="2026-05-01T00:43:54.049635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.048362" elapsed="0.001402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.050041" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.050411" elapsed="0.000245"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:54.047747" elapsed="0.003026"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:54.047206" elapsed="0.003631"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:53.989646" elapsed="0.061290"/>
</kw>
<msg time="2026-05-01T00:43:54.051029" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.051072" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "2 "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.989048" elapsed="0.062062"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:54.051297" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:54.051190" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.051170" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.051805" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.052143" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.052215" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:53.988368" elapsed="0.063955"/>
</kw>
<msg time="2026-05-01T00:43:54.052416" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.052476" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "I "n "j "e "c "t "_ "I "p "v "6 "_ "R "o "u "t "e "_ "2 "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.983639" elapsed="0.068878"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.052843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.052595" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.052577" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:53.983498" elapsed="0.069446"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:53.983314" elapsed="0.069660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:53.980960" elapsed="0.072110"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:53.975780" elapsed="0.077350"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:53.975339" elapsed="0.077838"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:53.972475" elapsed="0.080757"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.054109" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.053425" elapsed="0.000714"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.088970" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.088576" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.089801" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.089528" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.089981" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.089178" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.090589" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.090186" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.090930" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:54.091102" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:54.090780" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.091551" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.091288" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.092590" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.092311" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.093280" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.092796" elapsed="0.000510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.094027" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.093714" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.094809" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.094581" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.094890" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:43:54.095060" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.094244" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.095240" elapsed="0.000266"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:54.093572" elapsed="0.001977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.096274" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.095801" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.097045" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.096833" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.097121" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.097272" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.096514" elapsed="0.000783"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.097447" elapsed="0.000241"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:54.095667" elapsed="0.002063"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.098309" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.098000" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.099073" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.098863" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.099148" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.099298" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.098538" elapsed="0.000784"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.099487" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:54.097843" elapsed="0.001910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.100296" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.100000" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.101047" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.100838" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.101123" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.101273" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.100524" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.101465" elapsed="0.000225"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:54.099868" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.102391" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.102094" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.103345" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.102933" elapsed="0.000438"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.103423" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:43:54.103591" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.102618" elapsed="0.000998"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.103766" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.101846" elapsed="0.002184"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.104761" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.104275" elapsed="0.000512"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.105513" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.105288" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.105589" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.105739" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.104974" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.105914" elapsed="0.000236"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:54.104144" elapsed="0.002047"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.106752" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.106438" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.107541" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.107316" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.107616" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.107767" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.107002" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.107941" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.106306" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.108756" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.108444" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.109505" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.109281" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.109580" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.109730" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.108966" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.109903" elapsed="0.000247"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.108313" elapsed="0.001877"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.093361" elapsed="0.016864"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.110268" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.110428" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:54.091988" elapsed="0.018481"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.091677" elapsed="0.018827"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.110680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.110530" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.091650" elapsed="0.019106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.111606" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.110900" elapsed="0.000734"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.111683" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.087945" elapsed="0.023862"/>
</kw>
<msg time="2026-05-01T00:43:54.111862" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.074939" elapsed="0.036971"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.124739" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.137572" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.150535" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.150731" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.150907" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.151273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.151129" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:54.151114" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.151511" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.151682" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.151847" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:54.151084" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.150981" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.152074" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.152151" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:54.152270" level="INFO">${uri} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:54.070508" elapsed="0.081788"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.177210" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.176840" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.177971" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.177763" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.178127" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.177397" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.178711" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.178309" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.179029" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:54.179155" level="INFO">${template} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:54.178896" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.179594" level="INFO">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.179334" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:54.180046" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.179753" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.180590" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.180275" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.180130" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.179734" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.181298" level="INFO">${final_text} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.180826" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.181378" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.176218" elapsed="0.005316"/>
</kw>
<msg time="2026-05-01T00:43:54.181612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.163328" elapsed="0.018334"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.194722" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.207553" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.220269" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.220475" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.220651" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.221014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.220872" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:54.220858" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.221233" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.221403" elapsed="0.000032"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.221597" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:54.220828" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.220724" elapsed="0.000995"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.221870" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.221945" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:54.222076" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testi...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:54.162490" elapsed="0.059614"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.223356" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.223121" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.223527" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.222786" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.223867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.223623" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.224407" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.224119" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.223945" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.223604" elapsed="0.000900"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.226904" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.224653" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:54.226982" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.227133" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:54.222443" elapsed="0.004715"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.228683" level="INFO">rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.228422" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.229114" level="INFO">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.228879" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.229602" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.229317" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.230037" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.229798" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:54.230886" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:54.230694" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:54.231233" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:54.231061" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.231403" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.232065" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.231817" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:54.232151" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.232308" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:54.230278" elapsed="0.002054"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:54.247091" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 path_url=/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '759', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;ipv6-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
  &lt;!-- the prefix is a bogus value - just needs to be the same for n-path testing --&gt;
  &lt;!-- 1:1:1::1/128 should look like the following example: 1.1.1.1/32 --&gt;
  &lt;path-id&gt;1&lt;/path-id&gt;
  &lt;route-key&gt;1:1:1::1/128&lt;/route-key&gt;
  &lt;prefix&gt;1:1:1::1/128&lt;/prefix&gt;
  &lt;attributes&gt;
    &lt;ipv6-next-hop&gt;
      &lt;global&gt;2:1:1:1::1&lt;/global&gt;
    &lt;/ipv6-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
      &lt;!--- This is a bogus value --&gt;
      &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;origin&gt;
      &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
  &lt;/attributes&gt;
&lt;/ipv6-route&gt; 
 </msg>
<msg time="2026-05-01T00:43:54.247177" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes/ipv6-route=1%3A1%3A1%3A%3A1%2F128,1', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:54.247304" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:54.234749" elapsed="0.012591"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.232402" elapsed="0.015000"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.247684" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.247440" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.232384" elapsed="0.015422"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.252586" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.249227" elapsed="0.003420"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.248921" elapsed="0.003774"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.248897" elapsed="0.003834"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.256522" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.253110" elapsed="0.003477"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.252808" elapsed="0.003827"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.252785" elapsed="0.003885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.257440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.256893" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.257929" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.257600" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.258702" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.258261" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.258041" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.257575" elapsed="0.001242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.259558" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.259036" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.260009" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.259691" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.260770" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.260339" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.260119" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.259667" elapsed="0.001260"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.261140" elapsed="0.000518"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:54.262278" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.261891" elapsed="0.000423"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.262550" elapsed="0.003249"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:54.248301" elapsed="0.017563"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:54.266040" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:54.265936" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.265918" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.266271" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.266339" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:54.268646" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:54.227506" elapsed="0.041166"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.268741" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:54.268898" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:54.059205" elapsed="0.209717"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.269270" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.269025" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.269008" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.269395" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_route_injection</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:54.054430" elapsed="0.215103"/>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="PASS" start="2026-05-01T00:43:53.971985" elapsed="0.297672"/>
</test>
<test id="s1-s5-t25" name="Check_Ipv6_Prefix_In_Bgp_Rib_2" line="339">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:54.274614" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:54.274332" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.275870" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.275761" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.275743" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.280926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.280820" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.280803" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.281986" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.281613" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.282476" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:54.282170" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:54.282548" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.282701" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.281228" elapsed="0.001497"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.288262" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.288156" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.288138" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.289540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.289410" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.289392" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:54.290049" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.289752" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.290448" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:54.290231" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.323929" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:54.290988" elapsed="0.033044"/>
</kw>
<msg time="2026-05-01T00:43:54.324194" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:54.324239" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.290650" elapsed="0.033626"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.351181" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "n "_ "B "g "p "_ "R "i "b "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:54.324811" elapsed="0.026474"/>
</kw>
<msg time="2026-05-01T00:43:54.351445" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:54.351512" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.324445" elapsed="0.027104"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.351845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.351627" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.351608" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.352359" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "n "_ "B "g "p "_ "R "i "b "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.352065" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.352725" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.352512" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.352493" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:54.352845" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:54.355335" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:43:54.355554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.354270" elapsed="0.001413"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.355958" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.356291" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:54.353651" elapsed="0.002849"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:54.353111" elapsed="0.003454"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:54.289079" elapsed="0.067580"/>
</kw>
<msg time="2026-05-01T00:43:54.356749" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.356796" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.288496" elapsed="0.068352"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:54.357072" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:54.356966" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.356947" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.357576" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.357915" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.357986" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:54.287824" elapsed="0.070269"/>
</kw>
<msg time="2026-05-01T00:43:54.358198" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.358242" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "p "v "6 "_ "P "r "e "f "i "x "_ "I "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.283125" elapsed="0.075153"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.358627" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.358353" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.358336" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:54.282984" elapsed="0.075744"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:54.282813" elapsed="0.075943"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:54.280449" elapsed="0.078360"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:54.275449" elapsed="0.083412"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.275026" elapsed="0.083879"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:54.270541" elapsed="0.088414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.359846" level="INFO">&amp;{mapping} = { IP=10.30.170.185 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${CONTROLLER_IPV4}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.359137" elapsed="0.000739"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.410574" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.410184" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.411310" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.411097" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.411484" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.410764" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.412054" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.411674" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.412372" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:54.412516" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:54.412238" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.412987" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.412744" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.413983" level="INFO">mapping: {'IP': '10.30.170.185', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.413723" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.414449" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.414189" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.415171" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.414848" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.416082" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.415749" elapsed="0.000359"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.416159" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.416311" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.415386" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.416503" elapsed="0.000304"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:43:54.414715" elapsed="0.002134"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.417415" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.417096" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.418312" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.417984" elapsed="0.000355"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.418390" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.418556" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.417648" elapsed="0.000933"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.418733" elapsed="0.000399"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:54.416961" elapsed="0.002211"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.419750" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.419417" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.420849" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.420482" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.420928" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.421081" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.420119" elapsed="0.001011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.421283" elapsed="0.000287"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:54.419285" elapsed="0.002327"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.422178" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.421859" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.423193" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.422744" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.423271" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.423421" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.422390" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.423614" elapsed="0.000268"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:54.421727" elapsed="0.002197"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.424518" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.424171" elapsed="0.000383"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.425472" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.425117" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.425551" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.425705" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.424744" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.425879" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.424038" elapsed="0.002152"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.426774" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.426439" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.427673" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.427325" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.427750" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.427901" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.426988" elapsed="0.000937"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.428076" elapsed="0.000267"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:54.426305" elapsed="0.002080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.429005" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.428685" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.429908" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.429570" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.429986" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.430137" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.429218" elapsed="0.000943"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.430309" elapsed="0.000287"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.428548" elapsed="0.002090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.431204" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.430883" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.432096" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.431767" elapsed="0.000356"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.432172" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.432325" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.431416" elapsed="0.000933"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.432559" elapsed="0.000472"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.430752" elapsed="0.002321"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.414538" elapsed="0.018571"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.433154" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.433318" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:54.413386" elapsed="0.019958"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.413099" elapsed="0.020277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.433566" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.433401" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.413080" elapsed="0.020564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.434434" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.433784" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.434526" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.409570" elapsed="0.025081"/>
</kw>
<msg time="2026-05-01T00:43:54.434740" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.396498" elapsed="0.038291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.447555" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.460552" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.473246" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.473439" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.473629" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.473991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.473848" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:54.473834" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.474211" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.474376" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.474557" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:54.473805" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.473703" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.474779" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.474854" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:54.474972" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:54.392098" elapsed="0.082900"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.476229" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.475996" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.476430" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.475658" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.476787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.476543" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.477324" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.477032" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.476868" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.476524" elapsed="0.000882"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.479794" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.477574" elapsed="0.002247"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:54.479873" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.480028" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:54.475319" elapsed="0.004733"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.481300" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.481068" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.481471" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.480730" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:54.481707" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:54.481571" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.481553" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.481935" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.482106" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.482171" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:54.484338" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:54.480388" elapsed="0.003977"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.485769" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.485517" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.486213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.485969" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:54.501937" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:54.502857" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.12","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:43:54.503349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:54.488482" elapsed="0.014929"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.486323" elapsed="0.017218"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.503947" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.503603" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.486305" elapsed="0.017836"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.512848" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.12","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"route-key":"1:1:1::1/128","path-id":1,"prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"route-key":"1:1:1::1/128","path-id":1,"prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}}]},"peer-role":"ibgp"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"1:1:1::1/128","prefix":"1:1:1::1/128","attributes":{"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2:1:1:1::1"}}}]}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.506438" elapsed="0.006639"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.505954" elapsed="0.007159"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.505912" elapsed="0.007227"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.515769" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.513419" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.513197" elapsed="0.002654"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.513180" elapsed="0.002696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.516426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.516037" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.516775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.516541" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.517320" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.517024" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.516862" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.516523" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.517939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.517577" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.518264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.518036" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.518814" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.518521" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.518345" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.518018" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.519045" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:54.519842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.519564" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.520018" elapsed="0.002328"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:54.504985" elapsed="0.017425"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.522602" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.522495" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.522476" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:54.532030" level="INFO">${text_normalized} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.522816" elapsed="0.009258"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:54.532128" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:54.532291" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:54.484694" elapsed="0.047624"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.532381" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.532551" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:54.368906" elapsed="0.163672"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.532908" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.532663" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.532646" elapsed="0.000398"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.533078" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_rib</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:54.364446" elapsed="0.168759"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/bgp_rib</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>mapping=${mapping}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:54.360058" elapsed="0.173201"/>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="PASS" start="2026-05-01T00:43:54.269985" elapsed="0.263386"/>
</test>
<test id="s1-s5-t26" name="Delete_Injected_Ipv6_Routes_2" line="358">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:54.536573" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:54.536296" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.537830" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.537722" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.537704" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.542868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.542762" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.542744" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.543921" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.543544" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.544430" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:54.544128" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:54.544517" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.544674" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.543160" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.550385" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.550277" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.550258" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.551619" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.551510" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.551491" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:54.552142" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.551832" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.552554" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:54.552326" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.583039" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:54.553081" elapsed="0.030061"/>
</kw>
<msg time="2026-05-01T00:43:54.583305" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:54.583351" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.552741" elapsed="0.030647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.606794" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "6 "_ "R "o "u "t "e "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:54.583938" elapsed="0.022958"/>
</kw>
<msg time="2026-05-01T00:43:54.607055" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:54.607100" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.583584" elapsed="0.023587"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.607497" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.607252" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.607231" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.608050" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "6 "_ "R "o "u "t "e "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.607737" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.608400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.608186" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.608168" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:54.608530" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:54.610994" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:43:54.611194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.609938" elapsed="0.001384"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.611609" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.611956" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:54.609308" elapsed="0.002831"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:54.608784" elapsed="0.003418"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:54.551186" elapsed="0.061113"/>
</kw>
<msg time="2026-05-01T00:43:54.612389" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.612432" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.550623" elapsed="0.061868"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:54.612676" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:54.612570" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.612551" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.613150" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.613506" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.613579" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:54.549936" elapsed="0.063754"/>
</kw>
<msg time="2026-05-01T00:43:54.613782" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:54.613825" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "I "n "j "e "c "t "e "d "_ "I "p "v "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.545064" elapsed="0.068798"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.614184" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.613938" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.613921" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:54.544924" elapsed="0.069359"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:54.544751" elapsed="0.069561"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:54.542394" elapsed="0.071971"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:54.537411" elapsed="0.077007"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:54.536988" elapsed="0.077544"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:54.534022" elapsed="0.080567"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.615406" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.614770" elapsed="0.000665"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.659575" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.659176" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.660305" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:54.660095" elapsed="0.000275">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:54.660480" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:54.659763" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.661052" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:54.660670" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:54.661371" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_route_injection/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:54.661515" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:54.661238" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.661937" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.661695" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.662936" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.662672" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.663397" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.663138" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.664120" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.663819" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.664871" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.664661" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.664947" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.665097" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.664331" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.665271" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:54.663686" elapsed="0.001866"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.666089" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.665796" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.666981" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.666626" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.667091" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:54.667249" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.666299" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.667426" elapsed="0.000251"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:54.665665" elapsed="0.002053"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.668261" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.667966" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.669012" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.668807" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.669087" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.669237" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.668493" elapsed="0.000768"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.669410" elapsed="0.000238"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:54.667833" elapsed="0.001856"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.670226" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.669932" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.670980" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.670766" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.671056" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:54.671204" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.670436" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.671377" elapsed="0.000254"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:54.669801" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.672213" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.671917" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.672955" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.672750" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.673031" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.673179" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.672423" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.673352" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.671785" elapsed="0.001843"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.674163" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.673871" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.674912" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.674699" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.674988" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.675137" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.674372" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.675309" elapsed="0.000262"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:54.673741" elapsed="0.001882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.676166" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.675867" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.676912" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.676705" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.676987" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.677177" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.676376" elapsed="0.000826"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.677352" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.675737" elapsed="0.001897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.678357" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:54.677882" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:54.679109" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.678902" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:54.679184" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:54.679334" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:54.678587" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.679539" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:54.677746" elapsed="0.002058"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.663506" elapsed="0.016332"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:54.679881" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:43:54.680040" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:54.662339" elapsed="0.017727"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.662048" elapsed="0.018050"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.680270" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.680123" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.662030" elapsed="0.018316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.681155" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.680500" elapsed="0.000684"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.681233" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:54.658564" elapsed="0.022793"/>
</kw>
<msg time="2026-05-01T00:43:54.681411" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.645498" elapsed="0.035974"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.694135" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.706784" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.719530" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.719759" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.719934" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.720298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.720157" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:54.720143" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.720532" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.720700" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.720864" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:54.720114" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.720008" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.721086" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.721161" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:54.721281" level="INFO">${uri} = rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:54.641068" elapsed="0.080239"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.722403" level="INFO">rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.722156" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:54.734527" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 path_url=/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:54.734574" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=127.0.0.12/tables=bgp-types%3Aipv6-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv6-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:54.734662" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:54.724632" elapsed="0.010055"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.722532" elapsed="0.012194"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.734977" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.734752" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.722513" elapsed="0.012671"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.743313" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.737441" elapsed="0.005971"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.736960" elapsed="0.006563"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.736920" elapsed="0.006660"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.746335" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.743999" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.743705" elapsed="0.002709"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.743669" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.746989" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.746614" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.747335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.747086" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.747938" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.747640" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.747472" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.747069" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.748554" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.748179" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.748887" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.748650" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.749429" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.749138" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:54.748981" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.748633" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.749677" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:54.750449" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:54.750180" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.750643" elapsed="0.002360"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:54.736026" elapsed="0.017040"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:54.753111" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:54.755421" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:54.721587" elapsed="0.033874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:54.755517" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_route_injection</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:54.615714" elapsed="0.139927"/>
</kw>
<kw name="Fail If Exceptions Found During Test" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.756516" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.756391" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.756373" elapsed="0.000212"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.757357" level="INFO">${cmd} = sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2/d' /tmp/karaf-0.23.2/data/log/karaf.log</msg>
<var>${cmd}</var>
<arg>sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:54.757035" elapsed="0.000349"/>
</kw>
<kw name="Get Karaf Log Lines From Test Start" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:54.761721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:54.761614" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.761596" elapsed="0.000194"/>
</if>
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:54.763849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:54.763590" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:54.763571" elapsed="0.000358"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.764197" level="INFO">index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:43:54.764297" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:43:54.764077" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.764865" level="INFO">Attempting to execute command "sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2/d' /tmp/karaf-0.23.2/data/log/karaf.log" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:54.764486" elapsed="0.000426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.765502" level="INFO">${conn_id} = 9</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:43:54.765067" elapsed="0.000462"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:43:54.767514" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:43:54.767594" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:43:54.767198" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.767777" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:43:54.768960" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:43:55.092015" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:43:52 UTC 2026

  System load:  0.01               Processes:             127
  Usage of /:   11.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:43:53 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:43:54.768643" elapsed="0.323458"/>
</kw>
<msg time="2026-05-01T00:43:55.092163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.768267" elapsed="0.323956"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:43:54.765748" elapsed="0.326560"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.092692" level="INFO">Executing command 'sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2/d' /tmp/karaf-0.23.2/data/log/karaf.log'.</msg>
<msg time="2026-05-01T00:43:55.105482" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:55.105731" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:43:55.105829" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:55.092508" elapsed="0.013371"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:43:55.106240" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.107685" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.107090" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.108189" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.107934" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.107890" elapsed="0.000455"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:43:55.108726" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.108490" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.108428" elapsed="0.000487"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.108991" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.115431" elapsed="0.000227"/>
</kw>
<msg time="2026-05-01T00:43:55.115721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.114695" elapsed="0.001115"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.116041" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.116279" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:55.109705" elapsed="0.006692"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:43:54.763055" elapsed="0.353497"/>
</kw>
<msg time="2026-05-01T00:43:55.116631" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:54.762485" elapsed="0.354213"/>
</kw>
<msg time="2026-05-01T00:43:55.116853" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>${ip}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>${prompt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:43:54.761958" elapsed="0.354930"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:43:55.117630" level="INFO">@{log_lines} = [  ]</msg>
<var>@{log_lines}</var>
<arg>${output}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.117214" elapsed="0.000464"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-05-01T00:43:55.117750" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:43:55.117977" level="INFO">${output} = ['']</msg>
<var>${output}</var>
<arg>${ODL_SYSTEM_${i}_IP}</arg>
<arg>${test_name}</arg>
<arg>${cmd}</arg>
<doc>Scrapes all log messages that match regexp ${type} which fall after a point given by a log message that
contains bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2. This is useful if your test cases are marking karaf.log with a message indicating when
that test case has started; such that you can easily pull out any extra log messsages to parse/log/etc in the
test logic itself. For example, you can grab all ERRORS that occur during your test case.</doc>
<status status="PASS" start="2026-05-01T00:43:54.761082" elapsed="0.356932"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-05-01T00:43:55.118571" level="INFO">${exlist} = []</msg>
<msg time="2026-05-01T00:43:55.118638" level="INFO">${matchlist} = []</msg>
<var>${exlist}</var>
<var>${matchlist}</var>
<arg>${output}</arg>
<doc>Return a list of exceptions not in the whitelist for the given lines.</doc>
<status status="PASS" start="2026-05-01T00:43:55.118283" elapsed="0.000389"/>
</kw>
<kw name="Write Exceptions Map To File" owner="excepts">
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>/tmp/odl${i}_exceptions.txt</arg>
<doc>Write the exceptions map to a file under the testname header. The output
will include all lines in the exception itself as well as any previous
contextual warning or error lines. The output will be appended or overwritten
depending on the mode parameter. It is assumed that the caller has called
verify_exceptions() earlier to populate the exceptions map, otherwise only
the testname and header will be printed to the file.</doc>
<status status="PASS" start="2026-05-01T00:43:55.118932" elapsed="0.000438"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.120027" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:43:55.120136" level="INFO">${listlength} = 0</msg>
<var>${listlength}</var>
<arg>${exlist}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:43:55.119630" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${fail}&quot;==&quot;True&quot; and ${listlength} != 0">
<kw name="Log And Fail Exceptions" owner="KarafKeywords">
<arg>${exlist}</arg>
<arg>${listlength}</arg>
<doc>Print the list of failed exceptions and fail the test</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.120793" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.120274" elapsed="0.000608"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-05-01T00:43:55.121317" level="INFO">List is empty.</msg>
<arg>${matchlist}</arg>
<doc>Logs contents of the ``list`` using the given ``level``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.121125" elapsed="0.000255"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.120918" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.120247" elapsed="0.001233"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-05-01T00:43:54.756881" elapsed="0.364637"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-05-01T00:43:54.756623" elapsed="0.364952"/>
</for>
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>fail=${True}</arg>
<doc>Create a failure if an Exception is found in the karaf.log that has not been whitelisted.
Will work for single controller jobs as well as 3node cluster jobs</doc>
<status status="PASS" start="2026-05-01T00:43:54.755992" elapsed="0.365668"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="PASS" start="2026-05-01T00:43:54.533583" elapsed="0.588235"/>
</test>
<test id="s1-s5-t27" name="Delete_App_Peer" line="375">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:55.126575" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:55.126295" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.127829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.127720" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.127701" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.133073" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.132967" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.132950" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.134160" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.133775" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.134661" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:55.134346" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:55.134731" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.134891" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.133365" elapsed="0.001550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.140446" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.140338" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.140319" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.141713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.141606" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.141588" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:55.142269" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.141966" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.142692" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.142476" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.171625" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:55.143213" elapsed="0.028519"/>
</kw>
<msg time="2026-05-01T00:43:55.171896" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:55.171943" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.142878" elapsed="0.029102"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.208104" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:55.172515" elapsed="0.035697"/>
</kw>
<msg time="2026-05-01T00:43:55.208391" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:55.208483" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.172152" elapsed="0.036382"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.208854" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.208619" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.208598" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.209399" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.209077" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.209770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.209551" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.209532" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:55.209888" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.212366" elapsed="0.000162"/>
</kw>
<msg time="2026-05-01T00:43:55.212589" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.211308" elapsed="0.001411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.212991" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.213335" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:55.210694" elapsed="0.002852"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:55.210150" elapsed="0.003461"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:55.141259" elapsed="0.072448"/>
</kw>
<msg time="2026-05-01T00:43:55.213798" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.213845" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.140683" elapsed="0.073203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:55.214069" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.213962" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.213943" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.214571" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.214953" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.215026" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:55.140002" elapsed="0.075134"/>
</kw>
<msg time="2026-05-01T00:43:55.215228" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.215272" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.135281" elapsed="0.080030"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.215660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.215387" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.215369" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:55.135140" elapsed="0.080624"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:55.134970" elapsed="0.080822"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:55.132610" elapsed="0.083237"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:55.127417" elapsed="0.088484"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.126993" elapsed="0.088952"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:55.122883" elapsed="0.093114"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.216872" level="INFO">&amp;{mapping} = { IP=127.0.0.12 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.12</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.216178" elapsed="0.000723"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.260726" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.260332" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.261502" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.261266" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.261669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.260920" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.262246" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.261855" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.262586" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/application_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:55.262718" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:55.262433" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.263144" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.262901" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.264192" level="INFO">mapping: {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.263934" elapsed="0.000341"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.264720" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.264437" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.265430" level="INFO">${value} = 127.0.0.12</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.265129" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.266188" level="INFO">${encoded} = 127.0.0.12</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.265977" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.266263" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.266414" level="INFO">${encoded_value} = 127.0.0.12</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.265661" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.266606" elapsed="0.000229"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-05-01T00:43:55.264971" elapsed="0.001905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.267414" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.267119" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.268162" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.267954" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.268237" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.268386" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.267641" elapsed="0.000769"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.268576" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:55.266988" elapsed="0.001847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.269383" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.269088" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.270132" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.269920" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.270208" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:55.270359" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.269607" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.270549" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:55.268948" elapsed="0.001870"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.271587" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.271092" elapsed="0.000522"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.272320" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.272114" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.272394" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:55.272563" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.271802" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.272737" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:55.270958" elapsed="0.002053"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.273568" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.273256" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.274300" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.274093" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.274374" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.274542" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.273781" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.274757" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.273125" elapsed="0.001897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.275581" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.275267" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.276307" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.276101" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.276381" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.276548" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.275791" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.276723" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:55.275136" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.277565" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.277255" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.278293" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.278087" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.278368" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.278536" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.277776" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.278710" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.277123" elapsed="0.001845"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.279524" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.279213" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.280252" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.280044" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.280327" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.280491" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.279735" elapsed="0.000782"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.280666" elapsed="0.000219"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.279082" elapsed="0.001843"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:55.264793" elapsed="0.016180"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:55.281018" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:55.281179" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:55.263610" elapsed="0.017594"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.263261" elapsed="0.017975"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.281408" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.281261" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.263240" elapsed="0.018260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.282322" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.281643" elapsed="0.000707"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.282399" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.259712" elapsed="0.022827"/>
</kw>
<msg time="2026-05-01T00:43:55.282630" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.246492" elapsed="0.036186"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.295638" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.308339" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.321160" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.321385" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.321579" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.321980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.321830" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:55.321814" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.322205" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.322369" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.322550" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:55.321780" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.321659" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.322779" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.322857" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:43:55.323003" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:55.242086" elapsed="0.080946"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.324224" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.323942" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:55.345554" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:55.345720" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.12 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:55.345895" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:55.326477" elapsed="0.019444"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.324340" elapsed="0.021622"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.346141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.345988" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.324322" elapsed="0.021901"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.349661" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.347237" elapsed="0.002467"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.347018" elapsed="0.002721"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.347001" elapsed="0.002763"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.352340" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.350036" elapsed="0.002349"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.349819" elapsed="0.002600"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.349803" elapsed="0.002640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.353034" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.352630" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.353365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.353131" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.353922" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.353626" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.353446" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.353114" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.354538" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.354163" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.354862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.354634" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.355391" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.355099" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.354942" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.354616" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.355637" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:55.356445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.356152" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.356660" elapsed="0.002501"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:55.346612" elapsed="0.012612"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:55.359270" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:43:55.361581" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:55.323322" elapsed="0.038286"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.361663" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/application_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:55.217141" elapsed="0.144646"/>
</kw>
<doc>Deletes bgp application peer.</doc>
<status status="PASS" start="2026-05-01T00:43:55.122186" elapsed="0.239719"/>
</test>
<test id="s1-s5-t28" name="Delete_Bgp_Peer_Configuration_5" line="392">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:55.365310" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:55.365048" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.366625" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.366513" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.366493" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.371690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.371584" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.371567" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.372759" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.372352" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.373236" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:55.372944" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:55.373306" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.373475" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.371979" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.379198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.379089" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.379071" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.380419" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.380313" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.380295" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:55.380979" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.380682" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.381376" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.381162" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.411760" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:55.381916" elapsed="0.029945"/>
</kw>
<msg time="2026-05-01T00:43:55.412023" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:55.412069" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.381583" elapsed="0.030523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.436897" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:55.412649" elapsed="0.024350"/>
</kw>
<msg time="2026-05-01T00:43:55.437158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:55.437202" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.412275" elapsed="0.024964"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.437556" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.437315" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.437296" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.438077" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.437779" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.438423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.438211" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.438194" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:55.438585" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.441146" elapsed="0.000139"/>
</kw>
<msg time="2026-05-01T00:43:55.441347" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.440050" elapsed="0.001445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.441770" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.442103" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:55.439379" elapsed="0.002907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:55.438854" elapsed="0.003496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:55.380013" elapsed="0.062433"/>
</kw>
<msg time="2026-05-01T00:43:55.442561" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.442605" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.379416" elapsed="0.063226"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:55.442824" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.442718" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.442700" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.443301" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.443656" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.443728" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:55.378747" elapsed="0.065089"/>
</kw>
<msg time="2026-05-01T00:43:55.443932" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.443976" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.373879" elapsed="0.070133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.444351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.444088" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.444071" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:55.373737" elapsed="0.070729"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:55.373556" elapsed="0.070941"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:55.371214" elapsed="0.073338"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:55.366208" elapsed="0.078398"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.365779" elapsed="0.078872"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:55.362831" elapsed="0.081871"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.445591" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV4_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.444887" elapsed="0.000733"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.489371" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.488996" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.490197" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.489953" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.490368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.489616" elapsed="0.000777"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.490950" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.490569" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.491274" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:55.491423" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:55.491138" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.491860" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.491620" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.492867" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.492609" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.493328" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.493069" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.494024" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.493725" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.494783" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.494565" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.494859" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.495011" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.494235" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.495185" elapsed="0.000229"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:43:55.493590" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.496018" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.495723" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.496930" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.496576" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.497006" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.497158" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.496246" elapsed="0.000936"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.497336" elapsed="0.000240"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:55.495585" elapsed="0.002031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.498159" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.497863" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.498904" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.498697" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.498980" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.499129" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.498370" elapsed="0.000783"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.499353" elapsed="0.000241"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:55.497730" elapsed="0.001905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.500203" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.499881" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.500961" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.500748" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.501037" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:55.501188" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.500416" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.501368" elapsed="0.000238"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:55.499749" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.502197" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.501902" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.502947" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.502736" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.503023" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.503172" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.502408" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.503344" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.501760" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.504181" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.503875" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.504938" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.504730" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.505013" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:55.505168" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.504392" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.505340" elapsed="0.000238"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:55.503734" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.506158" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.505864" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.506923" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.506709" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.506999" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:43:55.507153" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.506367" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.507324" elapsed="0.000236"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.505733" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.508330" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.507847" elapsed="0.000509"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:55.509085" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.508876" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:55.509160" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.509312" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:55.508562" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.509577" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:55.507715" elapsed="0.002126"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:55.493400" elapsed="0.016475"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:55.509918" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:55.510077" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:55.492276" elapsed="0.017827"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.491973" elapsed="0.018161"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.510305" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.510158" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.491954" elapsed="0.018426"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.511213" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.510535" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.511290" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.488369" elapsed="0.023044"/>
</kw>
<msg time="2026-05-01T00:43:55.511483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.475239" elapsed="0.036292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.524335" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.536980" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.549755" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.549951" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.550125" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.550502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.550344" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:55.550329" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.550726" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.550892" elapsed="0.000050"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.551093" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:55.550300" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.550199" elapsed="0.000974"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.551317" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.551393" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:55.551531" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:55.470841" elapsed="0.080717"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.552665" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.552402" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:55.575832" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:55.575880" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:55.575969" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:55.554855" elapsed="0.021139"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.552778" elapsed="0.023256"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.576209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.576059" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.552760" elapsed="0.023531"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.579917" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.577302" elapsed="0.002659"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.577071" elapsed="0.002926"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.577053" elapsed="0.002970"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.582630" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.580300" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.580079" elapsed="0.002630"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.580062" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.583261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.582895" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.583606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.583357" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.584170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.583873" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.583688" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.583340" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.584785" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.584411" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.585152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.584915" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.585706" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.585394" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.585233" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.584896" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.585943" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:55.586736" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.586448" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.586916" elapsed="0.002314"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:55.576671" elapsed="0.012623"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:55.589339" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:55.591627" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:43:55.551820" elapsed="0.039834"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.591707" elapsed="0.000038"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:43:55.445859" elapsed="0.145983"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:43:55.362221" elapsed="0.229733"/>
</test>
<test id="s1-s5-t29" name="Verify_Ipv6_Topology_Empty_5" line="405">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:55.595278" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:55.595018" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.596570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.596444" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.596426" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.601614" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.601508" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.601490" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.602661" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.602270" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.603137" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:55.602847" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:55.603207" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:55.603359" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.601902" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.611480" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.611351" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.611332" elapsed="0.000229"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.612800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.612694" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.612676" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:55.613327" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.613016" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.613748" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.613531" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.649305" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:55.614338" elapsed="0.035067"/>
</kw>
<msg time="2026-05-01T00:43:55.649587" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:55.649634" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.614004" elapsed="0.035666"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.676886" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:55.650179" elapsed="0.026810"/>
</kw>
<msg time="2026-05-01T00:43:55.677145" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:55.677191" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.649839" elapsed="0.027388"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.677547" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.677303" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.677284" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.678060" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "y "_ "E "m "p "t "y "_ "5 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.677768" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.678406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.678194" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.678176" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:55.678536" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.681095" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:43:55.681295" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.679973" elapsed="0.001456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.681714" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.682048" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:55.679322" elapsed="0.002909"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:55.678802" elapsed="0.003491"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:55.612369" elapsed="0.070019"/>
</kw>
<msg time="2026-05-01T00:43:55.682499" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.682544" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.611742" elapsed="0.070838"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:55.682761" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.682656" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.682638" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.683236" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.683616" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.683690" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:55.610937" elapsed="0.072859"/>
</kw>
<msg time="2026-05-01T00:43:55.683930" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.683973" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "V "e "r "i "f "y "_ "I "p "v "6 "_ "T "o "p "o "l "o "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.603783" elapsed="0.080226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.684329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.684084" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.684067" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:55.603620" elapsed="0.080810"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:55.603435" elapsed="0.081091"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:55.601139" elapsed="0.083443"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:55.596161" elapsed="0.088474"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.595726" elapsed="0.088951"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:55.592823" elapsed="0.091904"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.737094" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.736721" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.737880" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.737630" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.738044" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.737285" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.738625" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.738231" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.738947" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:55.739084" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:55.738813" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.739537" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.739277" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.740560" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.740265" elapsed="0.000340"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.741030" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.740764" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.741367" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.741595" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.741767" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:43:55.741236" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.741103" elapsed="0.000750"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:55.741895" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:55.742098" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:55.739946" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.739650" elapsed="0.002505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.742328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.742180" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.739631" elapsed="0.002773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.743000" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.742562" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.743076" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.736098" elapsed="0.007115"/>
</kw>
<msg time="2026-05-01T00:43:55.743266" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.723094" elapsed="0.020220"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.756326" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.769032" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.781801" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.781998" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.782171" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.782555" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.782388" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:55.782374" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.782778" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.782943" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.783136" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:55.782345" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.782244" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.783359" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.783484" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:43:55.783606" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:55.718738" elapsed="0.064894"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.784865" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.784631" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.785019" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.784278" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.785356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.785114" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.785904" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.785616" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.785437" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.785096" elapsed="0.000890"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.788390" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.786137" elapsed="0.002280"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:55.788482" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:55.788638" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:55.783956" elapsed="0.004707"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.789873" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.789641" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.790028" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.789287" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:43:55.790257" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.790123" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.790104" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.790500" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.790672" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.790738" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:55.792864" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:55.788967" elapsed="0.003924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.794279" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.794031" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.794732" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.794490" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:55.804714" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:55.804909" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv6-topology 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:43:55.805062" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:55.796997" elapsed="0.008101"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.794841" elapsed="0.010317"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.805409" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.805195" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.794824" elapsed="0.010728"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.810438" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv6-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv6-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.806976" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.806650" elapsed="0.003924"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.806624" elapsed="0.003985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.814274" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.811014" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.810687" elapsed="0.003698"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.810665" elapsed="0.003755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.815257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.814699" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.815743" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.815393" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.816314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.816018" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.815858" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.815368" elapsed="0.001029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.816931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.816570" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.817258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.817027" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.817806" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.817514" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.817338" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.817010" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.818036" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:55.818829" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.818552" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.819021" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:55.806040" elapsed="0.015377"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.821610" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.821503" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.821484" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:55.824702" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.821824" elapsed="0.002907"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:43:55.824782" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:55.824979" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:55.793203" elapsed="0.031803"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.825070" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:43:55.825222" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:55.695853" elapsed="0.129395"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.854029" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.853589" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.854847" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:55.854574" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:55.855145" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:55.854220" elapsed="0.000952"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.855791" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.855336" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:55.856134" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:55.856260" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:55.855978" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.856724" level="INFO">{
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv6-reachability-topology": {}
            }
        }
    ]
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.856441" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:55.857253" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.856842" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.857998" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:55.857503" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.857340" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.856820" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.858727" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:55.858230" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.858806" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.852955" elapsed="0.005981"/>
</kw>
<msg time="2026-05-01T00:43:55.859022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.839909" elapsed="0.019164"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.872076" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.884783" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.897602" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.897794" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.897971" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.898336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.898192" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:55.898178" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.898592" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.898762" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.898927" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:55.898149" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.898046" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.899149" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.899225" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:43:55.899344" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-id": "example-ipv6-topology",...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:55.837187" elapsed="0.062183"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.899557" elapsed="0.002272"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:55.902875" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.902581" elapsed="0.000322"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:43:55.903377" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv6-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:43:55.903092" elapsed="0.000313"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:43:55.903576" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:43:55.902151" elapsed="0.001811"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.901913" elapsed="0.002082"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.904168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.904021" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.901895" elapsed="0.002348"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:43:55.826380" elapsed="0.077909"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:43:55.825587" elapsed="0.078775"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:55.825332" elapsed="0.079074"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.825315" elapsed="0.079114"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:55.904479" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:43:55.689648" elapsed="0.214959"/>
</kw>
<arg>5x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:55.685138" elapsed="0.219523"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-05-01T00:43:55.684863" elapsed="0.219859"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:55.592216" elapsed="0.312601"/>
</test>
<test id="s1-s5-t30" name="Stop_All_Exabgps_2" line="410">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:55.908118" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:55.907859" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.909353" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.909245" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.909227" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.914611" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.914503" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.914484" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.915670" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:55.915275" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.916154" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:55.915856" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:55.916225" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:55.916379" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.914902" elapsed="0.001501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.921948" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.921842" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.921823" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.923187" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:55.923077" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.923059" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:55.923753" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:55.923398" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.924148" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.923938" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.957340" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:55.924681" elapsed="0.032786"/>
</kw>
<msg time="2026-05-01T00:43:55.957630" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:55.957676" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.924332" elapsed="0.033381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.980329" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:55.958224" elapsed="0.022203"/>
</kw>
<msg time="2026-05-01T00:43:55.980604" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:55.980648" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "2 "[K...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.957886" elapsed="0.022799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.980994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.980770" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.980750" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:55.981519" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:55.981211" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.981863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.981651" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.981633" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:55.981973" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:55.984477" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:43:55.984681" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:55.983401" elapsed="0.001409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.985080" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.985409" elapsed="0.000093"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:55.982795" elapsed="0.002818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:55.982251" elapsed="0.003427"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:55.922775" elapsed="0.062999"/>
</kw>
<msg time="2026-05-01T00:43:55.985864" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.985908" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "2 "[K...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.922168" elapsed="0.063777"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:55.986306" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:55.986021" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.986002" elapsed="0.000400"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.986825" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.987169" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:55.987277" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:55.921507" elapsed="0.065882"/>
</kw>
<msg time="2026-05-01T00:43:55.987496" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:55.987541" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "2 "[K...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.916780" elapsed="0.070798"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:55.987905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:55.987654" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:55.987637" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:55.916638" elapsed="0.071367"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:55.916468" elapsed="0.071566"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:55.914123" elapsed="0.073963"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:55.908962" elapsed="0.079178"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:55.908543" elapsed="0.079640"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:55.905633" elapsed="0.082600"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:55.997345" level="INFO">Executing command 'cat exaipv4.log'.</msg>
<msg time="2026-05-01T00:43:56.010222" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:56.010359" level="INFO">${output_log} = 00:43:48 | 3690   | welcome         | Thank you for using ExaBGP
00:43:48 | 3690   | version         | 4.2.4
00:43:48 | 3690   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:55.997204" elapsed="0.013192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.011017" level="INFO">00:43:48 | 3690   | welcome         | Thank you for using ExaBGP
00:43:48 | 3690   | version         | 4.2.4
00:43:48 | 3690   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00:43:48 | 3690   | os              | Linux releng-26932-215-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
00:43:48 | 3690   | installation    | /tmp/defaultvenv
00:43:48 | 3690   | advice          | environment file missing
00:43:48 | 3690   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:43:48 | 3690   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:43:48 | 3690   | cli             | we scanned the following folders (the number is your PID):
00:43:48 | 3690   | cli control     |  - /run/exabgp/
00:43:48 | 3690   | cli control     |  - /run/1001/
00:43:48 | 3690   | cli control     |  - /run/
00:43:48 | 3690   | cli control     |  - /var/run/exabgp/
00:43:48 | 3690   | cli control     |  - /var/run/1001/
00:43:48 | 3690   | cli control     |  - /var/run/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/1001/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/
00:43:48 | 3690   | cli control     | please make them in one of the folder with the following commands:
00:43:48 | 3690   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | configuration   | performing reload of exabgp 4.2.4
00:43:48 | 3690   | configuration   | &gt; neighbor         | '10.30.170.185'
00:43:48 | 3690   | configuration   | . router-id        | '127.0.0.1'
00:43:48 | 3690   | configuration   | . local-address    | '127.0.0.1'
00:43:48 | 3690   | configuration   | . local-as         | '64496'
00:43:48 | 3690   | configuration   | . peer-as          | '64496'
00:43:48 | 3690   | configuration   | &gt; family           | 
00:43:48 | 3690   | configuration   | . ipv4             | 'unicast'
00:43:48 | 3690   | configuration   | &lt; family           | 
00:43:48 | 3690   | configuration   | &lt; neighbor         | 
00:43:48 | 3690   | reactor         | new peer: neighbor 10.30.170.185 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
00:43:48 | 3690   | reactor         | loaded new configuration successfully
00:43:48 | 3690   | reactor         | initialising connection to peer-1
00:43:48 | 3690   | outgoing-1      | attempting connection to 10.30.170.185:1790
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:48 | 3690   | outgoing-1      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 60 second(s) left
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01
00:43:48 | 3690   | outgoing-1      | received TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type OPEN
00:43:48 | 3690   | outgoing-1      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:48 | 3690   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 180 second(s) left
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:43:48 | 3690   | reactor         | connected to peer-1 with outgoing-1 127.0.0.1-10.30.170.185
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:43:48 | 3690   | outgoing-1      | &gt;&gt; EOR ipv4 unicast
00:43:48 | 3690   | peer-1          | &gt;&gt; EOR(s)
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:48 | 3690   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:48 | 3690   | parser          | parsing UPDATE (   4) 0000 0000
00:43:48 | 3690   | peer-1          | &lt;&lt; UPDATE #1
00:43:48 | 3690   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 179 second(s) left
00:43:48 | 3690   | ka-outgoing-1   | send-timer 59 second(s) left
00:43:49 | 3690   | ka-outgoing-1   | receive-timer 178 second(s) left
00:43:49 | 3690   | ka-outgoing-1   | send-timer 58 second(s) left
00:43:50 | 3690   | ka-outgoing-1   | receive-timer 177 second(s) left
00:43:50 | 3690   | ka-outgoing-1   | send-timer 57 second(s) left
00:43:51 | 3690   | ka-outgoing-1   | receive-timer 176 second(s) left
00:43:51 | 3690   | ka-outgoing-1   | send-timer 56 second(s) left
00:43:52 | 3690   | ka-outgoing-1   | receive-timer 175 second(s) left
00:43:52 | 3690   | ka-outgoing-1   | send-timer 55 second(s) left
00:43:53 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:53 | 3690   | outgoing-1      | received TCP payload (   2) 0600
00:43:53 | 3690   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:43:53 | 3690   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:53 | 3690   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.185, closing connection
00:43:53 | 3690   | reactor         | initialising connection to peer-1
00:43:53 | 3690   | outgoing-2      | attempting connection to 10.30.170.185:1790
00:43:53 | 3690   | outgoing-2      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:53 | 3690   | outgoing-2      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:53 | 3690   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:53 | 3690   | outgoing-2      | received TCP payload (   2) 0605
00:43:53 | 3690   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:43:53 | 3690   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:43:53 | 3690   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.185, closing connection
00:43:54 | 3690   | reactor         | initialising connection to peer-1
00:43:54 | 3690   | outgoing-3      | attempting connection to 10.30.170.185:1790
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:54 | 3690   | outgoing-3      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:54 | 3690   | outgoing-3      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 00B4 4700
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type OPEN
00:43:54 | 3690   | outgoing-3      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 60 second(s) left
00:43:54 | 3690   | outgoing-3      | --------------------------------------------------------------------
00:43:54 | 3690   | outgoing-3      | the connection can not carry the following family/families
00:43:54 | 3690   | outgoing-3      |  - exabgp is not configured for ipv6/unicast
00:43:54 | 3690   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:43:54 | 3690   | outgoing-3      | --------------------------------------------------------------------
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:54 | 3690   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 180 second(s) left
00:43:54 | 3690   | reactor         | connected to peer-1 with outgoing-3 127.0.0.1-10.30.170.185
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:43:54 | 3690   | outgoing-3      | &gt;&gt; EOR ipv4 unicast
00:43:54 | 3690   | peer-1          | &gt;&gt; EOR(s)
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:54 | 3690   | outgoing-3      | received TCP payload (   4) 0000 0000
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type UPDATE
00:43:54 | 3690   | parser          | parsing UPDATE (   4) 0000 0000
00:43:54 | 3690   | peer-1          | &lt;&lt; UPDATE #1
00:43:54 | 3690   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 179 second(s) left
00:43:54 | 3690   | ka-outgoing-3   | send-timer 59 second(s) left
00:43:55 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:55 | 3690   | outgoing-3      | received TCP payload (   2) 0600
00:43:55 | 3690   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:43:55 | 3690   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:55 | 3690   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.185, closing connection</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.010648" elapsed="0.000630"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.012049" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv4.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv4.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:43:56.011560" elapsed="0.000567"/>
</kw>
<arg>${EXABGP2_LOG}</arg>
<arg>${EXABGP2_LOG}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:55.996823" elapsed="0.015387"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.013074" level="INFO">[?2004l</msg>
<msg time="2026-05-01T00:43:56.013181" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:43:56.012927" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.013785" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.013423" elapsed="0.000425"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.014973" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.014549" elapsed="0.000461"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.015220" elapsed="0.000284"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:43:56.014155" elapsed="0.001432"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.172125" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:56.172237" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:56.015795" elapsed="0.156469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.172696" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.172424" elapsed="0.000318"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.174433" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.173346" elapsed="0.001154"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.175477" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:56.175562" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:56.174656" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.176168" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.175910" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.175656" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.175637" elapsed="0.000634"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:43:56.172990" elapsed="0.003327"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:43:56.012546" elapsed="0.163820"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.176686" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv4.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exaipv4.log&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:56.176840" level="INFO">${Log_Content} = 00:43:48 | 3690   | welcome         | Thank you for using ExaBGP
00:43:48 | 3690   | version         | 4.2.4
00:43:48 | 3690   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00...</msg>
<var>${Log_Content}</var>
<arg>${EXABGP2_LOG}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:56.176532" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.177281" level="INFO">00:43:48 | 3690   | welcome         | Thank you for using ExaBGP
00:43:48 | 3690   | version         | 4.2.4
00:43:48 | 3690   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00:43:48 | 3690   | os              | Linux releng-26932-215-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
00:43:48 | 3690   | installation    | /tmp/defaultvenv
00:43:48 | 3690   | advice          | environment file missing
00:43:48 | 3690   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:43:48 | 3690   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:43:48 | 3690   | cli             | we scanned the following folders (the number is your PID):
00:43:48 | 3690   | cli control     |  - /run/exabgp/
00:43:48 | 3690   | cli control     |  - /run/1001/
00:43:48 | 3690   | cli control     |  - /run/
00:43:48 | 3690   | cli control     |  - /var/run/exabgp/
00:43:48 | 3690   | cli control     |  - /var/run/1001/
00:43:48 | 3690   | cli control     |  - /var/run/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/1001/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/run/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:43:48 | 3690   | cli control     |  - /tmp/defaultvenv/var/run/
00:43:48 | 3690   | cli control     | please make them in one of the folder with the following commands:
00:43:48 | 3690   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:43:48 | 3690   | configuration   | performing reload of exabgp 4.2.4
00:43:48 | 3690   | configuration   | &gt; neighbor         | '10.30.170.185'
00:43:48 | 3690   | configuration   | . router-id        | '127.0.0.1'
00:43:48 | 3690   | configuration   | . local-address    | '127.0.0.1'
00:43:48 | 3690   | configuration   | . local-as         | '64496'
00:43:48 | 3690   | configuration   | . peer-as          | '64496'
00:43:48 | 3690   | configuration   | &gt; family           | 
00:43:48 | 3690   | configuration   | . ipv4             | 'unicast'
00:43:48 | 3690   | configuration   | &lt; family           | 
00:43:48 | 3690   | configuration   | &lt; neighbor         | 
00:43:48 | 3690   | reactor         | new peer: neighbor 10.30.170.185 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
00:43:48 | 3690   | reactor         | loaded new configuration successfully
00:43:48 | 3690   | reactor         | initialising connection to peer-1
00:43:48 | 3690   | outgoing-1      | attempting connection to 10.30.170.185:1790
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:48 | 3690   | outgoing-1      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 60 second(s) left
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01
00:43:48 | 3690   | outgoing-1      | received TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type OPEN
00:43:48 | 3690   | outgoing-1      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:48 | 3690   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 180 second(s) left
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:43:48 | 3690   | reactor         | connected to peer-1 with outgoing-1 127.0.0.1-10.30.170.185
00:43:48 | 3690   | outgoing-1      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:43:48 | 3690   | outgoing-1      | &gt;&gt; EOR ipv4 unicast
00:43:48 | 3690   | peer-1          | &gt;&gt; EOR(s)
00:43:48 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:48 | 3690   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:48 | 3690   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:48 | 3690   | parser          | parsing UPDATE (   4) 0000 0000
00:43:48 | 3690   | peer-1          | &lt;&lt; UPDATE #1
00:43:48 | 3690   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:48 | 3690   | ka-outgoing-1   | receive-timer 179 second(s) left
00:43:48 | 3690   | ka-outgoing-1   | send-timer 59 second(s) left
00:43:49 | 3690   | ka-outgoing-1   | receive-timer 178 second(s) left
00:43:49 | 3690   | ka-outgoing-1   | send-timer 58 second(s) left
00:43:50 | 3690   | ka-outgoing-1   | receive-timer 177 second(s) left
00:43:50 | 3690   | ka-outgoing-1   | send-timer 57 second(s) left
00:43:51 | 3690   | ka-outgoing-1   | receive-timer 176 second(s) left
00:43:51 | 3690   | ka-outgoing-1   | send-timer 56 second(s) left
00:43:52 | 3690   | ka-outgoing-1   | receive-timer 175 second(s) left
00:43:52 | 3690   | ka-outgoing-1   | send-timer 55 second(s) left
00:43:53 | 3690   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:53 | 3690   | outgoing-1      | received TCP payload (   2) 0600
00:43:53 | 3690   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:43:53 | 3690   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:53 | 3690   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.185, closing connection
00:43:53 | 3690   | reactor         | initialising connection to peer-1
00:43:53 | 3690   | outgoing-2      | attempting connection to 10.30.170.185:1790
00:43:53 | 3690   | outgoing-2      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:53 | 3690   | outgoing-2      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:53 | 3690   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:53 | 3690   | outgoing-2      | received TCP payload (   2) 0605
00:43:53 | 3690   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:43:53 | 3690   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:43:53 | 3690   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.185, closing connection
00:43:54 | 3690   | reactor         | initialising connection to peer-1
00:43:54 | 3690   | outgoing-3      | attempting connection to 10.30.170.185:1790
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 7F00 0001 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00
00:43:54 | 3690   | outgoing-3      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=127.0.0.1 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)]
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:54 | 3690   | outgoing-3      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 00B4 4700
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type OPEN
00:43:54 | 3690   | outgoing-3      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71]
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 60 second(s) left
00:43:54 | 3690   | outgoing-3      | --------------------------------------------------------------------
00:43:54 | 3690   | outgoing-3      | the connection can not carry the following family/families
00:43:54 | 3690   | outgoing-3      |  - exabgp is not configured for ipv6/unicast
00:43:54 | 3690   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:43:54 | 3690   | outgoing-3      | --------------------------------------------------------------------
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:54 | 3690   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 180 second(s) left
00:43:54 | 3690   | reactor         | connected to peer-1 with outgoing-3 127.0.0.1-10.30.170.185
00:43:54 | 3690   | outgoing-3      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:43:54 | 3690   | outgoing-3      | &gt;&gt; EOR ipv4 unicast
00:43:54 | 3690   | peer-1          | &gt;&gt; EOR(s)
00:43:54 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:54 | 3690   | outgoing-3      | received TCP payload (   4) 0000 0000
00:43:54 | 3690   | outgoing-3      | &lt;&lt; message of type UPDATE
00:43:54 | 3690   | parser          | parsing UPDATE (   4) 0000 0000
00:43:54 | 3690   | peer-1          | &lt;&lt; UPDATE #1
00:43:54 | 3690   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:54 | 3690   | ka-outgoing-3   | receive-timer 179 second(s) left
00:43:54 | 3690   | ka-outgoing-3   | send-timer 59 second(s) left
00:43:55 | 3690   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:43:55 | 3690   | outgoing-3      | received TCP payload (   2) 0600
00:43:55 | 3690   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:43:55 | 3690   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:43:55 | 3690   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.185, closing connection</msg>
<arg>${Log_Content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.177038" elapsed="0.000444"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-05-01T00:43:55.905101" elapsed="0.272508"/>
</test>
<test id="s1-s5-t31" name="Reconfigure_ODL_To_Accept_Connections_6" line="417">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:56.181144" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:56.180880" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.182400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.182292" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.182273" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.187564" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.187443" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.187426" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.188629" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.188232" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.189107" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:56.188814" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:56.189176" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:56.189331" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:56.187858" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.194935" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.194828" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.194809" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.196141" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.196035" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.196017" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:56.196673" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.196353" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.197070" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:56.196856" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.228481" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.197615" elapsed="0.030966"/>
</kw>
<msg time="2026-05-01T00:43:56.228739" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:56.228784" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.197255" elapsed="0.031566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.257033" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:56.229327" elapsed="0.027814"/>
</kw>
<msg time="2026-05-01T00:43:56.257312" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:56.257358" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.228994" elapsed="0.028401"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.257714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.257493" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.257471" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.258231" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "_ "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.257936" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.258650" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.258407" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.258388" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:56.258762" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:56.261199" elapsed="0.000167"/>
</kw>
<msg time="2026-05-01T00:43:56.261427" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.260162" elapsed="0.001411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.261847" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.262177" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:56.259560" elapsed="0.002800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:56.259017" elapsed="0.003407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:56.195735" elapsed="0.066809"/>
</kw>
<msg time="2026-05-01T00:43:56.262635" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:56.262679" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.195155" elapsed="0.067561"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:56.262899" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:43:56.262792" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.262774" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.263371" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.263722" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.263794" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:56.194493" elapsed="0.069409"/>
</kw>
<msg time="2026-05-01T00:43:56.263994" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:56.264036" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.189761" elapsed="0.074312"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.264395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.264147" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.264130" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:56.189619" elapsed="0.074892"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:56.189409" elapsed="0.075131"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:56.187085" elapsed="0.077509"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:56.182008" elapsed="0.082640"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.181587" elapsed="0.083105"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:56.178478" elapsed="0.086266"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.265639" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:0011:0000:0000:0000:0002 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=ex...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.264924" elapsed="0.000744"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.300179" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.299803" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.300950" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:56.300717" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:56.301112" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:56.300368" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.301712" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.301313" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.302033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:56.302165" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:56.301899" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.302606" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.302344" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.303606" level="INFO">mapping: {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.303329" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.304070" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.303807" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.304765" level="INFO">${value} = 2607:f0d0:1002:0011:0000:0000:0000:0002</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.304463" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.305542" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.305311" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.305617" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:43:56.305773" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.304977" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.305947" elapsed="0.000231"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-05-01T00:43:56.304317" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.306784" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.306483" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.307542" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.307316" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.307618" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.307768" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.306997" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.307946" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:43:56.306334" elapsed="0.001874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.308803" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.308467" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.309739" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.309527" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.309816" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:56.309968" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.309016" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.310143" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:43:56.308322" elapsed="0.002084"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.310967" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.310670" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.311719" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.311509" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.311794" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.311949" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.311180" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.312122" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:43:56.310535" elapsed="0.001845"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.312948" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.312647" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.313736" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.313526" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.313810" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.313964" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.313172" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.314136" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:56.312515" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.314954" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.314655" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.315708" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.315499" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.315782" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.315932" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.315161" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.316103" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:43:56.314523" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.316933" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.316634" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.317705" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.317492" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.317779" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.317928" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.317157" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.318102" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:56.316503" elapsed="0.001858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.318960" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:43:56.318622" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:43:56.320915" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.319504" elapsed="0.001438"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:43:56.320995" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:56.321176" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:43:56.319172" elapsed="0.002030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.321355" elapsed="0.000248"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:43:56.318491" elapsed="0.003153"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:43:56.304141" elapsed="0.017538"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:43:56.321723" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:56.321885" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:43:56.303012" elapsed="0.018900"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.302717" elapsed="0.019227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.322117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.321969" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.302699" elapsed="0.019495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.323032" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.322335" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:56.323110" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:56.299172" elapsed="0.024063"/>
</kw>
<msg time="2026-05-01T00:43:56.323291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.286148" elapsed="0.037190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.336080" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.348804" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.361576" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.361770" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.361949" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.362351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.362208" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:56.362193" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.362588" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.362756" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.362925" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:56.362164" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.362060" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.363151" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.363227" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:43:56.363349" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:56.281593" elapsed="0.081783"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.390282" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.389908" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.391023" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:56.390817" elapsed="0.000269">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:56.391180" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:56.390485" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.391769" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.391366" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.392091" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:43:56.392223" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:43:56.391957" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.392666" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;graceful-restart&gt;
        &lt;config&gt;
            &lt;restart-time&gt;30&lt;/restart-time&gt;
        &lt;/config&gt;
    &lt;/graceful-restart&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.392406" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:43:56.393149" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.392854" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.393697" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.393379" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.393234" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.392834" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.394685" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.393932" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:43:56.394765" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:56.389284" elapsed="0.005608"/>
</kw>
<msg time="2026-05-01T00:43:56.394955" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.376229" elapsed="0.018773"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.449881" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.462705" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.475348" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.475571" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.475750" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.476151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.476008" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:43:56.475990" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.476375" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.476576" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.476741" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:43:56.475949" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.475832" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.477038" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.477116" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:43:56.477285" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:43:56.373554" elapsed="0.103761"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:43:56.478714" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:43:56.478394" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:43:56.478884" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:43:56.478009" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.479238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.478979" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.479794" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.479501" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.479318" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.478961" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.482263" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.480023" elapsed="0.002266"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:43:56.482340" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:43:56.482513" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:43:56.477661" elapsed="0.004877"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.483916" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.483662" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.484353" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;graceful-restart&gt;
        &lt;config&gt;
            &lt;restart-time&gt;30&lt;/restart-time&gt;
        &lt;/config&gt;
    &lt;/graceful-restart&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.484115" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.484835" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.484592" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.485262" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.485025" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:56.486109" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:43:56.485915" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:43:56.486524" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:43:56.486329" elapsed="0.000221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.486699" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.487443" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.487056" elapsed="0.000447"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:43:56.487547" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:43:56.487703" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:43:56.485518" elapsed="0.002210"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:56.502431" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '1139', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;2607:f0d0:1002:0011:0000:0000:0000:0002&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;graceful-restart&gt;
        &lt;config&gt;
            &lt;restart-time&gt;30&lt;/restart-time&gt;
        &lt;/config&gt;
    &lt;/graceful-restart&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:43:56.502520" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:56.502625" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:56.489942" elapsed="0.012709"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.487799" elapsed="0.014896"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.502871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.502721" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.487782" elapsed="0.015243"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.510563" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.505159" elapsed="0.005500"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.504677" elapsed="0.006060"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.504638" elapsed="0.006154"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.514629" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.511396" elapsed="0.003280"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.510916" elapsed="0.003795"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.510879" elapsed="0.003857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.515275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.514894" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.515619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.515372" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.516155" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.515856" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.515700" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.515354" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.516775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.516402" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.517134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.516903" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.517681" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.517371" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.517215" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.516884" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.517909" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:43:56.518842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:56.518563" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.519025" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:43:56.503839" elapsed="0.017582"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:43:56.521609" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:43:56.521503" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.521485" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.521841" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.521910" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:43:56.524213" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:43:56.482858" elapsed="0.041382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:56.524304" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:43:56.524499" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:43:56.270384" elapsed="0.254140"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.524857" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.524622" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.524605" elapsed="0.000344"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:43:56.524986" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/graceful_restart</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:43:56.265980" elapsed="0.259131"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:43:56.177878" elapsed="0.347350"/>
</test>
<test id="s1-s5-t32" name="Start_Exabgp_3" line="433">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:56.528669" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:56.528386" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.529914" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.529804" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.529786" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.534975" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.534864" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.534846" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.536033" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.535655" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.536598" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:56.536256" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:56.536670" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:56.536825" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:56.535267" elapsed="0.001582"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.542377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.542270" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.542251" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.543634" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:56.543527" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.543508" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:56.544140" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:56.543844" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.544568" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:56.544335" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.574358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.545083" elapsed="0.029402"/>
</kw>
<msg time="2026-05-01T00:43:56.574669" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:56.574716" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.544751" elapsed="0.030001"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.596157" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:56.575411" elapsed="0.020845"/>
</kw>
<msg time="2026-05-01T00:43:56.596416" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:56.596482" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "3 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.574926" elapsed="0.021595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.596828" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.596601" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.596580" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.597347" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.597049" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.597726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.597508" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.597487" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:56.597836" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:56.600300" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:43:56.600517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.599255" elapsed="0.001392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.600928" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.601266" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:56.598643" elapsed="0.002875"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:56.598097" elapsed="0.003498"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:56.543205" elapsed="0.058527"/>
</kw>
<msg time="2026-05-01T00:43:56.601825" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:56.601869" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "3 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.542612" elapsed="0.059295"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:56.602091" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:43:56.601983" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.601965" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.602597" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.602934" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:56.603005" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:56.541936" elapsed="0.061178"/>
</kw>
<msg time="2026-05-01T00:43:56.603207" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:56.603251" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "3 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.537219" elapsed="0.066069"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:56.603630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:56.603364" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.603347" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:56.537078" elapsed="0.066653"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:56.536901" elapsed="0.066859"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:56.534503" elapsed="0.069310"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:56.529519" elapsed="0.074350"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.529080" elapsed="0.074836"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:56.526040" elapsed="0.077931"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.604502" level="INFO">${cmd} = exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${cmd}</var>
<arg>${EXABGP3_CFG} &gt; ${EXABGP3_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.604155" elapsed="0.000375"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.607912" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.607593" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.608351" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.608110" elapsed="0.000286"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.610541" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.609003" elapsed="0.001593"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.614606" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:56.614695" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:56.610755" elapsed="0.003966"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.615281" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.615037" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:56.614789" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:56.614771" elapsed="0.000614"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:43:56.608651" elapsed="0.006778"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:56.617506" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-05-01T00:43:56.617598" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:56.615633" elapsed="0.001991"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.618234" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.617785" elapsed="0.000497"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:56.607262" elapsed="0.011075"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.620207" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:56.619842" elapsed="0.000392"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.622357" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:56.620396" elapsed="0.001989"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:56.628746" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:56.628891" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:43:56.628984" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:56.622560" elapsed="0.006450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.631605" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:56.629176" elapsed="0.002477"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:43:56.634328" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:43:56.631809" elapsed="0.002584">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:43:56.619372" elapsed="0.015151">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.637640" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:43:59.636717" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.642687" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:59.638097" elapsed="0.004654"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:43:59.650544" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:43:59.650734" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1499'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:43:59.650840" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:43:59.643118" elapsed="0.007822"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.653588" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.651117" elapsed="0.002528"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:43:59.653804" elapsed="0.002682"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:43:59.635404" elapsed="0.021148"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:43:56.618893" elapsed="3.037713"/>
</kw>
<msg time="2026-05-01T00:43:59.656710" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:59.656755" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:56.618513" elapsed="3.038265"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.657158" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:59.656880" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.656856" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:43:59.657405" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:43:59.657296" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.657281" elapsed="0.000235"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:43:56.607088" elapsed="3.050456"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:43:56.606867" elapsed="3.050712"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.657733" elapsed="0.000021"/>
</kw>
<arg>${cmd}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${EXABGP_ID}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:43:56.604835" elapsed="3.052979"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:43:56.525566" elapsed="3.132367"/>
</test>
<test id="s1-s5-t33" name="Stop_All_Exabgps_3" line="439">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:43:59.661330" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:43:59.661058" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:59.662618" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:59.662507" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.662488" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:59.667716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:59.667609" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.667591" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.668787" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:43:59.668388" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.669273" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:43:59.668974" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:43:59.669344" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:43:59.669516" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:43:59.668013" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:59.675321" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:59.675194" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.675175" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:43:59.676598" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:43:59.676488" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.676448" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:43:59.677141" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:43:59.676834" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.677566" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:59.677330" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.709597" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:59.678098" elapsed="0.031604"/>
</kw>
<msg time="2026-05-01T00:43:59.709870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:43:59.709916" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:59.677760" elapsed="0.032192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.734290" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:43:59.710504" elapsed="0.023903"/>
</kw>
<msg time="2026-05-01T00:43:59.734597" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:43:59.734645" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "3 "[K...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:59.710132" elapsed="0.024550"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.735028" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:59.734771" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.734747" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.735651" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "3 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.735305" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.736001" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:59.735784" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.735766" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:43:59.736120" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:43:59.738721" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:43:59.738929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:43:59.737631" elapsed="0.001459"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.739368" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.739728" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:43:59.736979" elapsed="0.002936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:43:59.736415" elapsed="0.003564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:43:59.676165" elapsed="0.063911"/>
</kw>
<msg time="2026-05-01T00:43:59.740168" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:59.740213" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "3 "[K...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:59.675565" elapsed="0.064687"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:43:59.740438" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:43:59.740329" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.740310" elapsed="0.000303"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.741080" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.741490" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:43:59.741603" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:43:59.674816" elapsed="0.066943"/>
</kw>
<msg time="2026-05-01T00:43:59.741894" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:43:59.741959" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "3 "[K...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:59.669910" elapsed="0.072106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:43:59.742478" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:43:59.742124" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.742100" elapsed="0.000490"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:43:59.669770" elapsed="0.072856"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:43:59.669596" elapsed="0.073077"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:43:59.667210" elapsed="0.075545"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:43:59.662202" elapsed="0.080636"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:43:59.661770" elapsed="0.081137"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:43:59.658819" elapsed="0.084168"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.754065" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-05-01T00:43:59.766776" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:43:59.767152" level="INFO">${output_log} = 00:43:56 | 3836   | welcome         | Thank you for using ExaBGP
00:43:56 | 3836   | version         | 4.2.4
00:43:56 | 3836   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:43:59.753897" elapsed="0.013328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.768503" level="INFO">00:43:56 | 3836   | welcome         | Thank you for using ExaBGP
00:43:56 | 3836   | version         | 4.2.4
00:43:56 | 3836   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00:43:56 | 3836   | os              | Linux releng-26932-215-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
00:43:56 | 3836   | installation    | /tmp/defaultvenv
00:43:56 | 3836   | advice          | environment file missing
00:43:56 | 3836   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:43:56 | 3836   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:43:56 | 3836   | cli             | we scanned the following folders (the number is your PID):
00:43:56 | 3836   | cli control     |  - /run/exabgp/
00:43:56 | 3836   | cli control     |  - /run/1001/
00:43:56 | 3836   | cli control     |  - /run/
00:43:56 | 3836   | cli control     |  - /var/run/exabgp/
00:43:56 | 3836   | cli control     |  - /var/run/1001/
00:43:56 | 3836   | cli control     |  - /var/run/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/run/1001/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/run/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:43:56 | 3836   | cli control     |  - /tmp/defaultvenv/var/run/
00:43:56 | 3836   | cli control     | please make them in one of the folder with the following commands:
00:43:56 | 3836   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:43:56 | 3836   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:43:56 | 3836   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:43:56 | 3836   | configuration   | performing reload of exabgp 4.2.4
00:43:56 | 3836   | configuration   | &gt; neighbor         | '::1'
00:43:56 | 3836   | configuration   | . router-id        | '1.2.3.4'
00:43:56 | 3836   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:43:56 | 3836   | configuration   | . local-as         | '64496'
00:43:56 | 3836   | configuration   | . peer-as          | '64496'
00:43:56 | 3836   | configuration   | &gt; capability       | 
00:43:56 | 3836   | configuration   | . graceful-restart | '40'
00:43:56 | 3836   | configuration   | &lt; capability       | 
00:43:56 | 3836   | configuration   | &gt; family           | 
00:43:56 | 3836   | configuration   | . ipv6             | 'unicast'
00:43:56 | 3836   | configuration   | &lt; family           | 
00:43:56 | 3836   | configuration   | &gt; static           | 
00:43:56 | 3836   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:43:56 | 3836   | configuration   | &lt; static           | 
00:43:56 | 3836   | configuration   | &lt; neighbor         | 
00:43:56 | 3836   | reactor         | new peer: neighbor ::1 local-ip 2607:f0d0:1002:0011:0000:0000:0000:0002 local-as 64496 peer-as 64496 router-id 1.2.3.4 family-allowed in-open
00:43:56 | 3836   | reactor         | loaded new configuration successfully
00:43:56 | 3836   | reactor         | initialising connection to peer-1
00:43:56 | 3836   | outgoing-1      | attempting connection to ::1:1790
00:43:56 | 3836   | outgoing-1      | sending TCP payload (  59) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 0104 FBF0 00B4 0102 0304 1E02 0601 0400 0200 0102 0641 0400 00FB F002 0840 0680 2800 0201 8002 0206 00
00:43:56 | 3836   | outgoing-1      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), Graceful Restart Flags 0x8 Time 40 ipv6/unicast=0x80, ASN4(64496)]
00:43:56 | 3836   | ka-outgoing-1   | receive-timer 60 second(s) left
00:43:56 | 3836   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:43:56 | 3836   | outgoing-1      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 001E 4700
00:43:56 | 3836   | outgoing-1      | &lt;&lt; message of type OPEN
00:43:56 | 3836   | outgoing-1      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 30 , ASN4(64496), Unassigned 71]
00:43:56 | 3836   | outgoing-1      | --------------------------------------------------------------------
00:43:56 | 3836   | outgoing-1      | the connection can not carry the following family/families
00:43:56 | 3836   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:43:56 | 3836   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:43:56 | 3836   | outgoing-1      | --------------------------------------------------------------------
00:43:56 | 3836   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:56 | 3836   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:43:56 | 3836   | ka-outgoing-1   | receive-timer 180 second(s) left
00:43:56 | 3836   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:43:56 | 3836   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:43:56 | 3836   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:43:56 | 3836   | outgoing-1      | sending TCP payload (  78) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004E 0200 0000 3740 0101 0040 0200 4005 0400 0000 6480 0E26 0002 0110 2607 F0D0 1002 0011 0000 0000 0000 0002 0080 2A04 6D80 0000 0000 0000 0000 0000 0001
00:43:56 | 3836   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:43:56 | 3836   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:43:56 | 3836   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:43:56 | 3836   | peer-1          | &gt;&gt; EOR(s)
00:43:56 | 3836   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:56 | 3836   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:56 | 3836   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:56 | 3836   | parser          | parsing UPDATE (   4) 0000 0000
00:43:56 | 3836   | peer-1          | &lt;&lt; UPDATE #1
00:43:56 | 3836   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:56 | 3836   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:43:56 | 3836   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:43:56 | 3836   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:56 | 3836   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:43:56 | 3836   | routes          | withdrawn NLRI none
00:43:56 | 3836   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:43:56 | 3836   | routes          | announced NLRI none
00:43:56 | 3836   | peer-1          | &lt;&lt; UPDATE #2
00:43:56 | 3836   | peer-1          |    UPDATE #2 nlri  (  11) eor 2/1 (ipv6 unicast)
00:43:56 | 3836   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:43:56 | 3836   | outgoing-1      | received TCP payload (   4) 0000 0000
00:43:56 | 3836   | outgoing-1      | &lt;&lt; message of type UPDATE
00:43:56 | 3836   | parser          | parsing UPDATE (   4) 0000 0000
00:43:56 | 3836   | peer-1          | &lt;&lt; UPDATE #3
00:43:56 | 3836   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:43:56 | 3836   | ka-outgoing-1   | receive-timer 179 second(s) left
00:43:56 | 3836   | ka-outgoing-1   | send-timer 59 second(s) left
00:43:57 | 3836   | ka-outgoing-1   | receive-timer 178 second(s) left
00:43:57 | 3836   | ka-outgoing-1   | send-timer 58 second(s) left
00:43:58 | 3836   | ka-outgoing-1   | receive-timer 177 second(s) left
00:43:58 | 3836   | ka-outgoing-1   | send-timer 57 second(s) left</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.767754" elapsed="0.001162"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:43:59.770232" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exabgp_graceful_restart.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exabgp_graceful_restart.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:43:59.769383" elapsed="0.000986"/>
</kw>
<arg>${EXABGP3_LOG}</arg>
<arg>${EXABGP3_LOG}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:43:59.753392" elapsed="0.017189"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.772162" level="INFO">[?2004l</msg>
<msg time="2026-05-01T00:43:59.772272" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:43:59.771967" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.772913" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.772554" elapsed="0.000425"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.774560" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:43:59.773883" elapsed="0.000728"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:59.774919" elapsed="0.000423"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:43:59.773269" elapsed="0.002217"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.924022" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:59.924220" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:59.775792" elapsed="0.148458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.924886" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.924530" elapsed="0.000403"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.926589" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:43:59.925671" elapsed="0.000999"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:43:59.927607" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:43:59.927694" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:43:59.926861" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:43:59.928319" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:43:59.928067" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-05-01T00:43:59.927798" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-05-01T00:43:59.927774" elapsed="0.000653"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:43:59.925243" elapsed="0.003250"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:43:59.771229" elapsed="0.157319"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-05-01T00:44:39.929309" level="INFO">Slept 40 seconds.</msg>
<arg>40s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-05-01T00:43:59.928743" elapsed="40.000900"/>
</kw>
<kw name="Fail If Exceptions Found During Test" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:39.932042" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:39.931766" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:39.931718" elapsed="0.000492"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:39.934042" level="INFO">${cmd} = sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3/d' /tmp/karaf-0.23.2/data/log/karaf.log</msg>
<var>${cmd}</var>
<arg>sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:39.933446" elapsed="0.000636"/>
</kw>
<kw name="Get Karaf Log Lines From Test Start" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:39.940505" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:39.940331" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:39.940305" elapsed="0.000301"/>
</if>
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:39.943105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:39.942835" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:39.942817" elapsed="0.000371"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:39.943482" level="INFO">index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:44:39.943631" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.185
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:44:39.943339" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:39.944202" level="INFO">Attempting to execute command "sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3/d' /tmp/karaf-0.23.2/data/log/karaf.log" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:39.943817" elapsed="0.000516"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:39.944910" level="INFO">${conn_id} = 10</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:39.944510" elapsed="0.000426"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:44:39.945849" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:44:39.945925" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:44:39.945565" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:39.946104" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:44:39.947266" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:44:40.257015" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:43:52 UTC 2026

  System load:  0.01               Processes:             127
  Usage of /:   11.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:43:55 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:44:39.946955" elapsed="0.310219"/>
</kw>
<msg time="2026-05-01T00:44:40.257260" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:39.946601" elapsed="0.310739"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:44:39.945153" elapsed="0.312290"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.257926" level="INFO">Executing command 'sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3/d' /tmp/karaf-0.23.2/data/log/karaf.log'.</msg>
<msg time="2026-05-01T00:44:40.270606" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:44:40.270870" level="INFO">${stdout} = 2026-05-01T00:43:59,802 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.1 | End of input detected. Close the session.
2026-05-01T00:43:...</msg>
<msg time="2026-05-01T00:44:40.270979" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:40.257695" elapsed="0.013341"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:40.271435" elapsed="0.000984"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.273816" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.273095" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.274371" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:40.274081" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.274030" elapsed="0.000545"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:44:40.274932" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-05-01T00:44:40.274696" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.274661" elapsed="0.000463"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.275200" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:40.280822" elapsed="0.000198"/>
</kw>
<msg time="2026-05-01T00:44:40.281080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:40.279974" elapsed="0.001219"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.281419" elapsed="0.000030"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.281667" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:40.275931" elapsed="0.005849"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:44:39.942259" elapsed="0.339646"/>
</kw>
<msg time="2026-05-01T00:44:40.281996" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:39.941668" elapsed="0.340479"/>
</kw>
<msg time="2026-05-01T00:44:40.282371" level="INFO">${output} = 2026-05-01T00:43:59,802 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.1 | End of input detected. Close the session.
2026-05-01T00:43:...</msg>
<var>${output}</var>
<arg>${ip}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>${prompt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:44:39.940876" elapsed="0.341533"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:44:40.283096" level="INFO">@{log_lines} = [ 2026-05-01T00:43:59,802 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.1 | End of input detected. Close the session. | 2026-05-01T00...</msg>
<var>@{log_lines}</var>
<arg>${output}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:44:40.282724" elapsed="0.000411"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-05-01T00:44:40.283201" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:44:40.283429" level="INFO">${output} = ['2026-05-01T00:43:59,802 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.1 | End of input detected. Close the session.', '2026-05-01T0...</msg>
<var>${output}</var>
<arg>${ODL_SYSTEM_${i}_IP}</arg>
<arg>${test_name}</arg>
<arg>${cmd}</arg>
<doc>Scrapes all log messages that match regexp ${type} which fall after a point given by a log message that
contains bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3. This is useful if your test cases are marking karaf.log with a message indicating when
that test case has started; such that you can easily pull out any extra log messsages to parse/log/etc in the
test logic itself. For example, you can grab all ERRORS that occur during your test case.</doc>
<status status="PASS" start="2026-05-01T00:44:39.939592" elapsed="0.343897"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-05-01T00:44:40.284055" level="INFO">${exlist} = []</msg>
<msg time="2026-05-01T00:44:40.284118" level="INFO">${matchlist} = []</msg>
<var>${exlist}</var>
<var>${matchlist}</var>
<arg>${output}</arg>
<doc>Return a list of exceptions not in the whitelist for the given lines.</doc>
<status status="PASS" start="2026-05-01T00:44:40.283752" elapsed="0.000399"/>
</kw>
<kw name="Write Exceptions Map To File" owner="excepts">
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>/tmp/odl${i}_exceptions.txt</arg>
<doc>Write the exceptions map to a file under the testname header. The output
will include all lines in the exception itself as well as any previous
contextual warning or error lines. The output will be appended or overwritten
depending on the mode parameter. It is assumed that the caller has called
verify_exceptions() earlier to populate the exceptions map, otherwise only
the testname and header will be printed to the file.</doc>
<status status="PASS" start="2026-05-01T00:44:40.284396" elapsed="0.000473"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.285536" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:44:40.285615" level="INFO">${listlength} = 0</msg>
<var>${listlength}</var>
<arg>${exlist}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:44:40.285096" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${fail}&quot;==&quot;True&quot; and ${listlength} != 0">
<kw name="Log And Fail Exceptions" owner="KarafKeywords">
<arg>${exlist}</arg>
<arg>${listlength}</arg>
<doc>Print the list of failed exceptions and fail the test</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.286059" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:40.285710" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-05-01T00:44:40.286420" level="INFO">List is empty.</msg>
<arg>${matchlist}</arg>
<doc>Logs contents of the ``list`` using the given ``level``.</doc>
<status status="PASS" start="2026-05-01T00:44:40.286286" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:40.286145" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.285691" elapsed="0.000841"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-05-01T00:44:39.933042" elapsed="0.353515"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-05-01T00:44:39.932300" elapsed="0.354293"/>
</for>
<arg>${SUITE_NAME}.${TEST_NAME}</arg>
<arg>fail=${True}</arg>
<doc>Create a failure if an Exception is found in the karaf.log that has not been whitelisted.
Will work for single controller jobs as well as 3node cluster jobs</doc>
<status status="PASS" start="2026-05-01T00:44:39.930701" elapsed="0.355954"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-05-01T00:43:59.658246" elapsed="40.628530"/>
</test>
<test id="s1-s5-t34" name="Start_Exabgp_4" line="446">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:44:40.290033" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:44:40.289772" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.291274" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:40.291166" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.291148" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.296587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:40.296478" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.296446" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.297669" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:40.297271" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.298150" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:40.297857" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:40.298219" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:40.298374" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:40.296883" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.304014" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:40.303906" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.303887" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.305394" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:40.305194" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.305165" elapsed="0.000327"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:40.305949" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:40.305641" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.306347" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:40.306133" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.338353" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:40.306963" elapsed="0.031595"/>
</kw>
<msg time="2026-05-01T00:44:40.338780" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:40.338832" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.306595" elapsed="0.032275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.357927" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:40.339569" elapsed="0.018466"/>
</kw>
<msg time="2026-05-01T00:44:40.358229" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:40.358293" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "4 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.339092" elapsed="0.019243"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.358730" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:40.358438" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.358409" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.359306" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.358971" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.359728" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:40.359469" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.359429" elapsed="0.000382"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:40.359851" elapsed="0.000058"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:40.362878" elapsed="0.000381"/>
</kw>
<msg time="2026-05-01T00:44:40.363328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:40.361665" elapsed="0.001819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.363831" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.364226" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:40.360901" elapsed="0.003518"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:40.360226" elapsed="0.004279"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:40.304882" elapsed="0.059728"/>
</kw>
<msg time="2026-05-01T00:44:40.364711" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:40.364836" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "4 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.304231" elapsed="0.060650"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:40.365073" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:44:40.364962" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.364943" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.365629" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.366019" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:40.366096" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:40.303571" elapsed="0.062637"/>
</kw>
<msg time="2026-05-01T00:44:40.366305" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:40.366349" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "a "r "t "_ "E "x "a "b "g "p "_ "4 "[K"
[?1l&gt;[?2004l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.298835" elapsed="0.067554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:40.366755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:40.366499" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.366478" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:40.298691" elapsed="0.068173"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:40.298510" elapsed="0.068402"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:40.296099" elapsed="0.070884"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:44:40.290882" elapsed="0.076161"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.290442" elapsed="0.076650"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:44:40.287549" elapsed="0.079599"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.367717" level="INFO">${cmd} = exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${cmd}</var>
<arg>${EXABGP3_CFG} &gt; ${EXABGP3_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:40.367324" elapsed="0.000421"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.371336" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:40.370986" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.371876" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.371628" elapsed="0.000294"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.374671" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:40.372624" elapsed="0.002108"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.380434" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:44:40.380672" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:44:40.374898" elapsed="0.005832"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.382036" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.381484" elapsed="0.000655"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:40.380883" elapsed="0.001329"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:40.380843" elapsed="0.001424"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:44:40.372189" elapsed="0.010175"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:40.386264" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-05-01T00:44:40.386481" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:40.382725" elapsed="0.003815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.387538" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.386965" elapsed="0.000679"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:40.370663" elapsed="0.017099"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.390718" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:40.390352" elapsed="0.000393"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.394712" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:40.390905" elapsed="0.003835"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:40.404131" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:40.404284" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:44:40.404394" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:44:40.394904" elapsed="0.009516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.408818" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:40.404621" elapsed="0.004303"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:44:40.414352" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:44:40.409268" elapsed="0.005163">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:44:40.389899" elapsed="0.024672">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.417531" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:43.416620" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.422334" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:43.417984" elapsed="0.004391"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:43.429794" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:43.430034" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1499'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:44:43.430180" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:44:43.422623" elapsed="0.007593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.433905" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://1.2.3.4","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":true},"bgp-inet:ipv6-routes":{"ipv6-route":[{"path-id":0,"route-key":"2a04:6d80::1/128","prefix":"2a04:6d80::1/128","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2607:f0d0:1002:11::2"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.430473" elapsed="0.003574"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:44:43.434267" elapsed="0.003502"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:44:43.415351" elapsed="0.022521"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:44:40.388981" elapsed="3.048971"/>
</kw>
<msg time="2026-05-01T00:44:43.438072" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:43.438125" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:40.388104" elapsed="3.050044"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.438549" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.438251" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.438226" elapsed="0.000407"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:44:43.438797" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:44:43.438687" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.438672" elapsed="0.000218"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:44:40.370478" elapsed="3.068440"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:44:40.370222" elapsed="3.068732"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.439107" elapsed="0.000021"/>
</kw>
<arg>${cmd}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${EXABGP_ID}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:44:40.368085" elapsed="3.071101"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:44:40.287054" elapsed="3.152249"/>
</test>
<test id="s1-s5-t35" name="Delete_Bgp_Peer_Configuration_6" line="452">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:44:43.442718" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:44:43.442431" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.443990" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.443879" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.443861" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.449333" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.449224" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.449206" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.450463" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:43.450064" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.450948" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:43.450654" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:43.451019" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:44:43.451179" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:43.449690" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.456796" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.456688" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.456669" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.458090" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.457983" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.457966" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:43.458633" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.458305" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.459037" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:43.458819" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.490366" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:43.459569" elapsed="0.031000"/>
</kw>
<msg time="2026-05-01T00:44:43.490744" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:43.490791" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.459220" elapsed="0.031609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.518749" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:43.491370" elapsed="0.027491"/>
</kw>
<msg time="2026-05-01T00:44:43.519027" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:43.519073" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.491011" elapsed="0.028099"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.519428" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.519194" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.519172" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.519985" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "_ "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.519676" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.520341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.520124" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.520106" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:43.520472" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:43.523068" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:44:43.523278" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.521968" elapsed="0.001444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.523706" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.524043" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:43.521319" elapsed="0.002912"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:43.520770" elapsed="0.003525"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:43.457674" elapsed="0.066720"/>
</kw>
<msg time="2026-05-01T00:44:43.524509" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:43.524555" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.457016" elapsed="0.067578"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:43.524972" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:44:43.524672" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.524653" elapsed="0.000408"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.525503" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.525879" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.525951" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:43.456335" elapsed="0.069725"/>
</kw>
<msg time="2026-05-01T00:44:43.526153" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:43.526196" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.451601" elapsed="0.074633"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.526615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.526345" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.526327" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:43.451441" elapsed="0.075278"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:43.451262" elapsed="0.075489"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:43.448856" elapsed="0.077952"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:44:43.443588" elapsed="0.083276"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.443133" elapsed="0.083774"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:44:43.440225" elapsed="0.086736"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.527876" level="INFO">&amp;{mapping} = { IP=2607:f0d0:1002:0011:0000:0000:0000:0002 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=ex...</msg>
<var>&amp;{mapping}</var>
<arg>IP=${IPV6_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.527155" elapsed="0.000750"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.571555" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:43.571136" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:44:43.572403" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:44:43.572101" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:44:43.572599" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:44:43.571759" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.573178" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:43.572791" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:44:43.573521" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/graceful_restart/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:44:43.573709" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:44:43.573366" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.574138" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.573893" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.575189" level="INFO">mapping: {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.574931" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.575678" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.575393" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.576380" level="INFO">${value} = 2607:f0d0:1002:0011:0000:0000:0000:0002</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.576083" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.577381" level="INFO">${encoded} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.576936" elapsed="0.000539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.577532" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:44:43.577713" level="INFO">${encoded_value} = 2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.576611" elapsed="0.001127"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.577896" elapsed="0.000250"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-05-01T00:44:43.575946" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.578753" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.578437" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.579509" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.579281" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.579585" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.579738" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.578966" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.579913" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:44:43.578303" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.580738" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.580425" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.581491" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.581266" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.581567" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.581744" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.580950" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.581925" elapsed="0.000221"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:44:43.580292" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.582748" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.582434" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.583500" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.583274" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.583576" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:44:43.583726" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.582958" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.583903" elapsed="0.000220"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:44:43.582301" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.584731" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.584411" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.585482" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.585259" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.585558" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.585720" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.584943" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.585896" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:43.584278" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.586711" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.586398" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.587444" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.587237" elapsed="0.000283"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.587573" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:44:43.587728" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.586922" elapsed="0.000830"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.587901" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:44:43.586267" elapsed="0.001897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.588725" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.588411" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.589688" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.589439" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.589764" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.589916" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.589118" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.590093" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:43.588278" elapsed="0.002076"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.590920" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:43.590620" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:43.591669" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.591444" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:43.591744" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.591894" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:43.591131" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.592070" elapsed="0.000217"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:43.590484" elapsed="0.001844"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:44:43.575758" elapsed="0.016605"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:44:43.592406" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:44:43.592583" level="INFO">${mapping_to_use} = {'IP': '2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:44:43.574603" elapsed="0.018007"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.574262" elapsed="0.018381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.592818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.592669" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.574239" elapsed="0.018656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.593781" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:43.593039" elapsed="0.000770"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:44:43.593858" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:44:43.570450" elapsed="0.023532"/>
</kw>
<msg time="2026-05-01T00:44:43.594038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.557384" elapsed="0.036700"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.606832" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.619591" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.632331" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.632538" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.632714" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.633083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.632938" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:44:43.632924" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.633305" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.633486" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.633655" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:44:43.632894" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.632791" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.633894" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.633970" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:44:43.634095" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:44:43.552961" elapsed="0.081161"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.635226" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.634979" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:43.646354" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01jj727ujmwjpc1eej2zhsmlcfc5.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:43.646402" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=2607%3Af0d0%3A1002%3A0011%3A0000%3A0000%3A0000%3A0002 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:43.646530" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:44:43.637623" elapsed="0.008933"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.635340" elapsed="0.011287"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.647028" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.646665" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.635323" elapsed="0.011889"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.655029" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.649485" elapsed="0.005641"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.648969" elapsed="0.006235"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.648930" elapsed="0.006330"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.659854" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.655914" elapsed="0.003986"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.655386" elapsed="0.004549"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.655348" elapsed="0.004612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.660523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:43.660130" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.660861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.660622" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.661399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:43.661103" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.660942" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.660603" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.662030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:43.661657" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.662356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.662126" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.662907" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:43.662616" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.662437" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.662108" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.663135" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:44:43.663936" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:43.663657" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.664113" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:44:43.648037" elapsed="0.018508"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:44:43.666590" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:44:43.668920" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:44:43.634389" elapsed="0.034559"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:44:43.669003" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/graceful_restart</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:44:43.528148" elapsed="0.140980"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:44:43.439644" elapsed="0.229603"/>
</test>
<test id="s1-s5-t36" name="Stop_All_Exabgps_4" line="468">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:44:43.672740" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:44:43.672439" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.674032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.673922" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.673900" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.679335" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.679228" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.679210" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.680396" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:43.680019" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.680893" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:43.680600" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:43.680964" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:43.681117" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:43.679647" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.686717" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.686609" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.686590" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.687967" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:43.687859" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.687841" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:43.688496" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:43.688180" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.688903" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:43.688685" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.721572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:43.689416" elapsed="0.032257"/>
</kw>
<msg time="2026-05-01T00:44:43.721856" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:43.721904" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.689084" elapsed="0.032857"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.746424" level="INFO">". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:43.722446" elapsed="0.024112"/>
</kw>
<msg time="2026-05-01T00:44:43.746734" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:43.746780" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "4 "[K...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.722108" elapsed="0.024709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.747138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.746906" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.746885" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.747689" level="INFO"> ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.747357" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.748034" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.747823" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.747805" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:43.748143" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:43.750677" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:44:43.750879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.749596" elapsed="0.001468"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.751502" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.751846" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:43.748966" elapsed="0.003067"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:43.748417" elapsed="0.003680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:43.687557" elapsed="0.064637"/>
</kw>
<msg time="2026-05-01T00:44:43.752284" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:43.752327" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "4 "[K...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.686937" elapsed="0.065427"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:43.752565" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:44:43.752440" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.752422" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.753051" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.753387" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:43.753476" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:43.686259" elapsed="0.067327"/>
</kw>
<msg time="2026-05-01T00:44:43.753679" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:43.753723" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "I "p "v "6 "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "E "x "a "b "g "p "s "_ "4 "[K...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.681522" elapsed="0.072238"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:43.754107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:43.753860" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.753842" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:43.681365" elapsed="0.072843"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:43.681195" elapsed="0.073043"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:43.678870" elapsed="0.075423"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:44:43.673601" elapsed="0.080748"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.673158" elapsed="0.081235"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:44:43.670254" elapsed="0.084192"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.763542" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-05-01T00:44:43.775968" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:44:43.776176" level="INFO">${output_log} = 00:44:40 | 3911   | welcome         | Thank you for using ExaBGP
00:44:40 | 3911   | version         | 4.2.4
00:44:40 | 3911   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:43.763387" elapsed="0.012847"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.777191" level="INFO">00:44:40 | 3911   | welcome         | Thank you for using ExaBGP
00:44:40 | 3911   | version         | 4.2.4
00:44:40 | 3911   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
00:44:40 | 3911   | os              | Linux releng-26932-215-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
00:44:40 | 3911   | installation    | /tmp/defaultvenv
00:44:40 | 3911   | advice          | environment file missing
00:44:40 | 3911   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:44:40 | 3911   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:44:40 | 3911   | cli             | we scanned the following folders (the number is your PID):
00:44:40 | 3911   | cli control     |  - /run/exabgp/
00:44:40 | 3911   | cli control     |  - /run/1001/
00:44:40 | 3911   | cli control     |  - /run/
00:44:40 | 3911   | cli control     |  - /var/run/exabgp/
00:44:40 | 3911   | cli control     |  - /var/run/1001/
00:44:40 | 3911   | cli control     |  - /var/run/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/run/1001/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/run/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:44:40 | 3911   | cli control     |  - /tmp/defaultvenv/var/run/
00:44:40 | 3911   | cli control     | please make them in one of the folder with the following commands:
00:44:40 | 3911   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:44:40 | 3911   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:44:40 | 3911   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:44:40 | 3911   | configuration   | performing reload of exabgp 4.2.4
00:44:40 | 3911   | configuration   | &gt; neighbor         | '::1'
00:44:40 | 3911   | configuration   | . router-id        | '1.2.3.4'
00:44:40 | 3911   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:44:40 | 3911   | configuration   | . local-as         | '64496'
00:44:40 | 3911   | configuration   | . peer-as          | '64496'
00:44:40 | 3911   | configuration   | &gt; capability       | 
00:44:40 | 3911   | configuration   | . graceful-restart | '40'
00:44:40 | 3911   | configuration   | &lt; capability       | 
00:44:40 | 3911   | configuration   | &gt; family           | 
00:44:40 | 3911   | configuration   | . ipv6             | 'unicast'
00:44:40 | 3911   | configuration   | &lt; family           | 
00:44:40 | 3911   | configuration   | &gt; static           | 
00:44:40 | 3911   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:44:40 | 3911   | configuration   | &lt; static           | 
00:44:40 | 3911   | configuration   | &lt; neighbor         | 
00:44:40 | 3911   | reactor         | new peer: neighbor ::1 local-ip 2607:f0d0:1002:0011:0000:0000:0000:0002 local-as 64496 peer-as 64496 router-id 1.2.3.4 family-allowed in-open
00:44:40 | 3911   | reactor         | loaded new configuration successfully
00:44:40 | 3911   | reactor         | initialising connection to peer-1
00:44:40 | 3911   | outgoing-1      | attempting connection to ::1:1790
00:44:40 | 3911   | outgoing-1      | sending TCP payload (  59) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 0104 FBF0 00B4 0102 0304 1E02 0601 0400 0200 0102 0641 0400 00FB F002 0840 0680 2800 0201 8002 0206 00
00:44:40 | 3911   | outgoing-1      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), Graceful Restart Flags 0x8 Time 40 ipv6/unicast=0x80, ASN4(64496)]
00:44:40 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:44:40 | 3911   | outgoing-1      | received TCP payload (  40) 04FB F000 B4C0 0002 021E 021C 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0001 4002 001E 4700
00:44:40 | 3911   | outgoing-1      | &lt;&lt; message of type OPEN
00:44:40 | 3911   | outgoing-1      | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 30 , ASN4(64496), Unassigned 71]
00:44:40 | 3911   | ka-outgoing-1   | receive-timer 60 second(s) left
00:44:40 | 3911   | outgoing-1      | --------------------------------------------------------------------
00:44:40 | 3911   | outgoing-1      | the connection can not carry the following family/families
00:44:40 | 3911   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:44:40 | 3911   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:44:40 | 3911   | outgoing-1      | --------------------------------------------------------------------
00:44:40 | 3911   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:44:40 | 3911   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:44:40 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:44:40 | 3911   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:44:40 | 3911   | ka-outgoing-1   | receive-timer 180 second(s) left
00:44:40 | 3911   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:44:40 | 3911   | outgoing-1      | sending TCP payload (  78) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004E 0200 0000 3740 0101 0040 0200 4005 0400 0000 6480 0E26 0002 0110 2607 F0D0 1002 0011 0000 0000 0000 0002 0080 2A04 6D80 0000 0000 0000 0000 0000 0001
00:44:40 | 3911   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:44:40 | 3911   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:44:40 | 3911   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:44:40 | 3911   | peer-1          | &gt;&gt; EOR(s)
00:44:40 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:44:40 | 3911   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:44:40 | 3911   | outgoing-1      | &lt;&lt; message of type UPDATE
00:44:40 | 3911   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:44:40 | 3911   | routes          | withdrawn NLRI none
00:44:40 | 3911   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:44:40 | 3911   | routes          | announced NLRI none
00:44:40 | 3911   | peer-1          | &lt;&lt; UPDATE #1
00:44:40 | 3911   | peer-1          |    UPDATE #1 nlri  (  11) eor 2/1 (ipv6 unicast)
00:44:40 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:44:40 | 3911   | outgoing-1      | received TCP payload (   4) 0000 0000
00:44:40 | 3911   | outgoing-1      | &lt;&lt; message of type UPDATE
00:44:40 | 3911   | parser          | parsing UPDATE (   4) 0000 0000
00:44:40 | 3911   | peer-1          | &lt;&lt; UPDATE #2
00:44:40 | 3911   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:44:40 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:44:40 | 3911   | outgoing-1      | received TCP payload (   4) 0000 0000
00:44:40 | 3911   | outgoing-1      | &lt;&lt; message of type UPDATE
00:44:40 | 3911   | parser          | parsing UPDATE (   4) 0000 0000
00:44:40 | 3911   | peer-1          | &lt;&lt; UPDATE #3
00:44:40 | 3911   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:44:40 | 3911   | ka-outgoing-1   | receive-timer 179 second(s) left
00:44:40 | 3911   | ka-outgoing-1   | send-timer 59 second(s) left
00:44:41 | 3911   | ka-outgoing-1   | receive-timer 178 second(s) left
00:44:41 | 3911   | ka-outgoing-1   | send-timer 58 second(s) left
00:44:42 | 3911   | ka-outgoing-1   | receive-timer 177 second(s) left
00:44:42 | 3911   | ka-outgoing-1   | send-timer 57 second(s) left
00:44:43 | 3911   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:44:43 | 3911   | outgoing-1      | received TCP payload (   2) 0600
00:44:43 | 3911   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:44:43 | 3911   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:44:43 | 3911   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:44:43 | 3911   | reactor         | initialising connection to peer-1
00:44:43 | 3911   | outgoing-2      | attempting connection to ::1:1790
00:44:43 | 3911   | outgoing-2      | sending TCP payload (  59) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 0104 FBF0 00B4 0102 0304 1E02 0601 0400 0200 0102 0641 0400 00FB F002 0840 0680 2800 0201 8002 0206 00
00:44:43 | 3911   | outgoing-2      | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=1.2.3.4 capabilities=[Multiprotocol(ipv6 unicast), Extended Message(65535), Graceful Restart Flags 0x8 Time 40 ipv6/unicast=0x80, ASN4(64496)]
00:44:43 | 3911   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:44:43 | 3911   | outgoing-2      | received TCP payload (   2) 0605
00:44:43 | 3911   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:44:43 | 3911   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:44:43 | 3911   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.776625" elapsed="0.000975"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:44:43.778846" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exabgp_graceful_restart.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exabgp_graceful_restart.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:44:43.778010" elapsed="0.000965"/>
</kw>
<arg>${EXABGP3_LOG}</arg>
<arg>${EXABGP3_LOG}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:44:43.763007" elapsed="0.016102"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.780549" level="INFO">[?2004l</msg>
<msg time="2026-05-01T00:44:43.780725" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:44:43.780282" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.781686" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.781109" elapsed="0.000677"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.783257" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:43.782834" elapsed="0.000461"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:43.783527" elapsed="0.000254"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:44:43.782274" elapsed="0.001590"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.937761" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:44:43.937866" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:44:43.784068" elapsed="0.153826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.938347" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.938087" elapsed="0.000306"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.939959" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:43.939052" elapsed="0.000962"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.940957" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:44:43.941042" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:44:43.940168" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.941658" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.941386" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.941138" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.941118" elapsed="0.000645"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:44:43.938682" elapsed="0.003127"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:44:43.779680" elapsed="0.162179"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-05-01T00:44:43.669575" elapsed="0.272389"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.948549" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:43.948211" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:43.950000" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:44:43.992553" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:44:43.992822" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:44:43.992918" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:44:43.993009" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:43.949807" elapsed="0.043253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.994973" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:44:43.994320" elapsed="0.000753"/>
</kw>
<msg time="2026-05-01T00:44:43.995278" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:44:43.995375" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:43.993501" elapsed="0.001924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.996792" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:43.995828" elapsed="0.001024"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.999024" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.998678" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:43.999721" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.999362" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.000314" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:43.999987" elapsed="0.000387"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:44:43.997815" elapsed="0.002653"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:43.997027" elapsed="0.003495"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:43.996981" elapsed="0.003578"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.000784" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.000638" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.000615" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:44:44.001077" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:44:44.000954" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.000933" elapsed="0.000269"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.001404" elapsed="0.000030"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:44:43.949253" elapsed="0.052338"/>
</kw>
<msg time="2026-05-01T00:44:44.001666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.948735" elapsed="0.053017"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:44:43.947607" elapsed="0.054251"/>
</kw>
<msg time="2026-05-01T00:44:44.001926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:43.943430" elapsed="0.058571"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:44:43.943085" elapsed="0.059039"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:44:43.942842" elapsed="0.059365"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:44:44.002410" elapsed="0.000515"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:44.003243" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:44:44.003139" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.004723" level="INFO">${output} = None</msg>
<msg time="2026-05-01T00:44:44.004782" level="FAIL">No open connection.</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.004497" elapsed="0.000835">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.005947" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.005596" elapsed="0.000414"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.007018" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:44.006687" elapsed="0.000358"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.007364" level="FAIL">No open connection.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.007196" elapsed="0.000426">No open connection.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.006359" elapsed="0.001390">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.008060" level="INFO">${output} = None</msg>
<msg time="2026-05-01T00:44:44.008101" level="FAIL">No open connection.</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.007907" elapsed="0.000397">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.008734" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.008486" elapsed="0.000292"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.009494" level="FAIL">No open connection.</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.009335" elapsed="0.000411">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.010337" level="INFO">${output} = None</msg>
<msg time="2026-05-01T00:44:44.010380" level="FAIL">No open connection.</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.009913" elapsed="0.000686">No open connection.</status>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.011213" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.010963" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:44.010682" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.010663" elapsed="0.000652"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.009025" elapsed="0.002399">Several failures occurred:

1) No open connection.

2) No open connection.</status>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="FAIL" start="2026-05-01T00:44:44.004184" elapsed="0.007378">Several failures occurred:

1) No open connection.

2) No open connection.

3) No open connection.

4) No open connection.

5) No open connection.</status>
</kw>
<arg>ExaBgpLib.Stop_ExaBgp</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.003625" elapsed="0.007988"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:44:43.942584" elapsed="0.069080"/>
</kw>
<doc>Functional test for ipv6 connection with bgp.

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests simple connection between one ibgp peer (exabgp) and Odl.
Peer is configured with ipv6, and exabgp connectes to odl via ipv6.
Exabgp sends one ipv6 unicast route, which presence is verified in
example-ipv6-topology. Tests this connection multiple times, with
different ipv6 accepted formats, e.g. (::1, 0:0:0:0:0:0:0:1, full text)
This suite also tests a combination of afi-safis on odl and exabgp.
ipv6 route injection is carried out from odl to the ibgp peer without
ipv6 family enabled on the peer device and checked for exceptions</doc>
<status status="PASS" start="2026-05-01T00:41:46.396165" elapsed="177.615528"/>
</suite>
<suite id="s1-s6" name="Bgp Llgr Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.100884" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.096714" elapsed="0.004222"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:44:44.096490" elapsed="0.004514"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.105730" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:44:44.102085" elapsed="0.003673"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:44:44.105955" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.105839" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.105815" elapsed="0.000210"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.106554" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.106174" elapsed="0.000424"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.107067" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:44:44.106760" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:44:44.107606" elapsed="0.000279"/>
</kw>
<msg time="2026-05-01T00:44:44.107979" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:44.108027" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.107257" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.108594" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:44.108213" elapsed="0.000408"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.109605" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:44.109328" elapsed="0.000304"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.110028" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:44.109778" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.110539" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.110207" elapsed="0.000360"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.113737" elapsed="0.000206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.114433" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:44.114098" elapsed="0.000376"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.114626" elapsed="0.000227"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.115649" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:44.115337" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:44:44.115721" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:44:44.115926" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.115047" elapsed="0.000905"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:44.116547" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a087310&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:44:44.116106" elapsed="0.000570"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.116838" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:44:44.113166" elapsed="0.003922"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:44.112977" elapsed="0.004155"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:44:44.110621" elapsed="0.006542"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.117735" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.117323" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.118358" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.117938" elapsed="0.000463"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.118957" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.118575" elapsed="0.000424"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:44:44.108886" elapsed="0.010169"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:44:44.101747" elapsed="0.017363"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.119287" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.119176" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.119157" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.122414" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:44.122022" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.122911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:44.122616" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:44.122982" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:44.123137" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:44.121698" elapsed="0.001464"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:44.124149" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.123885" elapsed="0.000291"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.124919" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:44:44.125019" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.124757" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.128571" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:44.127987" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.127967" elapsed="0.000730"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.129336" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:44:44.129625" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.128895" elapsed="0.000788"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.130646" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.129947" elapsed="0.000805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.131935" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.131024" elapsed="0.000962"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.133698" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:44:44.133873" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:44:44.133322" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.134278" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.135882" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:44:44.443025" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:43:52 UTC 2026

  System load:  0.01               Processes:             127
  Usage of /:   11.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:44:40 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:44:44.135558" elapsed="0.307605"/>
</kw>
<msg time="2026-05-01T00:44:44.443253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.135102" elapsed="0.308304"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:44:44.132424" elapsed="0.311187"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.444642" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:44:44.457935" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:44:44.458113" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:44:44.458217" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:44.444048" elapsed="0.014219"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.458641" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.460372" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.459789" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.460937" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.460672" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.460645" elapsed="0.000462"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:44:44.461411" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-05-01T00:44:44.461189" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.461172" elapsed="0.000478"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.461717" elapsed="0.000017"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.465158" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.465918" elapsed="0.000290"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.466508" elapsed="0.000262"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.462203" elapsed="0.004637"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:44:44.127036" elapsed="0.339979"/>
</kw>
<msg time="2026-05-01T00:44:44.467144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.126183" elapsed="0.341019"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:44:44.125712" elapsed="0.341572"/>
</kw>
<msg time="2026-05-01T00:44:44.467325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.125197" elapsed="0.342174"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.470044" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.470706" elapsed="0.000323"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.471202" elapsed="0.000110"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.467738" elapsed="0.003633"/>
</kw>
<msg time="2026-05-01T00:44:44.471490" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:44:44.124390" elapsed="0.347129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.471999" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.471737" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:44:44.472085" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:44:44.123532" elapsed="0.348680"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:44.123340" elapsed="0.348909"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:44.123213" elapsed="0.349072"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:44:44.119587" elapsed="0.352754"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:44:44.472514" elapsed="0.000213"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.486211" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.486100" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.486081" elapsed="0.000215"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.486605" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:44:44.486747" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.486448" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.487185" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.486927" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.487654" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.487378" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:44.488442" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:44:44.488205" elapsed="0.000358">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:44:44.488669" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:44:44.488713" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.487853" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.489033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:44.488812" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.488793" elapsed="0.000339"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:44.489914" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.489647" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:44:44.489988" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:44.490139" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.489330" elapsed="0.000874"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.490362" elapsed="0.000440"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.491079" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:44:44.491179" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.490973" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.491354" elapsed="0.002347"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.494128" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:44:44.674082" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.493865" elapsed="0.180318"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.677343" elapsed="0.000363"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.677869" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.678171" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.675128" elapsed="0.003195"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:44.674512" elapsed="0.003858"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.485822" elapsed="0.192600"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:44:44.473436" elapsed="0.205055"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.473073" elapsed="0.205473"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:44.472934" elapsed="0.205651"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:44:44.472785" elapsed="0.205838"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:44:44.101289" elapsed="0.577392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.681310" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.681197" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.681176" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.686133" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.686027" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.686009" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.687170" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:44.686772" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.687666" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:44.687355" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:44.687736" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:44:44.687897" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:44.686428" elapsed="0.001493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.693483" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.693360" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.693341" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.694789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:44.694662" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.694644" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:44.695338" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.695016" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.695764" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:44.695539" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.729958" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:44.696466" elapsed="0.033633"/>
</kw>
<msg time="2026-05-01T00:44:44.730237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:44.730283" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.695948" elapsed="0.034371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.798586" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "l "l "[78Cg "[A[78Cr
 "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:44.731216" elapsed="0.067619"/>
</kw>
<msg time="2026-05-01T00:44:44.799042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:44.799089" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.730664" elapsed="0.068461"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.799648" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:44.799248" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.799209" elapsed="0.000625"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.800428" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "l "l "[78Cg "[A[78Cr
 "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:44.799985" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.800863" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:44.800628" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.800609" elapsed="0.000430"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:44.801078" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.803211" elapsed="0.000496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.804050" elapsed="0.000316"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:44:44.804718" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:44.802388" elapsed="0.002662"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:44.801411" elapsed="0.003776"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:44.694335" elapsed="0.110955"/>
</kw>
<msg time="2026-05-01T00:44:44.805387" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:44.805516" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.693708" elapsed="0.111848"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:44.805747" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:44:44.805637" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.805618" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.806255" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.807068" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:44.807143" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:44.693071" elapsed="0.114183"/>
</kw>
<msg time="2026-05-01T00:44:44.807352" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:44.807396" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.688348" elapsed="0.119085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:44.807785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:44.807528" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:44.807509" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:44.688207" elapsed="0.119679"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:44.688026" elapsed="0.119897"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:44.685740" elapsed="0.122245"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:44:44.679287" elapsed="0.128757"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:44.678842" elapsed="0.129245"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:44:44.096165" elapsed="0.711978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.808678" level="INFO">${tools_system_conn_id} = 7</msg>
<var>${tools_system_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:44.808295" elapsed="0.000409"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.809197" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:44:44.808872" elapsed="0.000366"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:44:44.811081" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:44:44.811159" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:44:44.810762" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.811339" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:44:44.812781" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:44:45.476295" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:44:45 UTC 2026

  System load:  0.08               Processes:             106
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:40:55 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:44:44.812445" elapsed="0.664033"/>
</kw>
<msg time="2026-05-01T00:44:45.476571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.812086" elapsed="0.664569"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:44:44.810204" elapsed="0.666650"/>
</kw>
<msg time="2026-05-01T00:44:45.476908" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.809815" elapsed="0.667139"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:44:44.809433" elapsed="0.667597"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:45.477631" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19dc4410&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:44:45.477254" elapsed="0.000551"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.484942" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:44:45.493047" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/gobgp/gobgp.cfg' -&gt; '/home/jenkins//gobgp.cfg'</msg>
<arg>${GOBGP_FOLDER}/${GOBGP_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:44:45.478294" elapsed="0.014846"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.502080" level="INFO">2 files:
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:44:45.502252" level="INFO">@{cfgfiles} = [ exa-md5.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:44:45.493385" elapsed="0.008905"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.503141" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.516064" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/GOBGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.502893" elapsed="0.013300"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.516991" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.567870" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.516613" elapsed="0.051415"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.568906" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.619290" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.568435" elapsed="0.050988"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.620166" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.667061" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.619826" elapsed="0.047365"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.667941" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.719532" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.667591" elapsed="0.052074"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.720364" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:44:45.771162" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:44:45.771434" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.720055" elapsed="0.051490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:45.772928" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:45.772136" elapsed="0.000899"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:44:45.502679" elapsed="0.270435"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.774138" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:45.818526" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/GOBGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.773766" elapsed="0.044843"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.819271" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:45.867609" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.818888" elapsed="0.048853"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.868564" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:45.914935" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTERID/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.868105" elapsed="0.046959"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.915802" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:45.987604" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.915424" elapsed="0.072330"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:45.988739" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:46.034808" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:45.988295" elapsed="0.046645"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.035679" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:44:46.083207" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:44:46.083439" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:46.035307" elapsed="0.048231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:46.084651" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:46.083971" elapsed="0.000790"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:44:45.773403" elapsed="0.311435"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:44:45.502381" elapsed="0.582537"/>
</for>
<doc>Uploads gobgp config files</doc>
<status status="PASS" start="2026-05-01T00:44:45.478049" elapsed="0.607007"/>
</kw>
<kw name="Download_Gobgp_Binary">
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.095187" level="INFO">${tools_connection} = 8</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:44:46.094651" elapsed="0.000573"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:44:46.097647" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:44:46.097757" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:44:46.097224" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:46.098011" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.099680" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:44:46.469279" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:44:45 UTC 2026

  System load:  0.08               Processes:             106
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:44:45 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:44:46.099220" elapsed="0.370197"/>
</kw>
<msg time="2026-05-01T00:44:46.469510" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:46.098726" elapsed="0.370863"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:44:46.096575" elapsed="0.373124"/>
</kw>
<msg time="2026-05-01T00:44:46.469750" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:46.095981" elapsed="0.373815"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:44:46.095499" elapsed="0.374373"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-05-01T00:44:46.469928" elapsed="0.000044"/>
</return>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:44:46.094111" elapsed="0.375996"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.470537" level="INFO">Executing command 'wget https://github.com/osrg/gobgp/releases/download/v2.18.0/gobgp_2.18.0_linux_386.tar.gz'.</msg>
<msg time="2026-05-01T00:44:46.932236" level="INFO">Command exited with return code 0.</msg>
<arg>wget ${GOBGP_BINARY_URL}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:46.470335" elapsed="0.462158"/>
</kw>
<kw name="File Should Exist" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.977343" level="INFO">[chan 2] Opened sftp connection (server version 3)</msg>
<arg>./${FILE_NAME}</arg>
<doc>Fails if the given ``path`` does NOT point to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:44:46.932993" elapsed="0.046333"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:44:46.980137" level="INFO">Executing command 'tar -xzf gobgp_2.18.0_linux_386.tar.gz'.</msg>
<msg time="2026-05-01T00:44:47.184875" level="INFO">Command exited with return code 0.</msg>
<arg>tar -xzf ${FILE_NAME}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:44:46.979780" elapsed="0.205303"/>
</kw>
<doc>Downloads gobgp binary and untar the binary zip file</doc>
<status status="PASS" start="2026-05-01T00:44:46.085388" elapsed="1.100139"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:44.095873" elapsed="3.089778"/>
</kw>
<test id="s1-s6-t1" name="Reconfigure_ODL_To_Accept_Connections" line="40">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:44:47.192983" elapsed="0.000599"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:44:47.192354" elapsed="0.001353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.195394" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.195208" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.195176" elapsed="0.000350"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.202355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.202249" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.202231" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.203437" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.203045" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.203931" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:47.203638" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:47.204000" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:44:47.204164" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:47.202672" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.210095" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.209985" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.209966" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.211362" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.211255" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.211238" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:47.211912" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.211602" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.212314" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:47.212098" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.244950" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:47.212854" elapsed="0.032201"/>
</kw>
<msg time="2026-05-01T00:44:47.245221" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:47.245269" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.212518" elapsed="0.032788"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.272004" level="INFO">". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:47.245862" elapsed="0.026393"/>
</kw>
<msg time="2026-05-01T00:44:47.272541" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:47.272592" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.245521" elapsed="0.027109"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.273161" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.272777" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.272727" elapsed="0.000532"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.273941" level="INFO"> ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.273412" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.274409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.274182" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.274162" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:47.274552" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:47.277376" elapsed="0.000203"/>
</kw>
<msg time="2026-05-01T00:44:47.277644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.276249" elapsed="0.001534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.278070" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.278410" elapsed="0.000162"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:47.275584" elapsed="0.003138"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:47.274929" elapsed="0.003864"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:47.210956" elapsed="0.067939"/>
</kw>
<msg time="2026-05-01T00:44:47.278995" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:47.279040" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.210317" elapsed="0.068762"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:47.279270" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:44:47.279159" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.279140" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.279974" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.280336" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.280409" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:47.209641" elapsed="0.070901"/>
</kw>
<msg time="2026-05-01T00:44:47.280643" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:47.280688" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.204584" elapsed="0.076145"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.281064" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.280811" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.280793" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:47.204424" elapsed="0.076742"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:47.204246" elapsed="0.076960"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:47.201744" elapsed="0.079525"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:44:47.194762" elapsed="0.086566"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.194054" elapsed="0.087324"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:44:47.187268" elapsed="0.094171"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.282497" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.281727" elapsed="0.000804"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.304303" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.303934" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:44:47.305108" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:44:47.304840" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:44:47.305286" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:44:47.304507" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.305959" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.305525" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:44:47.306282" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:44:47.306473" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:44:47.306146" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.306897" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.306655" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.307898" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.307639" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.308359" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.308100" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.309082" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.308781" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.309890" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.309643" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.309966" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:44:47.310121" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.309296" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.310299" elapsed="0.000270"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:44:47.308643" elapsed="0.001967"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.311173" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.310875" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.312156" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.311943" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.312232" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.312385" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.311381" elapsed="0.001029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.312584" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:44:47.310725" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.313386" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.313091" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.314219" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.314008" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.314294" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:47.314446" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.313691" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.314638" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:44:47.312960" elapsed="0.001938"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.315433" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.315140" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.316183" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.315975" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.316258" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.316409" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.315660" elapsed="0.000773"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.316600" elapsed="0.000220"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:44:47.315010" elapsed="0.001850"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.317401" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.317105" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.318184" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.317976" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.318258" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.318408" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.317652" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.318599" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:47.316973" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.319402" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.319105" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.320151" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.319944" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.320224" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.320375" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.319629" elapsed="0.000770"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.320562" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:44:47.318974" elapsed="0.001850"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.321367" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.321073" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.322149" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.321940" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.322222" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.322379" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.321623" elapsed="0.000780"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.322566" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:47.320942" elapsed="0.001884"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.325104" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:44:47.323069" elapsed="0.002062"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:44:47.325946" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.325724" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:44:47.326021" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:47.326173" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:44:47.325359" elapsed="0.000839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.326348" elapsed="0.000240"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:44:47.322938" elapsed="0.003691"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:44:47.308438" elapsed="0.018227"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:44:47.326707" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:44:47.326868" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:44:47.307304" elapsed="0.019591"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.307010" elapsed="0.019917"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.327099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.326952" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.306991" elapsed="0.020185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.328052" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:47.327317" elapsed="0.000763"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:44:47.328130" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="PASS" start="2026-05-01T00:44:47.303317" elapsed="0.024938"/>
</kw>
<msg time="2026-05-01T00:44:47.328310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.302530" elapsed="0.025826"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.328867" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.329374" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.329928" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.330116" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.330290" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.330711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.330566" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:44:47.330552" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.330933" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.331101" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.331267" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:44:47.330521" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.330400" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.331508" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.331586" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:44:47.331707" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:44:47.298347" elapsed="0.033386"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.345997" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.345618" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:44:47.346741" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:44:47.346533" elapsed="0.000272">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:44:47.346897" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:44:47.346188" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.347480" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.347085" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:44:47.347803" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:44:47.347935" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:44:47.347669" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.348362" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.348120" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:44:47.348792" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.348503" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.349584" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.349072" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.348921" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.348484" elapsed="0.001190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.350571" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:47.349824" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:44:47.350652" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="PASS" start="2026-05-01T00:44:47.344976" elapsed="0.005804"/>
</kw>
<msg time="2026-05-01T00:44:47.350838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.344184" elapsed="0.006701"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.351379" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.351902" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.352403" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.352605" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.352777" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.353140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.352999" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:44:47.352985" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.353358" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.353540" elapsed="0.000043"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.353737" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:44:47.352956" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.352851" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.353966" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.354074" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:44:47.354208" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:44:47.341595" elapsed="0.012642"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:44:47.355497" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:44:47.355248" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:44:47.355655" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:44:47.354909" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.355994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.355750" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.356548" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.356240" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.356075" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.355732" elapsed="0.000900"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.358932" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.356782" elapsed="0.002177"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:44:47.359010" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:44:47.359164" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:44:47.354587" elapsed="0.004601"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.360588" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.360321" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.361024" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.360787" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.361487" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.361232" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.361950" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.361709" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:47.362809" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:44:47.362615" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:44:47.363169" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:44:47.362995" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.363340" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.363995" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.363746" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:44:47.364081" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:44:47.364242" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:44:47.362195" elapsed="0.002072"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:47.395667" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '987', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:44:47.395823" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0a7kdhw6v3abu13pmb3xuu7xlh6.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:44:47 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:47.396058" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:44:47.366605" elapsed="0.029510"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.364531" elapsed="0.031686"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.396658" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.396277" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.364320" elapsed="0.032538"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.402014" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.398758" elapsed="0.003333"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.398427" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.398401" elapsed="0.003821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.406009" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.402768" elapsed="0.003289"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.402347" elapsed="0.003745"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.402311" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.406705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:47.406293" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.407040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.406802" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.407600" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.407285" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.407122" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.406784" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.408205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:47.407843" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.408548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.408301" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.409141" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.408787" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-05-01T00:44:47.408629" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.408283" elapsed="0.000941"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.409376" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:44:47.410222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:44:47.409920" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.410402" elapsed="0.002292"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:44:47.397753" elapsed="0.015007"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:44:47.412937" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:44:47.412827" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.412809" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.413192" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.413260" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:44:47.415545" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:44:47.359539" elapsed="0.056033"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:44:47.415640" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:44:47.415795" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:44:47.287576" elapsed="0.128244"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.416165" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.415926" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.415909" elapsed="0.000350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:44:47.416293" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:44:47.282888" elapsed="0.133530"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-05-01T00:44:47.185797" elapsed="0.230768"/>
</test>
<test id="s1-s6-t2" name="Start_Gobgp" line="56">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:44:47.420044" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:44:47.419780" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.421312" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.421202" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.421183" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.426246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.426140" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.426122" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.427308" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.426931" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.427802" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:44:47.427509" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:44:47.427874" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:44:47.428032" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:44:47.426555" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.433517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.433390" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.433371" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.434781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:44:47.434674" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.434656" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:44:47.435291" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:44:47.434992" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.435713" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:47.435491" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.465675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:47.436230" elapsed="0.029558"/>
</kw>
<msg time="2026-05-01T00:44:47.465971" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:44:47.466019" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.435897" elapsed="0.030159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.485378" level="INFO">". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "a "r "t "_ "G "o "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:44:47.466592" elapsed="0.018901"/>
</kw>
<msg time="2026-05-01T00:44:47.485656" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:44:47.485727" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "a "r "t "_ "G "o "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.466226" elapsed="0.019540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.486067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.485845" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.485825" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.486601" level="INFO"> ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "a "r "t "_ "G "o "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.486287" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.486944" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.486730" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.486711" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:44:47.487057" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:44:47.489533" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:44:47.489748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.488505" elapsed="0.001376"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.490160" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.490517" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:44:47.487869" elapsed="0.002836"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:44:47.487321" elapsed="0.003448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:44:47.434348" elapsed="0.056522"/>
</kw>
<msg time="2026-05-01T00:44:47.490963" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:47.491063" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "a "r "t "_ "G "o "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.433754" elapsed="0.057354"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:44:47.491333" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:44:47.491224" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.491204" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.491835" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.492167" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:44:47.492238" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:44:47.433053" elapsed="0.059292"/>
</kw>
<msg time="2026-05-01T00:44:47.492437" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:44:47.492498" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "a "r "t "_ "G "o "b "g "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.428497" elapsed="0.064041"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:44:47.492861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:44:47.492614" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:44:47.492596" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:44:47.428337" elapsed="0.064624"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:44:47.428154" elapsed="0.064837"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:44:47.425780" elapsed="0.067266"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:44:47.420910" elapsed="0.072190"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.420474" elapsed="0.072671"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:44:47.417344" elapsed="0.075854"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.493723" level="INFO">${cmd} = gobgp.cfg &gt; gobgp.log</msg>
<var>${cmd}</var>
<arg>${GOBGP_CFG} &gt; ${GOBGP_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.493355" elapsed="0.000396"/>
</kw>
<kw name="Start_GoBgp_And_Verify_Connected" owner="GoBgpLib">
<kw name="Start_GoBgp" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.496733" level="INFO">${start_cmd} = /home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<var>${start_cmd}</var>
<arg>${GOBGP_EXECUTION_COMMAND} /home/jenkins/${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.496393" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.497153" level="INFO">/home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.496916" elapsed="0.000281"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:44:47.499429" level="INFO">/home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<msg time="2026-05-01T00:44:47.499538" level="INFO">${output} =  /home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:44:47.497343" elapsed="0.002222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.499966" level="INFO"> /home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.499723" elapsed="0.000288"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no gobgp is running. For verified
start use Start_GoBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:44:47.496078" elapsed="0.003988"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_GoBgps_Connection" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.501992" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:44:47.501612" elapsed="0.000407"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.502525" level="INFO">${exp_status_code} = [200, 201, 204]</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:44:47.502179" elapsed="0.000372"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:44:47.508692" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0a7kdhw6v3abu13pmb3xuu7xlh6.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:44:47.508837" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:44:47.508967" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${gobgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:44:47.502710" elapsed="0.006284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.511775" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:44:47.509160" elapsed="0.002687"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:44:47.515406" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:44:47.515563" level="FAIL">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:44:47.512067" elapsed="0.003677">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:44:47.501145" elapsed="0.014766">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<kw name="Verify_GoBgps_Connection" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:02.519049" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:02.518119" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:02.520327" level="INFO">${exp_status_code} = [200, 201, 204]</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:02.519542" elapsed="0.000847"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:02.530209" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0a7kdhw6v3abu13pmb3xuu7xlh6.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:02.531359" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1065'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:45:02.531573" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${gobgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:02.520789" elapsed="0.010830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:02.535338" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:02.531882" elapsed="0.003534"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:45:02.539063" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:45:02.539210" level="FAIL">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:45:02.535673" elapsed="0.003742">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:45:02.516792" elapsed="0.022845">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<kw name="Verify_GoBgps_Connection" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.543051" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:17.542053" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.544317" level="INFO">${exp_status_code} = [200, 201, 204]</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:17.543545" elapsed="0.000830"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:17.554978" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0a7kdhw6v3abu13pmb3xuu7xlh6.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:17.555164" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1065'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:45:17.555269" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${gobgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:17.544772" elapsed="0.010522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.558652" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.555492" elapsed="0.003237"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.564028" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:45:17.564218" level="FAIL">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.559002" elapsed="0.005482">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:45:17.540757" elapsed="0.023948">ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<msg time="2026-05-01T00:45:17.564878" level="FAIL">Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</msg>
<arg>${connection_retries}x</arg>
<arg>15s</arg>
<arg>Verify_GoBgps_Connection</arg>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:44:47.500615" elapsed="30.064431">Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or a real number, not 'list'</status>
</kw>
<msg time="2026-05-01T00:45:17.565260" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:45:17.565342" level="INFO">${value} = Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ValueError: '[200, 201, 204]' cannot be converted to a floating point number: float() argument must be a string or...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${connection_retries}x</arg>
<arg>15s</arg>
<arg>Verify_GoBgps_Connection</arg>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:44:47.500220" elapsed="30.065166"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.566930" level="INFO">[?2004l</msg>
<msg time="2026-05-01T00:45:17.567071" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:45:17.566702" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.567875" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.567397" elapsed="0.000566"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.569382" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.568861" elapsed="0.000667"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:17.569764" elapsed="0.000586"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:45:17.568339" elapsed="0.002133"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.573781" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:45:17.573875" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:17.570700" elapsed="0.003201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.574330" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.574057" elapsed="0.000321"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:45:17.566131" elapsed="0.008304"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.565598" elapsed="0.008883"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.565552" elapsed="0.008962"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:45:17.574695" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.574574" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.574557" elapsed="0.000210"/>
</if>
<arg>${cmd}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Starts the GoBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib. [Gobgp at times might take more time, hence the loop]</doc>
<status status="PASS" start="2026-05-01T00:44:47.494043" elapsed="30.080772"/>
</kw>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:44:47.416804" elapsed="30.158140"/>
</test>
<test id="s1-s6-t3" name="Delete_Bgp_Peer_Configuration" line="61">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:17.578292" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:17.577843" elapsed="0.000744"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.579636" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.579517" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.579495" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.584900" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.584793" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.584775" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.585993" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:17.585598" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.586525" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:17.586183" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:17.586599" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:45:17.586766" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:17.585202" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.592167" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.592058" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.592039" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.593426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.593319" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.593301" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:17.593983" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.593671" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.594422" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:17.594167" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.623968" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:17.594967" elapsed="0.029109"/>
</kw>
<msg time="2026-05-01T00:45:17.624243" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:17.624289" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.594629" elapsed="0.029696"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.659354" level="INFO">". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:17.625061" elapsed="0.034496"/>
</kw>
<msg time="2026-05-01T00:45:17.659779" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:17.659826" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.624714" elapsed="0.035148"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.660301" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.659988" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.659950" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.660939" level="INFO"> ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.660564" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.661293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.661078" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.661060" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:17.661410" elapsed="0.000063"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:17.664057" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:45:17.664264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:17.663019" elapsed="0.001394"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.664916" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.665397" elapsed="0.000094"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:17.662353" elapsed="0.003254"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:17.661768" elapsed="0.003904"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:17.593017" elapsed="0.072753"/>
</kw>
<msg time="2026-05-01T00:45:17.665863" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:17.665907" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.592389" elapsed="0.073556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:17.666129" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-05-01T00:45:17.666021" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.666003" elapsed="0.000250"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.666684" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.667022" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.667094" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:17.591716" elapsed="0.075485"/>
</kw>
<msg time="2026-05-01T00:45:17.667294" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:17.667338" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.587180" elapsed="0.080195"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.667714" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.667463" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.667433" elapsed="0.000420"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:17.587034" elapsed="0.080843"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:17.586851" elapsed="0.081060"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:17.584417" elapsed="0.083552"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:17.579201" elapsed="0.088824"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.578746" elapsed="0.089327"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:17.575741" elapsed="0.092386"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.669055" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.668325" elapsed="0.000759"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.699301" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:17.698929" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:17.700103" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.699839" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:17.700279" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:17.699508" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.700864" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:17.700479" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:17.701188" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:17.701359" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:17.701052" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.701798" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.701557" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.702825" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.702567" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.703292" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.703032" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.704000" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.703704" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.704928" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.704702" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.705004" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:17.705155" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.704213" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.705333" elapsed="0.000305"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:45:17.703569" elapsed="0.002111"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.706236" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.705926" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.706992" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.706785" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.707067" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:17.707219" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.706467" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.707392" elapsed="0.000238"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:45:17.705794" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.708208" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.707913" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.708955" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.708749" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.709030" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:17.709180" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.708419" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.709353" elapsed="0.000237"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:45:17.707783" elapsed="0.001847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.710186" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.709877" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.710936" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.710726" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.711012" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:17.711163" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.710396" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.711336" elapsed="0.000235"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:45:17.709744" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.712150" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.711856" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.712902" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.712693" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.712977" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:17.713129" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.712361" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.713301" elapsed="0.000234"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:17.711725" elapsed="0.001851"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.714154" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.713820" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.715080" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.714701" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.715155" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:17.715305" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.714371" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.715496" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:45:17.713689" elapsed="0.002104"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.716335" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.716040" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.717079" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.716872" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.717154" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:17.717303" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.716560" elapsed="0.000767"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.717489" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:17.715909" elapsed="0.001841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.718302" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:17.717992" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:17.719052" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.718845" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:17.719127" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:17.719277" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:17.718531" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.719463" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:17.717862" elapsed="0.001865"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:45:17.703369" elapsed="0.016393"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:17.719804" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:45:17.719962" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:17.702233" elapsed="0.017755"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.701911" elapsed="0.018109"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.720192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.720045" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.701892" elapsed="0.018376"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.721129" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.720408" elapsed="0.000750"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:17.721207" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="PASS" start="2026-05-01T00:45:17.698302" elapsed="0.023027"/>
</kw>
<msg time="2026-05-01T00:45:17.721382" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:17.697503" elapsed="0.023925"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.721943" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.722476" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.723018" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.723204" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.723374" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.723753" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.723611" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:17.723597" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.723970" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.724135" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.724300" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:17.723568" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.723463" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.724537" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.724614" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:17.724735" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:17.693292" elapsed="0.031469"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.725851" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.725606" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:17.737815" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0a7kdhw6v3abu13pmb3xuu7xlh6.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:17.737864" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:17.737994" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:17.728172" elapsed="0.009884"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.725963" elapsed="0.012158"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.738367" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.738157" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.725945" elapsed="0.012611"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.743201" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.739951" elapsed="0.003309"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.739650" elapsed="0.003659"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.739626" elapsed="0.003718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.746953" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.743745" elapsed="0.003254"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.743420" elapsed="0.003613"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.743397" elapsed="0.003661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.747611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.747221" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.747941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.747708" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.748489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:17.748181" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.748022" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.747690" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.749087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.748729" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.749410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.749181" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.749963" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:17.749666" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:17.749506" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.749164" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:17.750210" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:17.751011" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.750733" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.751187" elapsed="0.002277"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:17.739062" elapsed="0.014466"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:45:17.753574" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:45:17.755785" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:45:17.725025" elapsed="0.030787"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:17.755866" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:45:17.669324" elapsed="0.086670"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:45:17.575179" elapsed="0.180933"/>
</test>
<test id="s1-s6-t4" name="Stop_All_Gobgps" line="74">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:17.759305" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:17.759044" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.760594" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.760482" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.760447" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.768071" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.767955" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.767936" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.769239" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:17.768839" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.769734" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:17.769425" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:17.769804" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:17.769960" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:17.768448" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.775419" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.775311" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.775292" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.776677" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:17.776571" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.776553" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:17.777195" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:17.776889" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.777622" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:17.777379" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.806370" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:17.778154" elapsed="0.028338"/>
</kw>
<msg time="2026-05-01T00:45:17.806656" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:17.806702" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.777804" elapsed="0.028935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.824946" level="INFO">". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "G "o "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:17.807248" elapsed="0.017799"/>
</kw>
<msg time="2026-05-01T00:45:17.825207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:17.825251" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "G "o "b "g "p "s "[K"
[?1l&gt;[?2...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.806909" elapsed="0.018380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.825609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.825366" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.825347" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.826137" level="INFO"> ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "G "o "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.825826" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.826496" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.826267" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.826249" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:17.826608" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:17.829143" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:45:17.829348" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:17.828036" elapsed="0.001464"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.829812" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.830175" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:17.827404" elapsed="0.002961"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:17.826880" elapsed="0.003549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:17.776246" elapsed="0.054303"/>
</kw>
<msg time="2026-05-01T00:45:17.830641" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:17.830685" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "G "o "b "g "p "s "[K"
[?1l&gt;[?2...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.775657" elapsed="0.055067"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:17.831069" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:17.830800" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.830782" elapsed="0.000375"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.831570" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.831902" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:17.831973" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:17.774974" elapsed="0.057108"/>
</kw>
<msg time="2026-05-01T00:45:17.832172" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:17.832215" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "L "l "g "r "[C "B "a "s "i "c ". "S "t "o "p "_ "A "l "l "_ "G "o "b "g "p "s "[K"
[?1l&gt;[?2...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.770479" elapsed="0.061775"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:17.832592" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:17.832328" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:17.832311" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:17.770312" elapsed="0.062381"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:17.770119" elapsed="0.062605"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:17.767530" elapsed="0.065251"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:17.760179" elapsed="0.072656"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.759741" elapsed="0.073139"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:17.756836" elapsed="0.076097"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.841730" level="INFO">Executing command 'cat gobgp.log'.</msg>
<msg time="2026-05-01T00:45:17.855231" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:17.855494" level="INFO">${output_log} = {"level":"info","msg":"gobgpd started","time":"2026-05-01T00:44:47Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-05-01T00:44:47Z"}
{"level":"info","msg":"Pe...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:17.841587" elapsed="0.013971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.856531" level="INFO">{"level":"info","msg":"gobgpd started","time":"2026-05-01T00:44:47Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-05-01T00:44:47Z"}
{"level":"info","msg":"Peer 10.30.170.185 is added","time":"2026-05-01T00:44:47Z"}
{"Topic":"Peer","level":"info","msg":"Add a peer configuration for:10.30.170.185","time":"2026-05-01T00:44:47Z"}
{"Duration":0,"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2026-05-01T00:44:47Z"}
{"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2026-05-01T00:44:47Z"}
{"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"try to connect","time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_OPENSENT","old":"BGP_FSM_ACTIVE","reason":{"Type":11,"BGPNotification":null,"Data":null},"time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_OPENCONFIRM","old":"BGP_FSM_OPENSENT","reason":{"Type":12,"BGPNotification":null,"Data":null},"time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ESTABLISHED","old":"BGP_FSM_OPENCONFIRM","reason":{"Type":13,"BGPNotification":null,"Data":null},"time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","Topic":"Peer","attributes":[],"level":"debug","msg":"received update","nlri":[],"time":"2026-05-01T00:44:55Z","withdrawals":[]}
{"AddressFamily":65537,"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"EOR received","time":"2026-05-01T00:44:55Z"}
{"Key":"10.30.170.185","Topic":"Peer","attributes":[],"level":"debug","msg":"received update","nlri":[],"time":"2026-05-01T00:44:55Z","withdrawals":[]}
{"AddressFamily":65537,"Key":"10.30.170.185","Topic":"Peer","level":"debug","msg":"EOR received","time":"2026-05-01T00:44:55Z"}</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.855924" elapsed="0.000810"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:17.857844" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/gobgp.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/gobgp.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:17.857116" elapsed="0.000903"/>
</kw>
<arg>${GOBGP_LOG}</arg>
<arg>${GOBGP_LOG}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:17.841192" elapsed="0.016960"/>
</kw>
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.859392" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:45:17.859167" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.860031" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.859674" elapsed="0.000420"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.861278" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.860797" elapsed="0.000520"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:17.861560" elapsed="0.000266"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:45:17.860386" elapsed="0.001539"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.896680" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:45:17.896838" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:17.862143" elapsed="0.034724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.897388" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.897084" elapsed="0.000352"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:45:17.858697" elapsed="0.038818"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-05-01T00:45:17.756323" elapsed="0.141309"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:45:17.898493" elapsed="0.000534"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:17.899263" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:45:17.899186" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.900421" level="INFO">${output} = None</msg>
<msg time="2026-05-01T00:45:17.900480" level="FAIL">No open connection.</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.900239" elapsed="0.000616">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.901295" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.901043" elapsed="0.000297"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.902163" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:17.901846" elapsed="0.000345"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.902530" level="FAIL">No open connection.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.902340" elapsed="0.000834">No open connection.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.901616" elapsed="0.001693">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:17.903652" level="INFO">${output} = None</msg>
<msg time="2026-05-01T00:45:17.903693" level="FAIL">No open connection.</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:45:17.903493" elapsed="0.000403">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:17.904308" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:17.904062" elapsed="0.000289"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="FAIL" start="2026-05-01T00:45:17.900025" elapsed="0.004458">Several failures occurred:

1) No open connection.

2) No open connection.

3) No open connection.</status>
</kw>
<arg>GoBgpLib.Stop_GoBgp</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:17.899580" elapsed="0.004955"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:45:17.898233" elapsed="0.006352"/>
</kw>
<doc>Functional test for ipv6 connection with bgp.

Copyright (c) 2020 Lumina Networks Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests simple connection between one ibgp peer (goabgp) and Odl.
Peer is configured with ipv6, and gobgp connectes to odl via ipv6.</doc>
<status status="PASS" start="2026-05-01T00:44:44.012578" elapsed="33.892037"/>
</suite>
<suite id="s1-s7" name="Bgp App Peer Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.006957" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:45:18.002519" elapsed="0.004494"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:45:18.002248" elapsed="0.005018"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.012352" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:45:18.008524" elapsed="0.003857"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:45:18.012623" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.012485" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.012446" elapsed="0.000254"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.013213" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:45:18.012856" elapsed="0.000399"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.013800" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:45:18.013417" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:45:18.014397" elapsed="0.000391"/>
</kw>
<msg time="2026-05-01T00:45:18.014890" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:18.014936" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.014034" elapsed="0.000924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.015523" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:18.015128" elapsed="0.000421"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.016552" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:18.016269" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.016982" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:18.016728" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.017477" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.017167" elapsed="0.000339"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.020919" elapsed="0.000230"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.021658" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:18.021312" elapsed="0.000388"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.021909" elapsed="0.000258"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.022987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:18.022688" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:45:18.023061" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:45:18.023228" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.022372" elapsed="0.000881"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:18.023871" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19dadad0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:45:18.023414" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.024193" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:45:18.020308" elapsed="0.004136"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:18.020108" elapsed="0.004396"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:45:18.017567" elapsed="0.006972"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.025119" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:45:18.024712" elapsed="0.000450"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.025787" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:45:18.025326" elapsed="0.000513"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.026405" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:45:18.026017" elapsed="0.000484"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:45:18.015818" elapsed="0.010742"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:45:18.008160" elapsed="0.018455"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.026799" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.026681" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.026662" elapsed="0.000205"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.030038" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:18.029602" elapsed="0.000463"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.030540" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:18.030227" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:18.030610" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:18.030766" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:18.029260" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:18.031799" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.031525" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.032611" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:45:18.032713" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.032413" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.036362" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:18.035775" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.035756" elapsed="0.000750"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.037153" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:45:18.037384" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.036711" elapsed="0.000727"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.038480" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.037775" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.039796" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.038869" elapsed="0.000979"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.041595" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:45:18.041806" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:45:18.041224" elapsed="0.000634"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.042208" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.043844" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:45:18.619529" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:45:18 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:44:44 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:45:18.043515" elapsed="0.576330"/>
</kw>
<msg time="2026-05-01T00:45:18.619931" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.043051" elapsed="0.577051"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:45:18.040288" elapsed="0.579966"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.621203" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:45:18.634086" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:45:18.634321" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:45:18.634495" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:18.620669" elapsed="0.013900"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.635012" elapsed="0.001199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.639420" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.637821" elapsed="0.001914"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.641056" elapsed="0.000171"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.640113" elapsed="0.001373"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.640057" elapsed="0.001529"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:45:18.642539" elapsed="0.000201"/>
</return>
<status status="PASS" start="2026-05-01T00:45:18.641805" elapsed="0.001180"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.641752" elapsed="0.001361"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.643312" elapsed="0.000056"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.648905" elapsed="0.000475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.649688" elapsed="0.000307"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.650266" elapsed="0.000244"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.645041" elapsed="0.005542"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:45:18.034815" elapsed="0.615956"/>
</kw>
<msg time="2026-05-01T00:45:18.650830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.033977" elapsed="0.616907"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:45:18.033411" elapsed="0.617556"/>
</kw>
<msg time="2026-05-01T00:45:18.651009" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.032899" elapsed="0.618158"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.653866" elapsed="0.000324"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.654360" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.654681" elapsed="0.000099"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.651359" elapsed="0.003473"/>
</kw>
<msg time="2026-05-01T00:45:18.654923" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:45:18.032049" elapsed="0.622900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.655388" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.655135" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:45:18.655502" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:45:18.031150" elapsed="0.624480"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:18.030967" elapsed="0.624743"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:18.030841" elapsed="0.624910"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:45:18.027097" elapsed="0.628714"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:45:18.655973" elapsed="0.000213"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.670304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.670192" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.670173" elapsed="0.000202"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.670684" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:45:18.670788" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.670545" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.671227" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.670970" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.671681" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.671423" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:18.672494" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:45:18.672245" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:45:18.672717" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:45:18.672762" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.671883" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.673108" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:18.672876" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.672856" elapsed="0.000351"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:18.673985" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.673708" elapsed="0.000303"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:45:18.674060" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:18.674211" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.673411" elapsed="0.000824"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.674389" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.675083" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:45:18.675181" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.674979" elapsed="0.000229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.675358" elapsed="0.002466"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.678257" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:45:18.807109" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.677991" elapsed="0.129276"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.810963" elapsed="0.000378"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.811535" elapsed="0.000180"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.811867" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.808543" elapsed="0.003485"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:18.807812" elapsed="0.004269"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.669902" elapsed="0.142234"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:18.657085" elapsed="0.155102"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.656679" elapsed="0.155562"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:18.656436" elapsed="0.155846"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:45:18.656248" elapsed="0.156075"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:45:18.007682" elapsed="0.804703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.815170" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.815034" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.815008" elapsed="0.000263"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.820219" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.820109" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.820091" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.821330" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:18.820928" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.821837" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:18.821535" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:18.821908" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:45:18.822081" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:18.820537" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.828117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.828007" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.827988" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.829495" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:18.829337" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.829318" elapsed="0.000248"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:18.830070" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.829730" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.830512" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:18.830263" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.864442" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:18.831229" elapsed="0.033371"/>
</kw>
<msg time="2026-05-01T00:45:18.864734" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:18.864780" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.830702" elapsed="0.034116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.931674" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "b "g "p "_ "a "p "p "[78C_ "[A[78Cp
 "e "e "r "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:18.865578" elapsed="0.066321"/>
</kw>
<msg time="2026-05-01T00:45:18.932082" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:18.932129" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.865046" elapsed="0.067122"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.932641" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:18.932284" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.932248" elapsed="0.000580"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.933403" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "b "g "p "_ "a "p "p "[78C_ "[A[78Cp
 "e "e "r "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:18.932981" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.933821" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:18.933580" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.933561" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:18.934036" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.936321" elapsed="0.000490"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.937157" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:45:18.937822" elapsed="0.000247"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:18.935299" elapsed="0.002860"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:18.934369" elapsed="0.003927"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:18.829043" elapsed="0.109357"/>
</kw>
<msg time="2026-05-01T00:45:18.938511" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:18.938558" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.828369" elapsed="0.110228"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:18.938787" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:45:18.938677" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.938658" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.939297" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.939835" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:18.939908" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:18.827684" elapsed="0.112335"/>
</kw>
<msg time="2026-05-01T00:45:18.940117" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:18.940160" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.822505" elapsed="0.117696"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:18.940574" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:18.940277" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:18.940260" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:18.822343" elapsed="0.118395"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:18.822163" elapsed="0.118610"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:18.819814" elapsed="0.121021"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:45:18.813055" elapsed="0.127838"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:18.812578" elapsed="0.128359"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:45:18.001611" elapsed="0.939379"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-01T00:45:18.941147" elapsed="0.000183"/>
</kw>
<kw name="Open_BGP_Peer_Console">
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>alias=bgp_peer_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:18.941701" elapsed="0.000225"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:45:18.943903" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:45:18.943982" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:45:18.943612" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.944168" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:45:18.945368" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:45:19.329649" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:44:45 UTC 2026

  System load:  0.08               Processes:             106
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:44:46 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:45:18.945042" elapsed="0.384758"/>
</kw>
<msg time="2026-05-01T00:45:19.329885" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.944685" elapsed="0.385279"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:45:18.942867" elapsed="0.387208"/>
</kw>
<msg time="2026-05-01T00:45:19.330127" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:18.942473" elapsed="0.387699"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:45:18.942125" elapsed="0.388124"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-05-01T00:45:18.941484" elapsed="0.388816"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.331717" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-05-01T00:45:19.344268" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:19.344596" level="INFO">${stdout} = usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_ins...</msg>
<msg time="2026-05-01T00:45:19.344712" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:45:19.344812" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:19.331509" elapsed="0.013358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.346908" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:45:19.346231" elapsed="0.000787"/>
</kw>
<msg time="2026-05-01T00:45:19.347244" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:45:19.347350" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.345322" elapsed="0.002083"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.348952" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:19.347849" elapsed="0.001146"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.349609" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:19.349110" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.349081" elapsed="0.000726"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:45:19.350028" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:45:19.349887" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.349864" elapsed="0.000292"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.350287" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.350236" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:19.350215" elapsed="0.000160"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.350597" elapsed="0.000031"/>
</kw>
<msg time="2026-05-01T00:45:19.350806" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>python3 --help</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:45:19.331139" elapsed="0.019702"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:45:19.351065" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:45:19.350938" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.350914" elapsed="0.000262"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.351379" elapsed="0.000030"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:19.330689" elapsed="0.020820"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.353549" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:45:19.415520" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:19.415763" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:45:19.415857" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:45:19.415966" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:19.353001" elapsed="0.063021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.417818" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:45:19.417205" elapsed="0.000715"/>
</kw>
<msg time="2026-05-01T00:45:19.418125" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:45:19.418221" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.416420" elapsed="0.001851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.419624" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:19.418671" elapsed="0.001013"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.420662" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:19.419857" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.419814" elapsed="0.001042"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:45:19.421191" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:45:19.420978" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.420944" elapsed="0.000435"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.421610" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.421532" elapsed="0.000167"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:19.421495" elapsed="0.000252"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.422063" elapsed="0.000046"/>
</kw>
<msg time="2026-05-01T00:45:19.422383" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:45:19.352486" elapsed="0.069952"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:45:19.422820" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-05-01T00:45:19.422620" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.422583" elapsed="0.000411"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.423317" elapsed="0.000047"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:45:19.351855" elapsed="0.071668"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.460164" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:45:19.475163" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:45:19.423855" elapsed="0.051406"/>
</kw>
<kw name="Open_BGP_Aplication_Peer_Console">
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>alias=bgp_app_peer_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:45:19.476028" elapsed="0.000387"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.478844" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:45:19.478954" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:45:19.478447" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:19.479208" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.480915" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:45:19.854653" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:44:45 UTC 2026

  System load:  0.08               Processes:             106
  Usage of /:   19.4% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:45:19 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:45:19.480472" elapsed="0.374354"/>
</kw>
<msg time="2026-05-01T00:45:19.854910" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:19.479953" elapsed="0.375037"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:45:19.477829" elapsed="0.377272"/>
</kw>
<msg time="2026-05-01T00:45:19.855153" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:19.477206" elapsed="0.377993"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:45:19.476726" elapsed="0.378549"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-05-01T00:45:19.475637" elapsed="0.379691"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.867072" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:45:19.885408" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/bgp_app_peer.py' -&gt; '/home/jenkins//bgp_app_peer.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/bgp_app_peer.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:45:19.855586" elapsed="0.029961"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.904344" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/ipv4-routes-template.xml.oxygen' -&gt; '/home/jenkins//ipv4-routes-template.xml.oxygen'</msg>
<msg time="2026-05-01T00:45:19.904442" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/ipv4-routes-template.xml' -&gt; '/home/jenkins//ipv4-routes-template.xml'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/ipv4-routes-template.xml*</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:45:19.885891" elapsed="0.018702"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:19.905802" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19d948d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:45:19.905039" elapsed="0.001101"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
put Python tool to mininet machine, setup imported resources.</doc>
<status status="PASS" start="2026-05-01T00:45:18.000273" elapsed="1.906020"/>
</kw>
<test id="s1-s7-t1" name="Reconfigure_ODL_To_Accept_BGP_Peer_Connection" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:19.913788" elapsed="0.000366"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:19.913356" elapsed="0.000902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.916025" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.915773" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.915736" elapsed="0.000406"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.924035" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.923847" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.923813" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.925443" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:19.924991" elapsed="0.000577"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:19.926120" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:19.925781" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:19.926195" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:45:19.926363" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:19.924524" elapsed="0.001864"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.932604" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.932473" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.932429" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:19.934119" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:19.933990" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.933971" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:19.934745" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:19.934387" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.935204" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:19.934973" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.967053" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:19.935814" elapsed="0.031374"/>
</kw>
<msg time="2026-05-01T00:45:19.967407" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:19.967475" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.935429" elapsed="0.032087"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:19.999212" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "B "G "P "_ "P "e "e "r "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:19.968057" elapsed="0.031297"/>
</kw>
<msg time="2026-05-01T00:45:19.999533" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:19.999580" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.967697" elapsed="0.031919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:19.999931" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:19.999698" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:19.999677" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.000489" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "B "G "P "_ "P "e "e "r "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.000158" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.000854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.000635" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.000616" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:20.000967" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.003696" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:45:20.003906" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.002492" elapsed="0.001550"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.004323" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.004852" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:20.001843" elapsed="0.003213"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:20.001281" elapsed="0.003840"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:19.933627" elapsed="0.071593"/>
</kw>
<msg time="2026-05-01T00:45:20.005315" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.005361" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.932879" elapsed="0.072520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:20.005615" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.005504" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.005484" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.006107" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.006447" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.006535" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:19.932018" elapsed="0.074627"/>
</kw>
<msg time="2026-05-01T00:45:20.006741" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.006785" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.926801" elapsed="0.080021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.007151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.006898" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.006881" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:19.926653" elapsed="0.080612"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:19.926448" elapsed="0.080851"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:19.923237" elapsed="0.084119"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:19.915289" elapsed="0.092126"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:19.914565" elapsed="0.092913"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:19.908538" elapsed="0.098997"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.008578" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exam...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.007732" elapsed="0.000876"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.042538" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.042149" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.043340" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.043064" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.043534" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.042731" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.044157" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.043768" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.044503" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.044669" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.044348" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.045097" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.044853" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.046105" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.045846" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.046590" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.046311" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.047306" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.046984" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.048082" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.047857" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.048158" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.048310" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.047539" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.048503" elapsed="0.000242"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:45:20.046848" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.049329" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.049032" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.050235" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.050024" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.050310" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.050475" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.049557" elapsed="0.000944"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.050654" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:45:20.048899" elapsed="0.002017"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.051483" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.051162" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.052223" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.052013" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.052297" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.052448" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.051698" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.052640" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:45:20.051029" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.053449" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.053151" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.054426" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.054207" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.054518" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:45:20.054675" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.053857" elapsed="0.000842"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.054850" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:45:20.053017" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.055692" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.055372" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.056429" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.056221" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.056519" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.056671" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.055906" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.056846" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:45:20.055238" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.057669" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.057352" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.058404" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.058196" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.058494" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.058646" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.057881" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.058819" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:45:20.057218" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.059668" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.059352" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.060406" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.060199" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.060496" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.060648" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.059881" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.060823" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:20.059216" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.061837" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.061330" elapsed="0.000533"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.062585" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.062363" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.062660" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.062812" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.062050" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.062986" elapsed="0.000234"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:45:20.061196" elapsed="0.002065"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.063820" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.063523" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.064618" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.064390" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.064693" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.064843" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.064076" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.065019" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:20.063373" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.065836" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.065539" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.066585" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.066360" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.066660" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.066809" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.066047" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.066984" elapsed="0.000230"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:20.065391" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:45:20.046666" elapsed="0.020623"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:20.067333" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:45:20.067511" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:20.045522" elapsed="0.022017"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.045210" elapsed="0.022361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.067748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.067598" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.045191" elapsed="0.022632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.068734" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.067969" elapsed="0.000794"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.068812" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.041534" elapsed="0.027403"/>
</kw>
<msg time="2026-05-01T00:45:20.068992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.028872" elapsed="0.040169"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.081628" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.094484" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.106998" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.107233" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.107419" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.107815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.107667" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.107651" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.108034" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.108200" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.108364" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.107620" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.107514" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.108607" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.108683" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.108812" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.024602" elapsed="0.084236"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.135442" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.135042" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.136224" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.135986" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.136395" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.135651" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.136985" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.136601" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.137310" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.137484" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.137175" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.137915" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.137672" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:20.138381" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.138081" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.138928" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.138631" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.138481" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.138062" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.139979" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.139181" elapsed="0.000834"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.140069" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.134421" elapsed="0.005777"/>
</kw>
<msg time="2026-05-01T00:45:20.140256" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.121702" elapsed="0.018601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.154130" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.166553" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.178927" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.179156" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.179337" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.179734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.179585" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.179569" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.179959" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.180128" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.180294" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.179537" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.179415" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.180593" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.180673" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.180816" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.119016" elapsed="0.061829"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.182161" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.181901" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.182326" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.181541" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.182690" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.182420" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.183255" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.182951" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.182771" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.182402" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.185694" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.183506" elapsed="0.002214"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:20.185771" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.185926" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:20.181186" elapsed="0.004764"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.187444" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.187096" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.187906" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.187669" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.188359" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.188116" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.188810" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.188570" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:20.189685" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:45:20.189486" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:45:20.190059" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:45:20.189884" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.190274" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.190908" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.190661" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:45:20.190995" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.191182" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:45:20.189061" elapsed="0.002147"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:20.208991" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1079', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:45:20.209109" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:45:20 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:20.209397" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:20.193540" elapsed="0.015896"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.191279" elapsed="0.018263"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.209800" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.209581" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.191261" elapsed="0.018728"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.214828" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.211397" elapsed="0.003492"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.211084" elapsed="0.003853"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.211058" elapsed="0.003915"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.218684" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.215394" elapsed="0.003356"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.215082" elapsed="0.003715"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.215056" elapsed="0.003776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.219634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.219078" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.220105" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.219773" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.220946" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.220527" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.220219" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.219748" elapsed="0.001317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.221818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.221291" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.222279" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.221953" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.223122" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.222695" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.222441" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.221929" elapsed="0.001311"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.223472" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:20.224611" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.224191" elapsed="0.000457"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.224868" elapsed="0.003351"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:20.210564" elapsed="0.017718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:45:20.228473" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.228351" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.228331" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.228716" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.228784" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:20.231076" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:20.186285" elapsed="0.044818"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.231167" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:45:20.231322" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:20.013659" elapsed="0.217688"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.231709" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.231465" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.231428" elapsed="0.000372"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.231833" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:45:20.008890" elapsed="0.223066"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.232562" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.232242" elapsed="0.000623"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:19.906430" elapsed="0.326475"/>
</test>
<test id="s1-s7-t2" name="Reconfigure_ODL_To_Accept_BGP_Application_Peer" line="120">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:20.236969" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:20.236705" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.238238" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.238126" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.238108" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.243377" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.243268" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.243251" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.244447" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.244066" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.244995" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:20.244694" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:20.245066" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.245222" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.243691" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.250716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.250609" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.250590" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.252041" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.251935" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.251917" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:20.252570" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.252256" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.252975" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.252756" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.283426" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:20.253512" elapsed="0.030075"/>
</kw>
<msg time="2026-05-01T00:45:20.283791" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:20.283839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.253161" elapsed="0.030715"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.314093" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:20.284497" elapsed="0.029711"/>
</kw>
<msg time="2026-05-01T00:45:20.314370" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:20.314416" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.284085" elapsed="0.030404"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.314848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.314594" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.314564" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.315398" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.315092" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.315775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.315559" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.315541" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:20.315889" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.318718" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:45:20.318987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.317436" elapsed="0.001690"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.319432" elapsed="0.000187"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.319957" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:20.316792" elapsed="0.003354"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:20.316215" elapsed="0.003996"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:20.251634" elapsed="0.068674"/>
</kw>
<msg time="2026-05-01T00:45:20.320400" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.320444" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.250937" elapsed="0.069562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:20.320687" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.320578" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.320559" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.321187" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.321548" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.321621" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:20.250258" elapsed="0.071471"/>
</kw>
<msg time="2026-05-01T00:45:20.321822" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.321866" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.245638" elapsed="0.076264"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.322226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.321977" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.321960" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:20.245493" elapsed="0.076833"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:20.245302" elapsed="0.077058"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:20.242900" elapsed="0.079517"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:20.237838" elapsed="0.084651"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.237392" elapsed="0.085143"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:20.234125" elapsed="0.088461"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.323437" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=${BGP_PEER_APP_NAME}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>IP=${BGP_APP_PEER_ID}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.322785" elapsed="0.000704"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.357343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.356970" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.358173" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.357887" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.358349" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.357552" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.359002" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.358553" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.359337" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.359522" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.359199" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.359948" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.359706" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.360956" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.360699" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.361421" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.361161" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.362132" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.361838" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.362918" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.362686" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.362994" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.363146" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.362349" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.363323" elapsed="0.000262"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:45:20.361700" elapsed="0.001925"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.364166" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.363873" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.364952" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.364743" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.365028" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.365177" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.364378" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.365352" elapsed="0.000236"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:45:20.363739" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.366334" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.365876" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.367103" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.366895" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.367177" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.367326" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.366566" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.367517" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:20.365741" elapsed="0.002040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.368325" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.368029" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.369077" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.368871" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.369187" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.369341" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.368554" elapsed="0.000811"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.369535" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:45:20.367894" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.370339" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.370045" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:45:20.371118" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.370908" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:45:20.371192" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.371342" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:45:20.370567" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.371534" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:45:20.369909" elapsed="0.001886"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:45:20.361518" elapsed="0.010312"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:20.371873" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:45:20.372029" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:20.360358" elapsed="0.011697"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.360061" elapsed="0.012026"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.372260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.372111" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.360042" elapsed="0.012294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.373131" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.372495" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.373208" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.356343" elapsed="0.016988"/>
</kw>
<msg time="2026-05-01T00:45:20.373385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.343678" elapsed="0.029753"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.385911" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.400101" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.412661" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.412899" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.413078" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.413467" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.413305" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.413290" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.413695" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.413863" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.414029" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.413260" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.413154" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.414255" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.414331" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.414473" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.339398" elapsed="0.075104"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.441099" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.440725" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.441863" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.441639" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.442025" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.441289" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.442611" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.442212" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.442959" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.443109" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.442821" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.443550" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.443293" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:20.443995" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.443701" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.444535" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.444226" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.444079" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.443682" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.445387" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.444767" elapsed="0.000650"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.445482" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.440104" elapsed="0.005507"/>
</kw>
<msg time="2026-05-01T00:45:20.445665" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.427380" elapsed="0.018330"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.458255" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.470902" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.483334" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.483553" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.483735" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.484122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.483976" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.483960" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.484347" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.484535" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.484704" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.483924" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.483815" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.484932" elapsed="0.000068"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.485061" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.485194" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.424732" elapsed="0.060492"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.486613" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.486298" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.486794" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.485924" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.487146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.486891" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.487725" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.487410" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.487227" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.486872" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.490153" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.487961" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:20.490230" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:20.490386" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:20.485581" elapsed="0.004829"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.491840" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.491590" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.492276" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.492041" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.492734" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.492491" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.493164" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.492929" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:20.494025" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:45:20.493827" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:45:20.494374" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:45:20.494203" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.494566" elapsed="0.000220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.495188" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.494944" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:45:20.495273" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:45:20.495426" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:45:20.493410" elapsed="0.002054"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:20.509426" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:45:20.509503" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:20.509617" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:20.497821" elapsed="0.011822"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.495579" elapsed="0.014108"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.509869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.509714" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.495561" elapsed="0.014395"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.517514" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.512005" elapsed="0.005607"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.511513" elapsed="0.006184"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.511443" elapsed="0.006317"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.521347" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.518394" elapsed="0.003000"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.517902" elapsed="0.003526"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.517862" elapsed="0.003604"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.522018" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.521633" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.522352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.522115" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.522921" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.522610" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.522433" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.522097" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.523622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.523168" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.523958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.523721" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.524519" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.524199" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.524038" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.523703" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.524754" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:20.525568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.525263" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.525751" elapsed="0.002384"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:20.510676" elapsed="0.017521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:45:20.528370" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.528266" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.528246" elapsed="0.000272"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.528671" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.528740" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:20.531048" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:20.490782" elapsed="0.040293"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.531138" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:45:20.531293" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:20.328316" elapsed="0.203002"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.531673" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.531417" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.531400" elapsed="0.000365"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.531797" elapsed="0.000025"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_application_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:45:20.323761" elapsed="0.208157"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.532527" elapsed="0.000242"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.532203" elapsed="0.000630"/>
</kw>
<doc>Configure BGP application peer module.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:20.233467" elapsed="0.299407"/>
</test>
<test id="s1-s7-t3" name="Check_For_Empty_Example-IPv4-Topology" line="134">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:20.536555" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:20.536274" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.537812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.537704" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.537686" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.542918" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.542812" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.542794" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.543982" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.543602" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.544475" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:20.544168" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:20.544548" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.544703" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.543211" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.550234" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.550126" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.550108" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.551524" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.551392" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.551374" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:20.552039" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.551742" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.552503" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.552266" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.583408" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:20.553026" elapsed="0.030520"/>
</kw>
<msg time="2026-05-01T00:45:20.583721" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:20.583767" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.552690" elapsed="0.031114"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.612541" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:20.584363" elapsed="0.028286"/>
</kw>
<msg time="2026-05-01T00:45:20.612809" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:20.612855" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.583996" elapsed="0.028896"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.613222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.612981" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.612956" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.613770" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.613466" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.614134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.613910" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.613892" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:20.614248" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.616934" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:45:20.617146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.615830" elapsed="0.001448"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.617571" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.617908" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:20.615168" elapsed="0.002925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:20.614566" elapsed="0.003592"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:20.551091" elapsed="0.067163"/>
</kw>
<msg time="2026-05-01T00:45:20.618346" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.618390" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.550467" elapsed="0.067962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:20.618652" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.618523" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.618504" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.619142" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.619508" elapsed="0.000066"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.619625" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:20.549790" elapsed="0.069944"/>
</kw>
<msg time="2026-05-01T00:45:20.619827" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.619870" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.545103" elapsed="0.074804"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.620230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.619982" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.619965" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:20.544954" elapsed="0.075377"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:20.544779" elapsed="0.075585"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:20.542419" elapsed="0.078000"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:20.537398" elapsed="0.083094"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.536973" elapsed="0.083566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:20.533903" elapsed="0.086690"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.673033" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.672655" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.673953" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.673573" elapsed="0.000458">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.674132" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.673226" elapsed="0.000930"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.674753" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.674323" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.675089" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.675245" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.674950" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.675691" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.675431" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.676912" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.676470" elapsed="0.000505"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.677658" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.677148" elapsed="0.000536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.678117" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.678875" elapsed="0.000050"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.679214" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.677900" elapsed="0.001528"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.677736" elapsed="0.001785"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:20.679572" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:45:20.679741" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:20.676104" elapsed="0.003663"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.675804" elapsed="0.003995"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.679975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.679824" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.675785" elapsed="0.004267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.680671" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.680197" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.680748" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.672023" elapsed="0.008849"/>
</kw>
<msg time="2026-05-01T00:45:20.680927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.659301" elapsed="0.021675"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.693785" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.706325" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.718828" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.719024" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.719205" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.719585" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.719423" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.719409" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.719806" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.719974" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.720140" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.719381" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.719280" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.720363" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.720491" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:45:20.720613" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.655021" elapsed="0.065618"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.721908" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.721655" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.722072" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.721298" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.722417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.722169" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.723002" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.722708" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.722527" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.722150" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.725446" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.723238" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:20.725538" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:20.725693" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:20.720969" elapsed="0.004750"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.726961" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.726728" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.727116" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.726354" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:20.727348" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.727212" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.727193" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.727604" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.727780" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.727845" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.729939" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:20.726029" elapsed="0.003937"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.731385" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.731138" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.731845" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.731604" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:20.740192" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:20.740420" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:45:20.740585" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:20.734038" elapsed="0.006585"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.731955" elapsed="0.008727"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.740936" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.740719" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.731937" elapsed="0.009119"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.745979" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.742517" elapsed="0.003528"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.742173" elapsed="0.003921"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.742148" elapsed="0.003983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.749898" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.746555" elapsed="0.003408"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.746211" elapsed="0.003800"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.746188" elapsed="0.003859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.750870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.750277" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.751255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.751009" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.751819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.751516" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.751337" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.750984" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.752426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.752066" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.752788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.752551" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.753333" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.753036" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.752869" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.752533" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.753584" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:20.754381" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.754095" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.754589" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:20.741580" elapsed="0.015586"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.757343" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.757237" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.757218" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:20.760277" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.757582" elapsed="0.002725"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:20.760358" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:20.760532" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:20.730284" elapsed="0.030309"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.760659" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:45:20.760815" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:20.632232" elapsed="0.128609"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.789721" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.788979" elapsed="0.000771"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.791810" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:20.791249" elapsed="0.000714">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:20.792100" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:20.789914" elapsed="0.002211"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.793072" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.792292" elapsed="0.000811"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:20.793526" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:20.793777" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:20.793270" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.794397" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.793964" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:20.795154" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.794549" elapsed="0.000765"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.796143" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.795532" elapsed="0.000653"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.795341" elapsed="0.000926"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.794529" elapsed="0.001762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.797201" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.796440" elapsed="0.000790"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.797278" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.788256" elapsed="0.009149"/>
</kw>
<msg time="2026-05-01T00:45:20.797523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.775517" elapsed="0.022059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.810466" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.823238" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.835614" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.835808" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.835983" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.836354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.836211" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:20.836196" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.836588" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.836757" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.836920" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:20.836166" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.836062" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.837147" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.837222" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:20.837340" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:20.772852" elapsed="0.064515"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.837565" elapsed="0.002205"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:20.840836" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.840514" elapsed="0.000351"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:20.841319" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:20.841018" elapsed="0.000330"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:20.841528" elapsed="0.000375"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:20.840092" elapsed="0.001872"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.839851" elapsed="0.002147"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.842172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.842023" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.839832" elapsed="0.002417"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:20.761988" elapsed="0.080307"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:20.761170" elapsed="0.081225"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.760926" elapsed="0.081515"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.760908" elapsed="0.081574"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:20.842519" elapsed="0.000029"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:20.625857" elapsed="0.216792"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.621624" elapsed="0.221088"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:20.621107" elapsed="0.221652"/>
</kw>
<arg>empty_topology</arg>
<arg>timeout=180s</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:20.620734" elapsed="0.222086"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.843407" elapsed="0.000258"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:20.843102" elapsed="0.000626"/>
</kw>
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:20.533340" elapsed="0.310428"/>
</test>
<test id="s1-s7-t4" name="TC1_BGP_Application_Peer_Post_3_Initial_Routes" line="139">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:20.847203" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:20.846940" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.848487" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.848362" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.848344" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.853759" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.853650" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.853632" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.854882" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:20.854505" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.855358" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:20.855067" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:20.855428" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:45:20.855598" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:20.854071" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.861100" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.860988" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.860969" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.862306" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:20.862201" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.862183" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:20.862854" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:20.862553" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.863300" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.863079" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.896017" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:20.863840" elapsed="0.032374"/>
</kw>
<msg time="2026-05-01T00:45:20.896440" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:20.896518" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.863501" elapsed="0.033057"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.926931" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "o "s "t "_ "3 "_ "I "n "i "t "i "a "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:20.897242" elapsed="0.029806"/>
</kw>
<msg time="2026-05-01T00:45:20.927208" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:20.927254" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.896810" elapsed="0.030481"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.927665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.927387" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.927358" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.928200" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "o "s "t "_ "3 "_ "I "n "i "t "i "a "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.927896" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.928578" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.928345" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.928327" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:20.928695" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.931392" elapsed="0.000358"/>
</kw>
<msg time="2026-05-01T00:45:20.931815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:20.930217" elapsed="0.001736"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.932236" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.932597" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:20.929576" elapsed="0.003208"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:20.929009" elapsed="0.003840"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:20.861902" elapsed="0.071042"/>
</kw>
<msg time="2026-05-01T00:45:20.933034" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.933078" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.861321" elapsed="0.071795"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:20.933299" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:45:20.933191" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.933174" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.933818" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.934156" elapsed="0.000072"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:20.934308" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:20.860655" elapsed="0.073766"/>
</kw>
<msg time="2026-05-01T00:45:20.934531" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:20.934576" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.855988" elapsed="0.078626"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:20.934941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:20.934690" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:20.934673" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:20.855845" elapsed="0.079197"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:20.855675" elapsed="0.079400"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:20.853274" elapsed="0.081857"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:20.848054" elapsed="0.087133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:20.847630" elapsed="0.087604"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:20.844788" elapsed="0.090502"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:20.935724" elapsed="0.000105"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:20.935429" elapsed="0.000455"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.944484" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:20.944140" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.944912" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.944671" elapsed="0.000289"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:20.950178" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:45:20.950293" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:20.945111" elapsed="0.005208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:20.950737" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:20.950492" elapsed="0.000294"/>
</kw>
<arg>${BGP_APP_PEER_POST_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:20.943725" elapsed="0.007115"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.094124" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:20.955542" elapsed="0.138698"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:20.955043" elapsed="0.139266"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:45:20.954708" elapsed="0.139674"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.103558" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:45:21.116431" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:21.116696" level="INFO">${output_log} = 2026-05-01 00:45:21,054 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:21.103396" elapsed="0.013360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.117782" level="INFO">2026-05-01 00:45:21,054 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:21,058 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-05-01 00:45:21,058 DEBUG: xml data
&lt;ipv4-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.0/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.0/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:21,059 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-05-01 00:45:21,059 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.16/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.16/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:21,059 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-05-01 00:45:21,059 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.32/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.32/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt; 
&lt;/ipv4-routes&gt;
2026-05-01 00:45:21,072 DEBUG: &lt;PreparedRequest [POST]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:21,072 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:21,072 DEBUG: Response: 
2026-05-01 00:45:21,072 DEBUG: &lt;Response [201]&gt; Created
2026-05-01 00:45:21,073 INFO: Total test execution time: 0.018s
2026-05-01 00:45:21,073 INFO: Total build data time: 0.001s
2026-05-01 00:45:21,073 INFO: Total response time: 0.017s
2026-05-01 00:45:21,073 INFO: Total number of response(s): 1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.117123" elapsed="0.001000"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.119314" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_initial_post_tc1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_initial_post_tc1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:21.118569" elapsed="0.000939"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_initial_post_tc1.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:21.103022" elapsed="0.016635"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:21.121036" elapsed="0.000583"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:21.120279" elapsed="0.001484"/>
</kw>
<doc>Start BGP application peer tool and give it 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:20.844198" elapsed="0.277653"/>
</test>
<test id="s1-s7-t5" name="TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes" line="147">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:21.129721" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:21.129326" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.131647" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.131448" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.131418" elapsed="0.000333"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.136959" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.136851" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.136833" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.138058" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:21.137655" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.138557" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:21.138245" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:21.138627" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:45:21.138788" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:21.137260" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.144336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.144228" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.144210" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.145606" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.145496" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.145448" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:21.146138" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:21.145824" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.146555" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:21.146324" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.174025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:21.147080" elapsed="0.027076"/>
</kw>
<msg time="2026-05-01T00:45:21.174320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:21.174365" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.146742" elapsed="0.027660"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.213143" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:21.174946" elapsed="0.038335"/>
</kw>
<msg time="2026-05-01T00:45:21.213538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:21.213587" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.174605" elapsed="0.039019"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.213952" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.213712" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.213691" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.214528" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.214210" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.214895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.214678" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.214660" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:21.215006" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:21.217564" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:45:21.217769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.216471" elapsed="0.001438"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.218213" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.218577" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:21.215839" elapsed="0.002925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:21.215272" elapsed="0.003556"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:21.145164" elapsed="0.073761"/>
</kw>
<msg time="2026-05-01T00:45:21.219015" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:21.219059" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.144573" elapsed="0.074523"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:21.219280" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:21.219172" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.219154" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.219776" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.220113" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.220189" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:21.143892" elapsed="0.076404"/>
</kw>
<msg time="2026-05-01T00:45:21.220387" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:21.220430" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.139187" elapsed="0.081293"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.220805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.220556" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.220539" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:21.139043" elapsed="0.081862"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:21.138867" elapsed="0.082068"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:21.136487" elapsed="0.084502"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:21.130954" elapsed="0.090138"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.130325" elapsed="0.090812"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:21.123754" elapsed="0.097435"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.274781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.274372" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.275743" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.275316" elapsed="0.000505">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:21.275916" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:21.274980" elapsed="0.000961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.276511" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:21.276109" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.276841" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:21.277018" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:21.276703" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.277449" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.277203" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.278706" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.278252" elapsed="0.000516"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.279290" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:21.278930" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.279752" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.280497" elapsed="0.000051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.280839" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:21.279558" elapsed="0.001448"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.279368" elapsed="0.001708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:21.281125" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:45:21.281289" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:21.277885" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.277583" elapsed="0.003763"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.281535" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.281371" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.277561" elapsed="0.004053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.282229" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.281761" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:21.282307" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:21.273635" elapsed="0.008797"/>
</kw>
<msg time="2026-05-01T00:45:21.282547" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.260810" elapsed="0.021790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.295320" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.307960" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.320743" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.320945" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.321125" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.321517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.321353" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:21.321338" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.321744" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.321924" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.322093" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:21.321307" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.321202" elapsed="0.000971"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.322322" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.322399" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:21.322538" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:21.256538" elapsed="0.066027"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.323866" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.323596" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:21.324032" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:21.323230" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.324420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.324128" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.324995" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.324704" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.324520" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.324110" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.327536" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:21.325231" elapsed="0.002331"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:21.327615" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:21.327769" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:21.322899" elapsed="0.004894"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.329068" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.328822" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:21.329226" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:21.328484" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:21.329473" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:45:21.329322" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.329303" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.329710" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.329882" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.329989" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:45:21.332061" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:21.328139" elapsed="0.003948"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.333499" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.333237" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.333960" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.333700" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:21.342336" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:21.342724" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:45:21.342842" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:21.336213" elapsed="0.006656"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.334071" elapsed="0.008840"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.343130" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.342938" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.334053" elapsed="0.009204"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.348443" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.344793" elapsed="0.003750"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.344442" elapsed="0.004197"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.344416" elapsed="0.004264"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.352615" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.349094" elapsed="0.003588"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.348763" elapsed="0.003969"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.348739" elapsed="0.004030"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.353599" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.353013" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.354131" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.353742" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.354956" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.354512" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.354253" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.353715" elapsed="0.001352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.355602" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.355229" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.355929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.355697" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.356478" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.356169" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.356009" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.355679" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.356713" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:21.357535" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.357218" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:21.357715" elapsed="0.002356"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:21.343823" elapsed="0.016309"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.360305" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.360202" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.360184" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:21.363363" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:21.360533" elapsed="0.002859"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:21.363443" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:45:21.363619" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:21.332405" elapsed="0.031241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:21.363708" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:45:21.363859" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:21.233533" elapsed="0.130351"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.393166" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.392364" elapsed="0.000831"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.395210" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.394682" elapsed="0.000679">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:21.395508" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:21.393359" elapsed="0.002175"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.396480" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:21.395701" elapsed="0.000809"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:21.396910" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:21.397157" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:21.396675" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.397788" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "prefix": "8.0.1.16/28"
       },
       {
        "prefix": "8.0.1.32/28"
       }
      ]
     },
     "node-id": "192.0.2.1"
    }
   ],
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.397347" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:21.398569" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.397948" elapsed="0.000783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.399561" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.398935" elapsed="0.000668"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.398759" elapsed="0.000924"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.397928" elapsed="0.001779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.400656" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.399860" elapsed="0.000826"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:21.400734" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:21.391662" elapsed="0.009200"/>
</kw>
<msg time="2026-05-01T00:45:21.400916" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.378797" elapsed="0.022169"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.414066" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.426576" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.439361" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.439655" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.439832" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.440207" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.440062" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:21.440046" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.440429" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.440617" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.440783" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:21.440016" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.439909" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.441009" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.441086" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:21.441213" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:21.376140" elapsed="0.065100"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.441416" elapsed="0.002246"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:21.444889" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:21.444427" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:21.445526" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:21.445072" elapsed="0.000483"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:21.445714" elapsed="0.000335"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:21.443988" elapsed="0.002121"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.443744" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.446315" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.446167" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.443725" elapsed="0.002667"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:21.365067" elapsed="0.081372"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:21.364253" elapsed="0.082286"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.363968" elapsed="0.082651"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.363951" elapsed="0.082693"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:21.446679" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:21.226448" elapsed="0.220360"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.222253" elapsed="0.224617"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:21.221749" elapsed="0.225167"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:21.221332" elapsed="0.225644"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:21.447575" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:21.447251" elapsed="0.000628"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:21.122630" elapsed="0.325288"/>
</test>
<test id="s1-s7-t6" name="TC1_Connect_BGP_Peer" line="152">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:21.451201" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:21.450934" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.452472" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.452348" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.452330" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.457729" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.457622" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.457604" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.458819" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:21.458426" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.459297" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:21.459005" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:21.459366" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:21.459539" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:21.458047" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.465112" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.465004" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.464985" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.466348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:21.466242" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.466225" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:21.466888" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:21.466588" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.467287" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:21.467073" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.499903" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:21.467828" elapsed="0.032178"/>
</kw>
<msg time="2026-05-01T00:45:21.500169" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:21.500215" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.467491" elapsed="0.032760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.525519" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:21.500867" elapsed="0.024769"/>
</kw>
<msg time="2026-05-01T00:45:21.525805" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:21.525851" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.500491" elapsed="0.025420"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.526246" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.526001" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.525977" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.526814" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.526502" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.527166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.526949" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.526931" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:21.527280" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:21.529930" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:45:21.530148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:21.528770" elapsed="0.001514"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.530595" elapsed="0.000242"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.531113" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:21.528129" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:21.527585" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:21.465941" elapsed="0.065556"/>
</kw>
<msg time="2026-05-01T00:45:21.531593" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:21.531638" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.465332" elapsed="0.066343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:21.531861" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:21.531753" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.531733" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.532397" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.532765" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:21.532839" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:21.464663" elapsed="0.068287"/>
</kw>
<msg time="2026-05-01T00:45:21.533045" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:21.533093" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.459931" elapsed="0.073202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:21.533476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:21.533210" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:21.533193" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:21.459788" elapsed="0.073790"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:21.459616" elapsed="0.074033"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:21.457248" elapsed="0.076460"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:21.452063" elapsed="0.081702"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:21.451633" elapsed="0.082179"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:21.448761" elapsed="0.085107"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:21.534310" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:21.534037" elapsed="0.000500"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.543107" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:21.542782" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.543566" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.543306" elapsed="0.000306"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:21.554961" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-05-01T00:45:21.555152" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:21.543764" elapsed="0.011424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:21.555611" level="INFO"> python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:21.555350" elapsed="0.000401"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:21.542374" elapsed="0.013433"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.558341" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-05-01 00:45:21,618 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:21,620 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:21,622 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,628 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:21,635 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-05-01 00:45:21,635 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,670 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:21,670 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.557409" elapsed="10.002237">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:21,618 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:21,620 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:21,622 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
...DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.560002" elapsed="0.000040"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:45:21.557140" elapsed="10.003073">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:21,618 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:21,620 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:21,622 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
...DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:45:21.556741" elapsed="10.003631"/>
</kw>
<msg time="2026-05-01T00:45:31.560507" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:21.556367" elapsed="10.004167"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:45:31.560747" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:45:31.560641" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.560613" elapsed="0.000230"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.561095" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.561283" elapsed="0.000021"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:45:21.556042" elapsed="10.005323"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:31.562034" elapsed="0.000314"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:31.561677" elapsed="0.000736"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:21.448255" elapsed="10.114200"/>
</test>
<test id="s1-s7-t7" name="TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes" line="159">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:31.566385" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:31.566115" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.567727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.567605" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.567586" elapsed="0.000254"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.572947" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.572839" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.572821" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.574063" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:31.573668" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.574564" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:31.574252" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:31.574635" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:31.574791" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:31.573248" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.580369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.580261" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.580242" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.581652" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.581544" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.581526" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:31.582175" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:31.581869" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.582612" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:31.582360" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.615885" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:31.583131" elapsed="0.032876"/>
</kw>
<msg time="2026-05-01T00:45:31.616171" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:31.616216" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.582798" elapsed="0.033454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.662936" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "I "n "t "r "o "d "u "c "e "d "_ "[78CP "[A[78Cr
 "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:31.616796" elapsed="0.046255"/>
</kw>
<msg time="2026-05-01T00:45:31.663213" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:31.663259" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.616421" elapsed="0.046874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.663625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:31.663372" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.663353" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.664147" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "I "n "t "r "o "d "u "c "e "d "_ "[78CP "[A[78Cr
 "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.663848" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.664528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:31.664293" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.664275" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:31.664639" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:31.667188" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:45:31.667390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:31.666110" elapsed="0.001441"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.667828" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.668162" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:31.665496" elapsed="0.002849"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:31.664913" elapsed="0.003496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:31.581203" elapsed="0.087332"/>
</kw>
<msg time="2026-05-01T00:45:31.668625" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:31.668669" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.580609" elapsed="0.088096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:31.668887" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:45:31.668780" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.668762" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.669359" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.669712" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.669784" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:31.579921" elapsed="0.089970"/>
</kw>
<msg time="2026-05-01T00:45:31.669983" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:31.670026" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.575194" elapsed="0.094867"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:31.670389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:31.670135" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.670119" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:31.575048" elapsed="0.095459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:31.574871" elapsed="0.095665"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:31.572443" elapsed="0.098148"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:31.567290" elapsed="0.103383"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.566846" elapsed="0.103874"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:31.563508" elapsed="0.107264"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:31.671166" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:31.670898" elapsed="0.000427"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.683856" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:31.697702" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:31.697839" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:31.683693" elapsed="0.014181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.698501" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.698103" elapsed="0.000504"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:31.698942" elapsed="0.000747"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:31.683338" elapsed="0.016487"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:31.671513" elapsed="0.028507"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.717087" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:31.751786" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:31.752010" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:31.716906" elapsed="0.035161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.753075" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.752447" elapsed="0.000725"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:31.753540" elapsed="0.000693"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:31.716499" elapsed="0.037872"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.770048" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:31.803533" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:31.803742" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:31.769885" elapsed="0.033911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.804782" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.804155" elapsed="0.000724"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:31.805216" elapsed="0.000764"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:31.769543" elapsed="0.036580"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.822697" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:31.867265" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:31.867365" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:31.822535" elapsed="0.044854"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.867835" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.867581" elapsed="0.000298"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:31.868030" elapsed="0.000305"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:31.822178" elapsed="0.046218"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.880344" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:31.923036" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:31.923132" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:31.880185" elapsed="0.042971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.923599" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:31.923319" elapsed="0.000324"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:31.923793" elapsed="0.000307"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:31.879849" elapsed="0.044312"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:31.924754" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:31.924433" elapsed="0.000623"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:31.562892" elapsed="0.362202"/>
</test>
<test id="s1-s7-t8" name="TC1_BGP_Application_Peer_Delete_3_Initial_Routes" line="175">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:31.928535" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:31.928259" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.929789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.929673" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.929654" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.936777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.936669" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.936651" elapsed="0.000293"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.937955" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:31.937573" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:31.938452" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:31.938142" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:31.938540" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:45:31.938703" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:31.937177" elapsed="0.001551"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.944185" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.944078" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.944060" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:31.945406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:31.945300" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:31.945283" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:31.945947" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:31.945653" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.946356" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:31.946131" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:31.995362" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:31.946893" elapsed="0.048620"/>
</kw>
<msg time="2026-05-01T00:45:31.995678" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:31.995724" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.946557" elapsed="0.049204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.027380" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "3 "_ "I "n "i "t "i "a "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:31.996270" elapsed="0.031243"/>
</kw>
<msg time="2026-05-01T00:45:32.027672" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:32.027717" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.995933" elapsed="0.031821"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.028051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.027830" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.027811" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.028593" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "3 "_ "I "n "i "t "i "a "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.028272" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.028951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.028735" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.028717" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:32.029061" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.031575" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:45:32.031779" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.030493" elapsed="0.001417"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.032221" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.032590" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:32.029872" elapsed="0.002904"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:32.029330" elapsed="0.003509"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:31.945002" elapsed="0.087932"/>
</kw>
<msg time="2026-05-01T00:45:32.033025" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.033069" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.944405" elapsed="0.088701"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:32.033440" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-05-01T00:45:32.033181" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.033163" elapsed="0.000391"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.033951" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.034289" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.034361" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:31.943744" elapsed="0.090740"/>
</kw>
<msg time="2026-05-01T00:45:32.034578" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.034621" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.939097" elapsed="0.095561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.034981" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.034732" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.034715" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:31.938954" elapsed="0.096127"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:31.938782" elapsed="0.096327"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:31.936280" elapsed="0.098883"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:31.929369" elapsed="0.105847"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:31.928948" elapsed="0.106311"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:31.926106" elapsed="0.109203"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.035733" elapsed="0.000101"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.035438" elapsed="0.000451"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.044525" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bg...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.044178" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.044954" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.044713" elapsed="0.000288"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.049890" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:45:32.049984" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=b...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:32.045153" elapsed="0.004888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.050453" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.050205" elapsed="0.000316"/>
</kw>
<arg>${BGP_APP_PEER_DELETE_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:32.043765" elapsed="0.006811"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.211139" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:32.055280" elapsed="0.155918"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:32.054799" elapsed="0.156445"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:45:32.054454" elapsed="0.156848"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.220233" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:45:32.231996" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.232089" level="INFO">${output_log} = 2026-05-01 00:45:32,148 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.220098" elapsed="0.012017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.232554" level="INFO">2026-05-01 00:45:32,148 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:32,148 INFO: Deleting prefix 8.0.1.0/28/,0 from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:32,164 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/bgp-inet:ipv4-route=8.0.1.0%2F28,0
2026-05-01 00:45:32,164 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:32,164 DEBUG: Response: 
2026-05-01 00:45:32,164 DEBUG: &lt;Response [204]&gt; No Content
2026-05-01 00:45:32,164 INFO: Deleting prefix 8.0.1.16/28/,0 from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:32,182 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/bgp-inet:ipv4-route=8.0.1.16%2F28,0
2026-05-01 00:45:32,182 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:32,182 DEBUG: Response: 
2026-05-01 00:45:32,182 DEBUG: &lt;Response [204]&gt; No Content
2026-05-01 00:45:32,182 INFO: Deleting prefix 8.0.1.32/28/,0 from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:32,192 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/bgp-inet:ipv4-route=8.0.1.32%2F28,0
2026-05-01 00:45:32,193 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:32,193 DEBUG: Response: 
2026-05-01 00:45:32,193 DEBUG: &lt;Response [204]&gt; No Content
2026-05-01 00:45:32,193 INFO: Total test execution time: 0.045s
2026-05-01 00:45:32,193 INFO: Total build data time: 0.000s
2026-05-01 00:45:32,193 INFO: Total response time: 0.042s
2026-05-01 00:45:32,193 INFO: Total number of response(s): 3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.232276" elapsed="0.000346"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.233192" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_tc1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_tc1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:32.232796" elapsed="0.000452"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_delete_tc1.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.219770" elapsed="0.013538"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.233927" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.233590" elapsed="0.000639"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:31.925501" elapsed="0.308766"/>
</test>
<test id="s1-s7-t9" name="TC1_Check_Example-IPv4-Topology_Is_Empty" line="183">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:32.237526" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:32.237246" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.238800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.238689" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.238671" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.244201" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.244092" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.244074" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.245268" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.244889" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.245765" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:32.245458" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:32.245836" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:32.246006" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.244514" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.251534" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.251405" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.251387" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.252757" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.252650" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.252632" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:32.253265" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:32.252971" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.253683" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.253458" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.284646" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:32.254219" elapsed="0.030548"/>
</kw>
<msg time="2026-05-01T00:45:32.284926" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:32.284971" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.253870" elapsed="0.031137"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.316235" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:32.285557" elapsed="0.030784"/>
</kw>
<msg time="2026-05-01T00:45:32.316524" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:32.316572" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.285178" elapsed="0.031431"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.316908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.316686" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.316667" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.317422" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.317129" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.317796" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.317580" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.317562" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:32.317905" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.320371" elapsed="0.000173"/>
</kw>
<msg time="2026-05-01T00:45:32.320607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.319325" elapsed="0.001447"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.321045" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.321375" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:32.318701" elapsed="0.002883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:32.318159" elapsed="0.003488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:32.252322" elapsed="0.069421"/>
</kw>
<msg time="2026-05-01T00:45:32.321833" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.321876" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.251755" elapsed="0.070157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:32.322251" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:45:32.321988" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.321970" elapsed="0.000370"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.322759" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.323129" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.323202" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:32.251072" elapsed="0.072239"/>
</kw>
<msg time="2026-05-01T00:45:32.323402" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.323445" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.246395" elapsed="0.077103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.323829" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.323576" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.323558" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:32.246252" elapsed="0.077677"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:32.246082" elapsed="0.077875"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:32.243696" elapsed="0.080314"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:32.238386" elapsed="0.085677"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.237955" elapsed="0.086151"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:32.235091" elapsed="0.089066"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.377024" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.376646" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.377933" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:32.377576" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:32.378107" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:32.377218" elapsed="0.000913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.378757" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.378297" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.379087" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:32.379236" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:32.378951" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.379708" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.379419" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.380916" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.380475" elapsed="0.000502"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.381521" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:32.381142" elapsed="0.000406"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.381945" elapsed="0.000044"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.382691" elapsed="0.000051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.383030" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:32.381755" elapsed="0.001445"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.381597" elapsed="0.001669"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:32.383314" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:32.383501" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:32.380112" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.379819" elapsed="0.003740"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.383749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.383584" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.379800" elapsed="0.004025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.384416" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.383970" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:32.384510" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.376006" elapsed="0.008631"/>
</kw>
<msg time="2026-05-01T00:45:32.384690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.363113" elapsed="0.021625"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.397317" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.409978" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.422823" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.423019" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.423196" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.423577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.423414" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:32.423400" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.423801" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.423970" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.424152" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:32.423371" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.423269" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.424381" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.424457" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:32.424594" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:32.358811" elapsed="0.065808"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.425867" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:32.425631" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:32.426022" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:32.425268" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.426364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.426116" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.426921" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.426632" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.426444" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.426098" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.429368" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.427156" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:32.429446" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:45:32.429620" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:32.424944" elapsed="0.004700"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.430859" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:32.430626" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:32.431051" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:32.430274" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:32.431283" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:32.431147" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.431129" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.431532" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.431706" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.431771" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:32.433738" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:32.429952" elapsed="0.003812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.435147" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.434902" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.435603" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.435346" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:32.444063" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:32.444208" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:45:32.444320" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:32.438031" elapsed="0.006345"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.435712" elapsed="0.008707"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.444631" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.444446" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.435693" elapsed="0.009026"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.449514" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.445909" elapsed="0.003675"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.445575" elapsed="0.004060"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.445544" elapsed="0.004128"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.453338" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.450081" elapsed="0.003303"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.449753" elapsed="0.003665"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.449729" elapsed="0.003714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.454012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.453625" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.454348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.454111" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.454967" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.454636" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.454430" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.454093" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.455586" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.455210" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.455917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.455683" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.456528" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.456199" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.456031" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.455665" elapsed="0.000948"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.456763" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:32.457579" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.457270" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:32.457761" elapsed="0.002352"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:32.445079" elapsed="0.015096"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.460351" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.460245" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.460227" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:32.463301" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:32.460609" elapsed="0.002721"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:32.463383" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:32.463558" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:32.434074" elapsed="0.029512"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:32.463648" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:45:32.463799" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:32.335597" elapsed="0.128228"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.492986" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.492205" elapsed="0.000810"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.495015" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:32.494489" elapsed="0.000676">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:32.495297" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:32.493181" elapsed="0.002142"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.496252" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.495506" elapsed="0.000774"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:32.496705" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:32.496930" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:32.496443" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.497620" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.497134" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:32.498342" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.497753" elapsed="0.000771"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.499340" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:32.498734" elapsed="0.000647"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.498553" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.497734" elapsed="0.001771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.500408" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.499657" elapsed="0.000781"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:32.500522" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.491498" elapsed="0.009154"/>
</kw>
<msg time="2026-05-01T00:45:32.500706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.478668" elapsed="0.022086"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.513714" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.526146" elapsed="0.000122"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.538927" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.539125" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.539301" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.539696" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.539550" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:32.539536" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.539917" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.540086" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.540254" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:32.539506" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.539376" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.540566" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.540645" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:32.540764" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:32.475985" elapsed="0.064805"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.540967" elapsed="0.002227"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:32.544256" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:32.543943" elapsed="0.000341"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:32.544774" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:32.544441" elapsed="0.000361"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:32.544962" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:32.543532" elapsed="0.001815"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.543275" elapsed="0.002106"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.545588" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.545406" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.543257" elapsed="0.002410"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:32.464965" elapsed="0.080750"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:32.464143" elapsed="0.081645"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.463906" elapsed="0.081929"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.463889" elapsed="0.081969"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:32.545891" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:32.329347" elapsed="0.216669"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.325126" elapsed="0.220951"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:32.324658" elapsed="0.221464"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.324284" elapsed="0.221896"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.546765" elapsed="0.000236"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.546442" elapsed="0.000622"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:32.234562" elapsed="0.312541"/>
</test>
<test id="s1-s7-t10" name="TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes" line="188">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:32.550442" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:32.550178" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.551754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.551641" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.551623" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.557047" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.556940" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.556922" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.558149" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.557770" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.558652" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:32.558338" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:32.558724" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:32.558881" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.557342" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.564409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.564302" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.564283" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.565650" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.565543" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.565525" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:32.566189" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:32.565896" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.566606" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.566375" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.597566" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:32.567128" elapsed="0.030543"/>
</kw>
<msg time="2026-05-01T00:45:32.597833" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:32.597879" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.566793" elapsed="0.031123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.632645" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "[78Cx "[A[78Ce
 "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:32.598492" elapsed="0.034270"/>
</kw>
<msg time="2026-05-01T00:45:32.632922" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:32.632968" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "P "e "e "r "_ "C "h "e "c "k "_...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.598090" elapsed="0.034915"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.633308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.633084" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.633064" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.633858" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "[78Cx "[A[78Ce
 "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.633563" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.634216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.634001" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.633984" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:32.634366" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.636889" elapsed="0.000269"/>
</kw>
<msg time="2026-05-01T00:45:32.637220" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.635832" elapsed="0.001515"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.637643" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.637975" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:32.635193" elapsed="0.002963"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:32.634664" elapsed="0.003557"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:32.565215" elapsed="0.073103"/>
</kw>
<msg time="2026-05-01T00:45:32.638410" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.638457" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "P "e "e "r "_ "C "h "e "c "k "_...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.564650" elapsed="0.073862"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:32.638721" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:32.638590" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.638571" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.639202" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.639558" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.639630" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:32.563967" elapsed="0.075770"/>
</kw>
<msg time="2026-05-01T00:45:32.639828" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.639872" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "P "e "e "r "_ "C "h "e "c "k "_...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.559267" elapsed="0.080641"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.640235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.639985" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.639968" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:32.559124" elapsed="0.081210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:32.558956" elapsed="0.081406"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:32.556577" elapsed="0.083838"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:32.551296" elapsed="0.089224"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.550873" elapsed="0.089695"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:32.547993" elapsed="0.092627"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.641009" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.640743" elapsed="0.000423"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.653590" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:32.666735" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.666834" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.653412" elapsed="0.013447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.667317" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.667060" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:32.667653" elapsed="0.000695"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:32.653074" elapsed="0.015536"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:32.641317" elapsed="0.027408"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.684456" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:32.720357" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.720486" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.684292" elapsed="0.036258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.721524" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.720938" elapsed="0.000687"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:32.721963" elapsed="0.000726"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:32.683952" elapsed="0.038874"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.740289" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:32.771319" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.771420" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.740128" elapsed="0.031317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.772404" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.771831" elapsed="0.000705"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:32.772875" elapsed="0.000720"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:32.739761" elapsed="0.033968"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.790184" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:32.824594" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.824820" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.790023" elapsed="0.034855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.825879" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.825243" elapsed="0.000733"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:32.826311" elapsed="0.000752"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:32.789680" elapsed="0.037516"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.842806" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:32.875848" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:32.876054" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:32.842637" elapsed="0.033471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.877075" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.876516" elapsed="0.000656"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:32.877565" elapsed="0.000692"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:32.842157" elapsed="0.036236"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.879701" elapsed="0.000515"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:32.879006" elapsed="0.001349"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:32.547401" elapsed="0.333036"/>
</test>
<test id="s1-s7-t11" name="TC1_Stop_BGP_Peer" line="204">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:32.885664" elapsed="0.000284"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:32.885246" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.887400" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.887241" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.887215" elapsed="0.000307"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.893497" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.893373" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.893355" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.894587" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:32.894184" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.895070" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:32.894776" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:32.895141" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:32.895297" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:32.893807" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.902202" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.902094" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.902075" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.903423" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:32.903317" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.903299" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:32.903961" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:32.903667" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.904355" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.904146" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.934068" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:32.904899" elapsed="0.029302"/>
</kw>
<msg time="2026-05-01T00:45:32.934363" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:32.934409" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.904561" elapsed="0.029884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:32.961794" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:32.934983" elapsed="0.027040"/>
</kw>
<msg time="2026-05-01T00:45:32.962390" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:32.962572" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.934646" elapsed="0.028011"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.963338" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.962833" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.962789" elapsed="0.000730"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.963974" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:32.963666" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.964328" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.964108" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.964090" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:32.964439" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.966960" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:45:32.967165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:32.965892" elapsed="0.001402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.967638" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.967976" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:32.965254" elapsed="0.002905"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:32.964722" elapsed="0.003501"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:32.903015" elapsed="0.065305"/>
</kw>
<msg time="2026-05-01T00:45:32.968413" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.968476" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.902425" elapsed="0.066091"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:32.968703" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:32.968594" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.968576" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.969187" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.969554" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:32.969628" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:32.901751" elapsed="0.067985"/>
</kw>
<msg time="2026-05-01T00:45:32.969829" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:32.969873" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "1 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.895703" elapsed="0.074208"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:32.970234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:32.969986" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:32.969969" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:32.895558" elapsed="0.074776"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:32.895373" elapsed="0.074990"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:32.892971" elapsed="0.077446"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:32.886845" elapsed="0.083645"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:32.886237" elapsed="0.084333"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:32.882124" elapsed="0.088500"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:32.971015" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:32.970746" elapsed="0.000427"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:32.972504" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:32.971945" elapsed="0.000587"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:32.972687" elapsed="0.000217"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:45:32.971679" elapsed="0.001294"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:45:34.974137" level="INFO">2026-05-01 00:45:31,688 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.048s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:45:34.974876" level="INFO">${output} = 2026-05-01 00:45:31,688 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.048s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:45:32.973122" elapsed="2.001821"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:34.976108" level="INFO">2026-05-01 00:45:31,688 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.048s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:34.975403" elapsed="0.001143"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:45:32.971346" elapsed="2.005339"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:34.989407" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-05-01T00:45:35.002886" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:35.003024" level="INFO">${output_log} = 2026-05-01 00:45:21,618 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:21,619 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:34.989268" elapsed="0.013793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.003683" level="INFO">2026-05-01 00:45:21,618 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:21,619 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:21,620 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:21,622 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:21,623 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:21,624 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,624 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:21,625 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:21,627 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,628 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:21,628 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:21,635 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-05-01 00:45:21,635 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,635 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,636 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,670 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:21,670 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,671 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,672 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,673 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,674 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,675 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,676 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:21,677 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:21,678 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:21,679 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:21,680 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:21,681 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:31,688 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.048s
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:45:31,689 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,167 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,168 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,169 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,170 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,171 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,186 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,187 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,188 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,189 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,190 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,191 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:32,194 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:32,195 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:32,196 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:32,197 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:32,198 DEBUG BGP-Thread-1 (job): NLRI prefix list: []</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:35.003292" elapsed="0.000824"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:35.004906" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:35.004375" elapsed="0.000610"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>bgp_peer_tc1.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:34.988915" elapsed="0.016155"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:35.005909" elapsed="0.000348"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:35.005456" elapsed="0.000891"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:32.881040" elapsed="2.125362"/>
</test>
<test id="s1-s7-t12" name="TC2_Reconnect_BGP_Peer" line="211">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:35.011012" elapsed="0.000287"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:35.010642" elapsed="0.000735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:35.012883" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:35.012704" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.012672" elapsed="0.000319"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:35.018800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:35.018692" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.018657" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.019878" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:35.019491" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.020360" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:35.020067" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:35.020431" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:45:35.020614" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:35.019097" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:35.026375" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:35.026268" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.026249" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:35.027703" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:35.027571" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.027548" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:35.028227" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:35.027922" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:35.028648" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:35.028414" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:35.061007" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:35.029177" elapsed="0.031934"/>
</kw>
<msg time="2026-05-01T00:45:35.061275" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:35.061322" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:35.028837" elapsed="0.032521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:35.087508" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "R "e "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:35.061906" elapsed="0.025702"/>
</kw>
<msg time="2026-05-01T00:45:35.087766" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:35.087812" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:35.061560" elapsed="0.026325"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.088189" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:35.087965" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.087945" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.088728" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "R "e "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:35.088410" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.089079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:35.088863" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.088844" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:35.089190" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:35.091760" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:45:35.091961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:35.090677" elapsed="0.001417"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.092370" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.092731" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:35.090031" elapsed="0.002884"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:35.089477" elapsed="0.003504"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:35.027234" elapsed="0.065843"/>
</kw>
<msg time="2026-05-01T00:45:35.093169" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:35.093214" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:35.026622" elapsed="0.066629"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:35.093434" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-05-01T00:45:35.093327" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.093308" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.093947" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.094287" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:35.094359" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:35.025930" elapsed="0.068562"/>
</kw>
<msg time="2026-05-01T00:45:35.094588" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:35.094632" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:35.021021" elapsed="0.073647"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:35.094992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:35.094742" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:35.094725" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:35.020875" elapsed="0.074216"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:35.020696" elapsed="0.074425"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:35.018305" elapsed="0.076870"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:35.012267" elapsed="0.082962"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:35.011630" elapsed="0.083680"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:35.007601" elapsed="0.087796"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:35.095811" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:35.095542" elapsed="0.000427"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.104851" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:35.104523" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.105273" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:35.105033" elapsed="0.000284"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:35.115571" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-05-01T00:45:35.115773" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:35.105486" elapsed="0.010322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:35.116218" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:35.115970" elapsed="0.000384"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:35.104127" elapsed="0.012283"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.118802" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-05-01 00:45:35,185 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:35,188 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:35,194 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:35,194 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:35,194 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:35,195 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:35,195 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:35,195 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:35,200 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,200 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:35,206 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-05-01 00:45:35,206 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:45:35.117991" elapsed="10.001877">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:35,185 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:35,188 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.120217" elapsed="0.000040"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:45:35.117725" elapsed="10.002708">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:35,185 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:35,188 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:45:35.117299" elapsed="10.003316"/>
</kw>
<msg time="2026-05-01T00:45:45.120735" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:35.116944" elapsed="10.003818"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:45:45.120980" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:45:45.120871" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.120842" elapsed="0.000275"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.121372" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.121561" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:45:35.116666" elapsed="10.004977"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.133873" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:45.146847" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:45.147062" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:45.133674" elapsed="0.013443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.148179" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.147521" elapsed="0.000760"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:45.148652" elapsed="0.000749"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:45.133264" elapsed="0.016318"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.166433" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:45.199341" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:45.199589" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:45.166270" elapsed="0.033377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.200601" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.200007" elapsed="0.000695"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:45.201038" elapsed="0.000789"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:45.165915" elapsed="0.036046"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.202816" elapsed="0.000361"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.202348" elapsed="0.000918"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:35.006898" elapsed="10.196422"/>
</test>
<test id="s1-s7-t13" name="TC2_BGP_Application_Peer_Put_3_Routes" line="220">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:45.208559" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:45.208172" elapsed="0.000762"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.210332" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.210209" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.210190" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.215488" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.215364" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.215346" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.216571" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.216167" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.217054" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:45.216760" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:45.217123" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:45.217281" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.215790" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.223007" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.222898" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.222880" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.224260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.224152" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.224135" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:45.225083" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:45.224499" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.225531" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.225272" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.256960" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:45.226055" elapsed="0.031019"/>
</kw>
<msg time="2026-05-01T00:45:45.257235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:45.257281" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.225719" elapsed="0.031598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.287236" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "u "t "_ "3 "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:45.257889" elapsed="0.029493"/>
</kw>
<msg time="2026-05-01T00:45:45.287567" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:45.287614" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.257544" elapsed="0.030106"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.287951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.287729" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.287709" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.288492" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "u "t "_ "3 "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.288175" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.288854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.288636" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.288617" elapsed="0.000467"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:45.289161" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.291817" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:45:45.292023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.290748" elapsed="0.001406"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.292430" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.292783" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:45.290114" elapsed="0.002855"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:45.289537" elapsed="0.003497"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:45.223854" elapsed="0.069276"/>
</kw>
<msg time="2026-05-01T00:45:45.293220" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.293263" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.223230" elapsed="0.070069"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:45.293558" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:45:45.293376" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.293357" elapsed="0.000289"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.294056" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.294395" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.294483" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:45.222560" elapsed="0.072034"/>
</kw>
<msg time="2026-05-01T00:45:45.294687" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.294731" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.217746" elapsed="0.077021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.295096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.294843" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.294825" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:45.217599" elapsed="0.077596"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:45.217395" elapsed="0.077831"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:45.215001" elapsed="0.080281"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:45.209811" elapsed="0.085567"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.209142" elapsed="0.086282"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:45.204776" elapsed="0.090718"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.295916" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.295644" elapsed="0.000433"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.306142" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-t...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.305800" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.306596" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.306332" elapsed="0.000312"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.310915" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:45:45.311012" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:45.306799" elapsed="0.004240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.311525" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.311225" elapsed="0.000350"/>
</kw>
<arg>${BGP_APP_PEER_PUT_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:45.305311" elapsed="0.006321"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.445573" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:45.316383" elapsed="0.129426"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:45.315885" elapsed="0.130047"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:45:45.315544" elapsed="0.130487"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.457537" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:45:45.470042" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:45.470283" level="INFO">${output_log} = 2026-05-01 00:45:45,404 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-f...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:45.457301" elapsed="0.013042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.471440" level="INFO">2026-05-01 00:45:45,404 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:45:45,407 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-05-01 00:45:45,407 DEBUG: xml data
&lt;ipv4-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.0/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.0/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:45,408 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-05-01 00:45:45,408 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.16/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.16/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:45,408 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-05-01 00:45:45,408 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.32/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.32/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt; 
&lt;/ipv4-routes&gt;
2026-05-01 00:45:45,420 DEBUG: &lt;PreparedRequest [PUT]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:45:45,420 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:45,420 DEBUG: Response: 
2026-05-01 00:45:45,420 DEBUG: &lt;Response [201]&gt; Created
2026-05-01 00:45:45,421 INFO: Total test execution time: 0.017s
2026-05-01 00:45:45,421 INFO: Total build data time: 0.001s
2026-05-01 00:45:45,421 INFO: Total response time: 0.016s
2026-05-01 00:45:45,421 INFO: Total number of response(s): 1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.470762" elapsed="0.001045"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.473067" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_put_tc2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_put_tc2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:45.472231" elapsed="0.000965"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_put_tc2.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.456693" elapsed="0.016637"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.474858" elapsed="0.000402"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.474062" elapsed="0.001288"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:45.203979" elapsed="0.271428"/>
</test>
<test id="s1-s7-t14" name="TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes" line="228">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:45.480943" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:45.480566" elapsed="0.000762"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.482884" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.482692" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.482660" elapsed="0.000332"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.488145" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.488035" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.488016" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.489235" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.488847" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.489738" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:45.489424" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:45.489808" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:45:45.490015" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.488449" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.495781" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.495670" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.495652" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.497051" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.496943" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.496925" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:45.497598" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:45.497270" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.498025" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.497784" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.528733" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:45.498573" elapsed="0.030285"/>
</kw>
<msg time="2026-05-01T00:45:45.529044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:45.529091" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.498218" elapsed="0.030910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.571311" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:45.529719" elapsed="0.041717"/>
</kw>
<msg time="2026-05-01T00:45:45.571690" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:45.571737" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.529323" elapsed="0.042453"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.572117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.571867" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.571840" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.572698" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.572348" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.573072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.572848" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.572830" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:45.573190" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.575920" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:45:45.576135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.574795" elapsed="0.001474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.576585" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.576929" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:45.574107" elapsed="0.003011"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:45.573534" elapsed="0.003649"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:45.496641" elapsed="0.080639"/>
</kw>
<msg time="2026-05-01T00:45:45.577373" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.577417" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.496011" elapsed="0.081465"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:45.577667" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:45.577557" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.577538" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.578166" elapsed="0.000038"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.578545" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.578618" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:45.495308" elapsed="0.083419"/>
</kw>
<msg time="2026-05-01T00:45:45.578821" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.578866" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.490503" elapsed="0.088401"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.579228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.578978" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.578961" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:45.490331" elapsed="0.088998"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:45.490115" elapsed="0.089246"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:45.487667" elapsed="0.091752"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:45.482245" elapsed="0.097288"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.481567" elapsed="0.098014"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:45.476919" elapsed="0.102717"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.632298" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.631872" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.633268" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:45.632854" elapsed="0.000493">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:45.633442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:45.632516" elapsed="0.000980"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.634056" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.633664" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.634413" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:45.634603" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:45.634247" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.635033" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.634789" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.636263" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.635817" elapsed="0.000507"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.636864" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:45.636502" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.637297" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.638055" elapsed="0.000051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.638448" elapsed="0.000071"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:45.637110" elapsed="0.001528"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.636943" elapsed="0.001763"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:45.638757" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:45:45.638925" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:45.635466" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.635147" elapsed="0.003836"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.639159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.639008" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.635126" elapsed="0.004109"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.639853" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.639379" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:45.639930" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.631229" elapsed="0.008827"/>
</kw>
<msg time="2026-05-01T00:45:45.640154" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.618537" elapsed="0.021668"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.653112" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.665610" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.678110" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.678308" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.678517" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.678901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.678745" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:45.678730" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.679166" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.679334" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.679516" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:45.678701" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.678597" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.679745" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.679822" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:45.679949" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:45.614116" elapsed="0.065865"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.681289" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:45.681041" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:45.681449" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:45.680694" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.681853" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.681562" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.682418" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.682123" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.681938" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.681544" elapsed="0.000998"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.684875" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.682697" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:45.684954" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:45.685109" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:45.680346" elapsed="0.004787"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.686394" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:45.686154" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:45.686592" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:45.685780" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:45.686823" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:45.686687" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.686669" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.687056" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.687229" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.687293" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:45.689395" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:45.685441" elapsed="0.003980"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.690863" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.690611" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.691303" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.691063" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:45.702067" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:45.702233" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:45:45.702353" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:45.693489" elapsed="0.008891"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.691412" elapsed="0.011011"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.702655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.702470" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.691394" elapsed="0.011349"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.706206" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.703773" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.703552" elapsed="0.002771"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.703534" elapsed="0.002817"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.709014" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.706675" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.706409" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.706393" elapsed="0.002726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.709697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.709286" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.710041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.709796" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.710618" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.710287" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.710123" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.709777" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.711230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.710863" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.711573" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.711326" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.712106" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.711813" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.711654" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.711308" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.712337" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:45.713161" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.712860" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:45.713342" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:45.703113" elapsed="0.012664"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.715955" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.715847" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.715829" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:45.719078" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:45.716209" elapsed="0.002898"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:45.719159" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:45.719316" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:45.689759" elapsed="0.029583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:45.719404" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:45:45.719573" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:45.591428" elapsed="0.128171"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.748736" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.747908" elapsed="0.000860"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.750861" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:45.750240" elapsed="0.000791">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:45.751166" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:45.748940" elapsed="0.002251"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.752154" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.751359" elapsed="0.000823"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:45.752611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:45.752903" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:45.752348" elapsed="0.000583"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.753536" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "prefix": "8.0.1.16/28"
       },
       {
        "prefix": "8.0.1.32/28"
       }
      ]
     },
     "node-id": "192.0.2.1"
    }
   ],
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.753094" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:45.754300" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.753678" elapsed="0.000800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.755330" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:45.754721" elapsed="0.000650"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.754511" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.753656" elapsed="0.001852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.756425" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.755663" elapsed="0.000954"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:45.756672" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.747173" elapsed="0.009638"/>
</kw>
<msg time="2026-05-01T00:45:45.756867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.734343" elapsed="0.022576"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.769537" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.782068" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.796512" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.796744" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.796929" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.797343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.797191" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:45.797173" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.797589" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.797760" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.797927" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:45.797135" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.797014" elapsed="0.000995"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.798158" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.798237" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:45:45.798390" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:45.731694" elapsed="0.066724"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.798615" elapsed="0.002312"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:45.802228" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:45.801718" elapsed="0.000539"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:45.802907" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:45.802413" elapsed="0.000522"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:45.803094" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:45.801265" elapsed="0.002250"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.801010" elapsed="0.002539"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.803727" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.803575" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.800989" elapsed="0.002814"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:45.720745" elapsed="0.083105"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:45.719929" elapsed="0.083996"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.719683" elapsed="0.084350"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.719665" elapsed="0.084399"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:45.804108" elapsed="0.000038"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:45.584962" elapsed="0.219286"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.580667" elapsed="0.223642"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:45.580135" elapsed="0.224220"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:45.579789" elapsed="0.224624"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.805017" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:45.804712" elapsed="0.000610"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:45.475982" elapsed="0.329381"/>
</test>
<test id="s1-s7-t15" name="TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes" line="233">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:45.808785" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:45.808496" elapsed="0.000582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.810137" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.810004" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.809984" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.815611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.815498" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.815478" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.816719" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:45.816304" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.817207" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:45.816910" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:45.817278" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:45:45.817442" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:45.815921" elapsed="0.001564"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.823091" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.822980" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.822958" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.824367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:45.824260" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.824242" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:45.824932" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:45.824625" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.825339" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.825122" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.856901" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:45.825881" elapsed="0.031173"/>
</kw>
<msg time="2026-05-01T00:45:45.857248" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:45.857295" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.825545" elapsed="0.031787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.898751" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "I "n "t "r "o "d "u "c "e "d "_ "[78CP "[A[78Cr
 "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:45.858085" elapsed="0.040948"/>
</kw>
<msg time="2026-05-01T00:45:45.899288" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:45.899336" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.857676" elapsed="0.041698"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.899927" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.899552" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.899506" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.900630" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "I "n "t "r "o "d "u "c "e "d "_ "[78CP "[A[78Cr
 "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.900181" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.901005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.900785" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.900766" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:45.901126" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.903991" elapsed="0.000156"/>
</kw>
<msg time="2026-05-01T00:45:45.904212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:45.902772" elapsed="0.001581"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.904662" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.905007" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:45.902096" elapsed="0.003103"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:45.901500" elapsed="0.003764"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:45.823952" elapsed="0.081413"/>
</kw>
<msg time="2026-05-01T00:45:45.905488" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.905535" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.823316" elapsed="0.082260"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:45.906039" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:45:45.905659" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.905637" elapsed="0.000492"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.906587" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.906938" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:45.907009" elapsed="0.000050"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:45.822618" elapsed="0.084537"/>
</kw>
<msg time="2026-05-01T00:45:45.907249" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:45.907293" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.817876" elapsed="0.089453"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:45.907693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:45.907407" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:45.907389" elapsed="0.000442"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:45.817729" elapsed="0.090127"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:45.817547" elapsed="0.090344"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:45.815117" elapsed="0.092835"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:45.809705" elapsed="0.098306"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:45.809237" elapsed="0.098822"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:45.806154" elapsed="0.101964"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:45.908632" elapsed="0.000112"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:45.908263" elapsed="0.000538"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.921550" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:45.934411" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:45.934573" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:45.921349" elapsed="0.013251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.935180" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.934822" elapsed="0.000407"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:45.935384" elapsed="0.000341"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:45.920963" elapsed="0.014833"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:45.908956" elapsed="0.026898"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:45.948279" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:45.986775" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:45.986929" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:45.948112" elapsed="0.038844"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:45.987563" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:45.987187" elapsed="0.000422"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:45.987765" elapsed="0.000319"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:45.947744" elapsed="0.040409"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.000315" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:46.038438" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:46.038550" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.000150" elapsed="0.038425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.038991" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.038740" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:46.039188" elapsed="0.000341"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:45.999779" elapsed="0.039813"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.051501" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:46.090774" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:46.090939" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.051295" elapsed="0.039671"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.091600" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.091203" elapsed="0.000443"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:46.091801" elapsed="0.000316"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:46.050918" elapsed="0.041272"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.104762" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:46.142222" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:46.142382" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.104596" elapsed="0.037812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.143008" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.142670" elapsed="0.000383"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:46.143207" elapsed="0.000340"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:46.104212" elapsed="0.039432"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.144335" elapsed="0.000280"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.143987" elapsed="0.000694"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:45.805602" elapsed="0.339119"/>
</test>
<test id="s1-s7-t16" name="TC2_BGP_Application_Peer_Delete_All_Routes" line="249">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:46.148386" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:46.148115" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.149792" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.149647" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.149621" elapsed="0.000254"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.154946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.154839" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.154821" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.156045" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.155659" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.156542" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:46.156233" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:46.156613" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:45:46.156780" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.155253" elapsed="0.001551"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.162595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.162485" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.162454" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.163902" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.163795" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.163777" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:46.164426" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:46.164119" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.164850" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.164632" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.198035" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:46.165370" elapsed="0.032764"/>
</kw>
<msg time="2026-05-01T00:45:46.198314" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:46.198359" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.165036" elapsed="0.033360"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.231630" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "A "l "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:46.198955" elapsed="0.032994"/>
</kw>
<msg time="2026-05-01T00:45:46.232191" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:46.232237" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.198611" elapsed="0.033665"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.232754" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.232400" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.232361" elapsed="0.000482"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.233369" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "A "l "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.232991" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.233746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.233529" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.233510" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:46.233861" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.236644" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:45:46.236858" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.235443" elapsed="0.001552"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.237275" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.237643" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:46.234795" elapsed="0.003036"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:46.234199" elapsed="0.003697"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:46.163435" elapsed="0.074558"/>
</kw>
<msg time="2026-05-01T00:45:46.238088" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.238166" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.162819" elapsed="0.075390"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:46.238397" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:46.238289" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.238270" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.238928" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.239286" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.239358" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:46.162131" elapsed="0.077357"/>
</kw>
<msg time="2026-05-01T00:45:46.239587" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.239631" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.157198" elapsed="0.082474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.240033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.239750" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.239732" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:46.157051" elapsed="0.083084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:46.156866" elapsed="0.083305"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:46.154480" elapsed="0.085755"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:46.149312" elapsed="0.091037"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.148819" elapsed="0.091581"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:46.145784" elapsed="0.094715"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.240930" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.240651" elapsed="0.000440"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.250171" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-type...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.249802" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.250626" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.250360" elapsed="0.000313"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.255516" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:45:46.255623" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-typ...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:46.250829" elapsed="0.004820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.256104" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.255819" elapsed="0.000334"/>
</kw>
<arg>${BGP_APP_PEER_DELETE_ALL_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:46.249360" elapsed="0.006860"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.406692" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:46.261010" elapsed="0.145852"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:46.260505" elapsed="0.146444"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:45:46.260144" elapsed="0.146893"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.416646" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:45:46.429975" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:46.430197" level="INFO">${output_log} = 2026-05-01 00:45:46,365 INFO: Delete all prefixes from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.416487" elapsed="0.013770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.431323" level="INFO">2026-05-01 00:45:46,365 INFO: Delete all prefixes from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:45:46,379 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:45:46,379 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:46,380 DEBUG: Response: 
2026-05-01 00:45:46,380 DEBUG: &lt;Response [204]&gt; No Content
2026-05-01 00:45:46,380 INFO: Total test execution time: 0.015s
2026-05-01 00:45:46,380 INFO: Total build data time: 0.000s
2026-05-01 00:45:46,380 INFO: Total response time: 0.014s
2026-05-01 00:45:46,380 INFO: Total number of response(s): 1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.430691" elapsed="0.000751"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.432806" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_all_tc2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_all_tc2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:46.431920" elapsed="0.001014"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_delete_all_tc2.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.416009" elapsed="0.017059"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.434401" elapsed="0.000577"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.433713" elapsed="0.001407"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:46.145167" elapsed="0.290038"/>
</test>
<test id="s1-s7-t17" name="TC2_Check_Example-IPv4-Topology_Is_Empty" line="257">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:46.440607" elapsed="0.000291"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:46.440200" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.442446" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.442263" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.442232" elapsed="0.000342"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.448557" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.448435" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.448417" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.449637" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.449237" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.450122" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:46.449827" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:46.450193" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:45:46.450358" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.448859" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.455917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.455809" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.455791" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.457186" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.457078" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.457060" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:46.457741" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:46.457404" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.458144" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.457929" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.490625" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:46.458687" elapsed="0.032036"/>
</kw>
<msg time="2026-05-01T00:45:46.490913" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:46.490961" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.458332" elapsed="0.032665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.523180" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:46.491544" elapsed="0.031752"/>
</kw>
<msg time="2026-05-01T00:45:46.523479" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:46.523527" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.491174" elapsed="0.032397"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.523881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.523652" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.523632" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.524406" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.524109" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.524880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.524659" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.524635" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:46.524993" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.527701" elapsed="0.000277"/>
</kw>
<msg time="2026-05-01T00:45:46.528043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.526445" elapsed="0.001735"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.528497" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.528881" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:46.525822" elapsed="0.003246"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:46.525266" elapsed="0.003867"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:46.456777" elapsed="0.072458"/>
</kw>
<msg time="2026-05-01T00:45:46.529327" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.529371" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.456146" elapsed="0.073261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:46.529684" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:46.529571" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.529548" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.530173" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.530534" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.530607" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:46.455473" elapsed="0.075248"/>
</kw>
<msg time="2026-05-01T00:45:46.530815" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.530859" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.450785" elapsed="0.080110"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.531219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.530969" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.530952" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:46.450639" elapsed="0.080679"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:46.450442" elapsed="0.080907"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:46.448051" elapsed="0.083352"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:46.441824" elapsed="0.089650"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.441185" elapsed="0.090337"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:46.437169" elapsed="0.094406"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.583818" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.583424" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.584788" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:46.584398" elapsed="0.000472">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:46.584966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:46.584053" elapsed="0.000938"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.585573" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.585159" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.585907" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:46.586053" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:46.585769" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.586497" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.586236" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.587716" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.587259" elapsed="0.000517"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.588299" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:46.587942" elapsed="0.000383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.588766" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.589514" elapsed="0.000051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.589853" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:46.588548" elapsed="0.001468"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.588373" elapsed="0.001711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:46.590130" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:46.590291" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:46.586910" elapsed="0.003405"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.586609" elapsed="0.003738"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.590551" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.590371" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.586591" elapsed="0.004040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.591226" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.590780" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:46.591301" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.582804" elapsed="0.008623"/>
</kw>
<msg time="2026-05-01T00:45:46.591500" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.569962" elapsed="0.021588"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.604029" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.616415" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.629197" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.629396" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.629590" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.629958" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.629810" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:46.629796" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.630178" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.630348" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.630532" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:46.629767" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.629665" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.630763" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.630839" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:46.630960" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:46.565706" elapsed="0.065280"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.632403" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:46.631991" elapsed="0.000494">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:46.632579" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:46.631653" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.632950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.632673" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.633501" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.633198" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.633032" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.632655" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.635914" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.633737" elapsed="0.002204"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:46.635991" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:46.636145" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:46.631312" elapsed="0.004901"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.637491" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:46.637231" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:46.637649" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:46.636896" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:46.637877" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:45:46.637743" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.637725" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.638111" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.638283" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.638348" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:46.640260" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:46.636546" elapsed="0.003741"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.641694" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.641433" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.642135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.641892" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:46.653300" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:46.653621" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:45:46.653872" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:46.644520" elapsed="0.009412"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.642243" elapsed="0.011786"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.654436" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.654088" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.642225" elapsed="0.012437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.662143" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.656979" elapsed="0.005228"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.656417" elapsed="0.005838"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.656377" elapsed="0.005908"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.665113" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.662660" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.662353" elapsed="0.002841"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.662333" elapsed="0.002885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.665799" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.665381" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.666134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.665897" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.666693" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.666376" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.666215" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.665879" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.667337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.666975" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.667687" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.667434" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.668221" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.667929" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.667767" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.667416" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.668468" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:46.669307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.669011" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:46.669506" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:46.655487" elapsed="0.016439"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.672101" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.671996" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.671978" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:46.675048" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:46.672318" elapsed="0.002759"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:46.675128" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:45:46.675283" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:46.640616" elapsed="0.034692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:46.675369" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:45:46.675544" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:46.543077" elapsed="0.132493"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.704989" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.704181" elapsed="0.000838"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.707114" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:46.706524" elapsed="0.000750">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:46.707409" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:46.705191" elapsed="0.002242"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.708372" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.707617" elapsed="0.000852"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:46.708899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:46.709158" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:46.708640" elapsed="0.000546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.709797" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.709344" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:46.710564" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.709934" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.711580" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:46.710930" elapsed="0.000692"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.710753" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.709911" elapsed="0.001816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.712657" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.711878" elapsed="0.000807"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:46.712735" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.703478" elapsed="0.009390"/>
</kw>
<msg time="2026-05-01T00:45:46.712940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.690639" elapsed="0.022355"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.725675" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.738216" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.752387" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.752598" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.752779" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.753181" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.753029" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:46.753015" elapsed="0.000277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.753443" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.753634" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.753802" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:46.752971" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.752861" elapsed="0.001022"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.754032" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.754107" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:46.754227" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:46.687702" elapsed="0.066552"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.754430" elapsed="0.002223"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:46.757794" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:46.757436" elapsed="0.000387"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:46.758280" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:46.757978" elapsed="0.000331"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:46.758486" elapsed="0.000331"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:46.756976" elapsed="0.001901"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.756734" elapsed="0.002177"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.759109" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.758937" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.756715" elapsed="0.002471"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:46.676703" elapsed="0.082530"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:46.675893" elapsed="0.083413"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.675653" elapsed="0.083698"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.675636" elapsed="0.083739"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:46.759407" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:46.536982" elapsed="0.222570"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.532758" elapsed="0.226853"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:46.532054" elapsed="0.227602"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:46.531710" elapsed="0.228002"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.760285" elapsed="0.000255"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:46.759985" elapsed="0.000655"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:46.435989" elapsed="0.324691"/>
</test>
<test id="s1-s7-t18" name="TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes" line="262">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:46.764607" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:46.764328" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.765876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.765767" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.765748" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.813772" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.813630" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.813603" elapsed="0.000260"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.815014" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:46.814559" elapsed="0.000489"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.815555" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:46.815234" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:46.815627" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:45:46.815794" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:46.814149" elapsed="0.001670"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.821400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.821293" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.821274" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.822680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:46.822573" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.822556" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:46.823200" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:46.822895" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.823618" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.823384" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.855405" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:46.824139" elapsed="0.031388"/>
</kw>
<msg time="2026-05-01T00:45:46.855695" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:46.855741" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.823804" elapsed="0.031972"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.920551" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "[78Cr "[A[78Ce
 "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:46.856285" elapsed="0.064435"/>
</kw>
<msg time="2026-05-01T00:45:46.920913" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:46.920960" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.855947" elapsed="0.065049"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.921396" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.921098" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.921069" elapsed="0.000447"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.922015" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "[78Cr "[A[78Ce
 "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.921669" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.922475" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.922237" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.922218" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:46.922592" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.925588" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:45:46.925799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:46.924297" elapsed="0.001637"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.926314" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.926680" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:46.923514" elapsed="0.003354"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:46.922905" elapsed="0.004029"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:46.822248" elapsed="0.104783"/>
</kw>
<msg time="2026-05-01T00:45:46.927123" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.927167" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.821640" elapsed="0.105563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:46.927388" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:46.927280" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.927261" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.927900" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.928248" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:46.928321" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:46.820931" elapsed="0.107500"/>
</kw>
<msg time="2026-05-01T00:45:46.928540" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:46.928584" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.816212" elapsed="0.112408"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:46.928946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:46.928695" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:46.928678" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:46.816064" elapsed="0.112982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:46.815880" elapsed="0.113198"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:46.813072" elapsed="0.116063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:46.765480" elapsed="0.163712"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:46.765037" elapsed="0.164202"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:46.761996" elapsed="0.167297"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:46.929733" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:46.929445" elapsed="0.000449"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.942722" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:46.958109" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:46.958338" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.942553" elapsed="0.015839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:46.959404" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:46.958797" elapsed="0.000744"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:46.959880" elapsed="0.000726"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:46.942189" elapsed="0.018579"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:46.930093" elapsed="0.030793"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:46.975740" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:47.016557" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:47.016776" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:46.975576" elapsed="0.041255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.017868" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:47.017205" elapsed="0.000763"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:47.018339" elapsed="0.000738"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:46.975218" elapsed="0.044010"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.035390" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:47.069960" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:47.070182" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:47.035228" elapsed="0.035009"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.071264" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:47.070655" elapsed="0.000707"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:47.071732" elapsed="0.000690"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:47.034882" elapsed="0.037714"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.087746" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:47.120836" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:47.121056" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:47.087583" elapsed="0.033527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.122142" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:47.121521" elapsed="0.000720"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:47.122611" elapsed="0.000693"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:47.087223" elapsed="0.036215"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.139776" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:45:47.177447" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:47.177701" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:47.139615" elapsed="0.038141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.178776" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:47.178163" elapsed="0.000711"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:45:47.179206" elapsed="0.000724"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:45:47.139254" elapsed="0.040813"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:47.181378" elapsed="0.000589"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:47.180702" elapsed="0.001411"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:46.761303" elapsed="0.420896"/>
</test>
<test id="s1-s7-t19" name="TC2_Stop_BGP_Peer" line="278">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:47.188184" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:47.187915" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:47.189486" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:47.189353" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.189332" elapsed="0.000229"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:47.194800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:47.194692" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.194674" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.195881" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:47.195495" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.196361" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:47.196068" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:47.196432" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:45:47.196609" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:47.195106" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:47.202206" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:47.202098" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.202079" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:47.203433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:47.203327" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.203309" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:47.203982" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:47.203678" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.204412" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:47.204200" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.260480" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:47.204951" elapsed="0.055637"/>
</kw>
<msg time="2026-05-01T00:45:47.260759" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:47.260807" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:47.204615" elapsed="0.056228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:47.289001" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:47.261374" elapsed="0.027735"/>
</kw>
<msg time="2026-05-01T00:45:47.289274" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:47.289322" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:47.261022" elapsed="0.028335"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.289710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:47.289438" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.289417" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.290279" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:47.289937" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.290681" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:47.290412" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.290394" elapsed="0.000412"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:47.290842" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:47.293449" elapsed="0.000312"/>
</kw>
<msg time="2026-05-01T00:45:47.293830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:47.292344" elapsed="0.001647"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.294308" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.294676" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:47.291705" elapsed="0.003162"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:47.291127" elapsed="0.003807"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:47.203027" elapsed="0.092025"/>
</kw>
<msg time="2026-05-01T00:45:47.295150" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:47.295195" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:47.202430" elapsed="0.092800"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:47.295420" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-05-01T00:45:47.295308" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.295290" elapsed="0.000271"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.295994" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.296363" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:47.296438" elapsed="0.000038"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:47.201734" elapsed="0.094840"/>
</kw>
<msg time="2026-05-01T00:45:47.296667" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:47.296710" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "2 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:47.197016" elapsed="0.099730"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:47.297074" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:47.296821" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:47.296803" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:47.196873" elapsed="0.100315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:47.196692" elapsed="0.100538"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:47.194319" elapsed="0.102971"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:47.189054" elapsed="0.108292"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:47.188615" elapsed="0.108775"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:47.183953" elapsed="0.113525"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:47.297894" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:47.297620" elapsed="0.000435"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:47.299227" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:47.298901" elapsed="0.000353"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:47.299433" elapsed="0.000274"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:45:47.298629" elapsed="0.001138"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.300757" level="INFO">2026-05-01 00:45:45,216 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.014s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:45:49.301738" level="INFO">${output} = 2026-05-01 00:45:45,216 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.014s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:45:47.299967" elapsed="2.001839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.303062" level="INFO">2026-05-01 00:45:45,216 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.014s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.302326" elapsed="0.001424"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:45:47.298272" elapsed="2.005622"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.317153" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-05-01T00:45:49.330424" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:49.330681" level="INFO">${output_log} = 2026-05-01 00:45:35,185 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:35,186 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:49.317008" elapsed="0.013732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.331712" level="INFO">2026-05-01 00:45:35,185 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:35,186 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:35,188 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:35,190 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:35,191 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:35,192 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:35,193 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:35,194 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:35,194 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:35,194 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:35,195 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:35,195 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:35,195 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:35,196 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:35,197 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:35,199 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:35,200 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,200 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:35,200 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:35,206 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-05-01 00:45:35,206 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:35,206 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:35,207 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:35,208 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,216 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.014s
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:45,217 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,429 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,430 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,431 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,432 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:45,433 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:45,434 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,435 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,436 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,437 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:45,438 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:45,439 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:45,440 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:45,441 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:45:46,388 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,389 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,390 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,391 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:45:46,392 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,393 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,394 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,395 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,396 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,397 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,398 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:45:46,399 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:46,400 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:45:46,401 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:46,402 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:46,403 DEBUG BGP-Thread-1 (job): NLRI prefix list: []</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.331103" elapsed="0.001300"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.333618" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:49.332850" elapsed="0.000890"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>bgp_peer_tc2.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.316638" elapsed="0.017236"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.335211" elapsed="0.000366"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.334583" elapsed="0.001084"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:47.182707" elapsed="2.153014"/>
</test>
<test id="s1-s7-t20" name="TC3_BGP_Application_Peer_Put_3_Routes" line="285">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:49.340873" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:49.340502" elapsed="0.000738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.342745" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.342557" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.342524" elapsed="0.000333"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.348034" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.347926" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.347908" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.349121" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.348734" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.349620" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:49.349310" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:49.349690" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:45:49.349857" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.348337" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.355435" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.355325" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.355307" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.356706" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.356598" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.356580" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:49.357234" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:49.356923" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.357656" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.357419" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.388684" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:49.358201" elapsed="0.030583"/>
</kw>
<msg time="2026-05-01T00:45:49.388968" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:49.389015" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.357843" elapsed="0.031206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.416932" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "u "t "_ "3 "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:49.389586" elapsed="0.027597"/>
</kw>
<msg time="2026-05-01T00:45:49.417427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:49.417597" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.389222" elapsed="0.028417"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.418117" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.417764" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.417726" elapsed="0.000480"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.418815" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "P "u "t "_ "3 "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.418386" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.419178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.418958" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.418939" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:49.419296" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.422115" elapsed="0.000167"/>
</kw>
<msg time="2026-05-01T00:45:49.422346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.420967" elapsed="0.001538"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.422786" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.423126" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:49.420270" elapsed="0.003045"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:49.419660" elapsed="0.003721"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:49.356271" elapsed="0.067226"/>
</kw>
<msg time="2026-05-01T00:45:49.423595" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:49.423639" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.355673" elapsed="0.068005"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:49.423866" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:45:49.423757" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.423738" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.424380" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.424751" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.424824" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:49.354986" elapsed="0.069953"/>
</kw>
<msg time="2026-05-01T00:45:49.425035" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:49.425080" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.350295" elapsed="0.074824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.425449" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.425197" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.425180" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:49.350149" elapsed="0.075432"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:49.349941" elapsed="0.075676"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:49.347565" elapsed="0.078115"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:49.342111" elapsed="0.083630"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.341469" elapsed="0.084358"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:49.337029" elapsed="0.088856"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.426326" elapsed="0.000108"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.426032" elapsed="0.000530"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.435432" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-t...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.435099" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.435881" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.435638" elapsed="0.000290"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.441527" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:45:49.441624" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:49.436081" elapsed="0.005570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.442056" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.441811" elapsed="0.000293"/>
</kw>
<arg>${BGP_APP_PEER_PUT_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:49.434679" elapsed="0.007481"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.583766" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:45:49.447011" elapsed="0.136849"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:49.446496" elapsed="0.137427"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:45:49.446111" elapsed="0.137879"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.593836" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:45:49.606551" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:45:49.606668" level="INFO">${output_log} = 2026-05-01 00:45:49,538 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-f...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:45:49.593666" elapsed="0.013029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.607298" level="INFO">2026-05-01 00:45:49,538 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:45:49,541 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-05-01 00:45:49,541 DEBUG: xml data
&lt;ipv4-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.0/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.0/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:49,541 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-05-01 00:45:49,541 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.16/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.16/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt;
2026-05-01 00:45:49,541 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-05-01 00:45:49,541 DEBUG: xml data
&lt;ipv4-route&gt;
  &lt;prefix&gt;8.0.1.32/28&lt;/prefix&gt;
  &lt;path-id&gt;0&lt;/path-id&gt;
  &lt;route-key&gt;8.0.1.32/28&lt;/route-key&gt;
  &lt;attributes&gt;
   &lt;ipv4-next-hop&gt;
    &lt;global&gt;192.0.2.1&lt;/global&gt;
   &lt;/ipv4-next-hop&gt;&lt;as-path/&gt;
   &lt;multi-exit-disc&gt;
    &lt;med&gt;0&lt;/med&gt;
   &lt;/multi-exit-disc&gt;
   &lt;local-pref&gt;
    &lt;pref&gt;100&lt;/pref&gt;
   &lt;/local-pref&gt;
   &lt;originator-id&gt;
    &lt;originator&gt;41.41.41.41&lt;/originator&gt;
   &lt;/originator-id&gt;
   &lt;origin&gt;
    &lt;value&gt;igp&lt;/value&gt;
   &lt;/origin&gt;
   &lt;cluster-id&gt;
    &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
   &lt;/cluster-id&gt;
  &lt;/attributes&gt;
 &lt;/ipv4-route&gt; 
&lt;/ipv4-routes&gt;
2026-05-01 00:45:49,565 DEBUG: &lt;PreparedRequest [PUT]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:45:49,565 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:45:49,565 DEBUG: Response: 
2026-05-01 00:45:49,565 DEBUG: &lt;Response [201]&gt; Created
2026-05-01 00:45:49,565 INFO: Total test execution time: 0.028s
2026-05-01 00:45:49,565 INFO: Total build data time: 0.001s
2026-05-01 00:45:49,565 INFO: Total response time: 0.027s
2026-05-01 00:45:49,565 INFO: Total number of response(s): 1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.606871" elapsed="0.000749"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.608747" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_put_tc3.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_put_tc3.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:45:49.608052" elapsed="0.000817"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_put_tc3.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.593178" elapsed="0.015824"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.610330" elapsed="0.000621"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.609654" elapsed="0.001435"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:49.336191" elapsed="0.274984"/>
</test>
<test id="s1-s7-t21" name="TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes" line="293">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:49.616787" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:49.616520" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.618130" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.617986" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.617960" elapsed="0.000257"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.623368" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.623259" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.623241" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.624480" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.624076" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.624964" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:49.624671" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:49.625033" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:45:49.625203" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.623693" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.630969" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.630862" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.630843" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.632248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.632141" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.632123" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:49.632811" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:49.632501" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.633214" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.632999" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.667011" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:49.633759" elapsed="0.033471"/>
</kw>
<msg time="2026-05-01T00:45:49.667630" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:49.667735" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.633402" elapsed="0.034410"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.713216" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:49.669020" elapsed="0.044393"/>
</kw>
<msg time="2026-05-01T00:45:49.713760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:49.713809" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.668196" elapsed="0.045652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.714277" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.713963" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.713926" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.714959" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "W "i "t "h "_ "3 "_ "R "o "u "t "e "[78Cs "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.714534" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.715336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.715113" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.715091" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:49.715469" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.718274" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:45:49.718508" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.717056" elapsed="0.001593"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.718946" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.719293" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:49.716387" elapsed="0.003109"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:49.715804" elapsed="0.003759"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:49.631841" elapsed="0.087819"/>
</kw>
<msg time="2026-05-01T00:45:49.719756" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:49.719801" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.631192" elapsed="0.088677"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:49.720060" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:45:49.719951" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.719932" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.720717" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.721088" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.721161" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:49.630496" elapsed="0.090777"/>
</kw>
<msg time="2026-05-01T00:45:49.721368" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:49.721413" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.625638" elapsed="0.095827"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.721798" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.721545" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.721527" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:49.625489" elapsed="0.096409"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:49.625289" elapsed="0.096645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:49.622898" elapsed="0.099097"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:49.617676" elapsed="0.104419"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.617202" elapsed="0.104941"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:49.613322" elapsed="0.108879"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.774770" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.774375" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.775694" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:49.775312" elapsed="0.000464">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:49.775871" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:49.774978" elapsed="0.000917"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.776445" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.776063" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.776792" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:49.776956" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:49.776653" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.777380" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.777138" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.778618" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.778162" elapsed="0.000518"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.779228" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:45:49.778866" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.779684" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.780411" elapsed="0.000070"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.780767" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:45:49.779492" elapsed="0.001441"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.779308" elapsed="0.001691"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:45:49.781045" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:49.781207" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:45:49.777810" elapsed="0.003423"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.777509" elapsed="0.003755"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.781436" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.781288" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.777489" elapsed="0.004041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.782116" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.781673" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:49.782192" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.773764" elapsed="0.008552"/>
</kw>
<msg time="2026-05-01T00:45:49.782404" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.761093" elapsed="0.021376"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.795352" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.807843" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.820359" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.820570" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.820748" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.821115" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.820968" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:49.820954" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.821334" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.821520" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.821689" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:49.820925" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.820822" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.821913" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.821989" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:45:49.822109" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:49.756837" elapsed="0.065298"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.823414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:49.823176" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:49.823589" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:49.822806" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.823966" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.823685" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.824535" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.824224" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.824050" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.823666" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.826981" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.824773" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:45:49.827060" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:45:49.827216" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:49.822479" elapsed="0.004761"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.828482" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:49.828234" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:49.828640" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:49.827895" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:45:49.828871" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:45:49.828735" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.828717" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.829102" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.829274" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.829338" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:49.831416" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:45:49.827572" elapsed="0.003871"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.832852" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.832605" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.833292" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.833052" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:45:49.845053" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:45:49.845338" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:45:49.845618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:45:49.835555" elapsed="0.010125"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.833401" elapsed="0.012374"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.846181" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.845834" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.833383" elapsed="0.012988"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.853492" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.0.1.32/28"},{"prefix":"8.0.1.16/28"},{"prefix":"8.0.1.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.848712" elapsed="0.004850"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.848189" elapsed="0.005475"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.848150" elapsed="0.005554"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.857399" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.854099" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.853785" elapsed="0.003747"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.853762" elapsed="0.003805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.858343" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.857798" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.858838" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.858502" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.859657" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.859213" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.858952" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.858474" elapsed="0.001300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.860403" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.859998" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.860755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.860518" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.861295" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.861001" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.860837" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.860499" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.861543" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:45:49.862366" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.862054" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:45:49.862566" elapsed="0.003669"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:45:49.847220" elapsed="0.019078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.866489" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.866368" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.866349" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:49.869572" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:49.866706" elapsed="0.002896"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:45:49.869655" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:49.869814" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:45:49.831780" elapsed="0.038060"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:49.869903" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:45:49.870053" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:45:49.734004" elapsed="0.136076"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.899923" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.899140" elapsed="0.000812"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.901954" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:45:49.901396" elapsed="0.000713">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:45:49.902243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:49.900116" elapsed="0.002152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.903221" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.902433" elapsed="0.000817"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:45:49.903665" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/filled_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:45:49.903904" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:45:49.903414" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.904540" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "prefix": "8.0.1.16/28"
       },
       {
        "prefix": "8.0.1.32/28"
       }
      ]
     },
     "node-id": "192.0.2.1"
    }
   ],
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:49.904090" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:45:49.905280" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.904676" elapsed="0.000765"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.906271" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:49.905665" elapsed="0.000647"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.905487" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.904657" elapsed="0.001759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.907360" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.906581" elapsed="0.000809"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:45:49.907439" elapsed="0.000047"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.898396" elapsed="0.009191"/>
</kw>
<msg time="2026-05-01T00:45:49.907642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.885585" elapsed="0.022134"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.920687" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.933272" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.945825" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.946024" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.946205" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.946663" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.946430" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:45:49.946415" elapsed="0.000337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.946898" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.947067" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.947267" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:45:49.946385" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.946282" elapsed="0.001067"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.947517" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.947596" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:45:49.947719" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:45:49.882901" elapsed="0.064845"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:49.947923" elapsed="0.002201"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:49.951339" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:49.950875" elapsed="0.000493"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:45:49.951973" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "l3-unicast-igp-topology:igp-node-attributes": {
      "prefix": [
       {
        "prefix": "8.0.1.0/28"
       },
       {
        "pre...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:45:49.951545" elapsed="0.000456"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:45:49.952164" elapsed="0.000347"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:45:49.950463" elapsed="0.002109"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.950205" elapsed="0.002400"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:49.952778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:49.952630" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.950185" elapsed="0.002669"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:45:49.871236" elapsed="0.081665"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:45:49.870403" elapsed="0.082572"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:49.870161" elapsed="0.082896"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.870144" elapsed="0.082937"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:45:49.953116" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:45:49.727789" elapsed="0.225453"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.723242" elapsed="0.230060"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:45:49.722722" elapsed="0.230625"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:45:49.722348" elapsed="0.231056"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.953998" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:45:49.953694" elapsed="0.000608"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:49.611862" elapsed="0.342480"/>
</test>
<test id="s1-s7-t22" name="TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes" line="298">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:45:49.957756" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:45:49.957494" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.959003" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.958894" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.958876" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.964370" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.964264" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.964246" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.965434" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:45:49.965057" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:45:49.965930" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:45:49.965638" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:45:49.966000" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:45:49.966155" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:45:49.964684" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.971728" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.971621" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.971602" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:45:49.972948" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:45:49.972841" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:49.972823" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:45:49.973476" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:45:49.973164" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:45:49.973876" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:49.973662" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:50.007090" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:49.974400" elapsed="0.032917"/>
</kw>
<msg time="2026-05-01T00:45:50.007543" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:45:50.007591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.974063" elapsed="0.033564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:45:50.055335" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "R "e "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "_ "A "n "d "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "[78C_ "[A[78C3
 "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:45:50.008471" elapsed="0.047000"/>
</kw>
<msg time="2026-05-01T00:45:50.055635" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:45:50.055681" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:50.008061" elapsed="0.047655"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.056033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:50.055797" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:50.055775" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:50.056580" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "R "e "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "_ "A "n "d "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "[78C_ "[A[78C3
 "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:50.056260" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.056945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:50.056729" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:50.056711" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:45:50.057058" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:50.059603" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:45:50.059805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:45:50.058534" elapsed="0.001408"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.060222" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.060575" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:45:50.057904" elapsed="0.002857"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:45:50.057340" elapsed="0.003485"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:45:49.972541" elapsed="0.088379"/>
</kw>
<msg time="2026-05-01T00:45:50.061010" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:50.061054" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.971950" elapsed="0.089139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:45:50.061434" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:45:50.061166" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:50.061148" elapsed="0.000393"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.061947" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.062291" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:45:50.062362" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:45:49.971265" elapsed="0.091234"/>
</kw>
<msg time="2026-05-01T00:45:50.062594" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:45:50.062637" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "R "e "c "o "n "n "e "c "t "_ "B...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.966563" elapsed="0.096109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:45:50.062999" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:45:50.062749" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:45:50.062731" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:45:49.966404" elapsed="0.096733"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:45:49.966233" elapsed="0.096933"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:45:49.963899" elapsed="0.099321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:45:49.958609" elapsed="0.104665"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:45:49.958168" elapsed="0.105164"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:45:49.955334" elapsed="0.108057"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:45:50.063814" elapsed="0.000105"/>
</kw>
<status status="PASS" start="2026-05-01T00:45:50.063545" elapsed="0.000429"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:45:50.072616" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:45:50.072259" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:50.073042" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:50.072802" elapsed="0.000285"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:45:50.083556" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-05-01T00:45:50.083727" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:45:50.073239" elapsed="0.010521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:45:50.084170" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:45:50.083922" elapsed="0.000370"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:45:50.071882" elapsed="0.012465"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.086881" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-05-01 00:45:50,147 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:50,149 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:50,157 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:50,167 INFO BGP-Thread-1 (job): ... idle for 0.008s
2026-05-01 00:45:50,167 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.008s
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,169 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:45:50.085915" elapsed="10.002274">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:50,147 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:50,149 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
...DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.088555" elapsed="0.000050"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:45:50.085645" elapsed="10.003135">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-05-01 00:45:50,147 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:50,149 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
...DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:45:50.085229" elapsed="10.003720"/>
</kw>
<msg time="2026-05-01T00:46:00.089069" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:45:50.084875" elapsed="10.004221"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:46:00.089308" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:46:00.089206" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.089176" elapsed="0.000229"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.089675" elapsed="0.000029"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.089855" elapsed="0.000020"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:45:50.084599" elapsed="10.005338"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.103126" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.116009" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.116110" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.102936" elapsed="0.013201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.116593" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.116303" elapsed="0.000336"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.116793" elapsed="0.000316"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.102558" elapsed="0.014616"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:00.090118" elapsed="0.027108"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.129160" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.166609" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.166820" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.128998" elapsed="0.037877"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.167854" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.167238" elapsed="0.000761"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.168346" elapsed="0.000731"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.128653" elapsed="0.040566"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.185259" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.202829" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.203057" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.185097" elapsed="0.018016"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.204168" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.203537" elapsed="0.000731"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.204647" elapsed="0.000699"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.184743" elapsed="0.020778"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.221542" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.254694" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.254901" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.221363" elapsed="0.033593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.255935" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.255323" elapsed="0.000760"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.256430" elapsed="0.000727"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.221008" elapsed="0.036286"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.273293" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.306161" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.306377" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.273131" elapsed="0.033302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.307393" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.306838" elapsed="0.000686"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.307866" elapsed="0.000748"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.272783" elapsed="0.035969"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.325130" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:00.359065" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.359277" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.324968" elapsed="0.034362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.360331" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.359742" elapsed="0.000688"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:00.360804" elapsed="0.000727"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:00.324608" elapsed="0.037061"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.362994" elapsed="0.000570"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.362278" elapsed="0.001429"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:45:49.954780" elapsed="10.409014"/>
</test>
<test id="s1-s7-t23" name="TC3_BGP_Application_Peer_Delete_All_Routes" line="317">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:00.369990" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:00.369535" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.371851" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.371670" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.371638" elapsed="0.000317"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.378336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.378229" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.378211" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.379411" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.379029" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.379909" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:00.379616" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:00.379979" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:46:00.380162" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.378653" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.385709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.385600" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.385578" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.386971" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.386864" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.386846" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:00.387513" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:00.387189" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.387920" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.387702" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.417870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:00.388466" elapsed="0.029517"/>
</kw>
<msg time="2026-05-01T00:46:00.418178" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:00.418225" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.388117" elapsed="0.030143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.449444" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "A "l "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:00.418834" elapsed="0.030731"/>
</kw>
<msg time="2026-05-01T00:46:00.449726" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:00.449772" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.418448" elapsed="0.031359"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.450132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.449895" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.449871" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.450684" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "D "e "l "e "t "e "_ "A "l "l "_ "R "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.450357" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.451043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.450825" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.450807" elapsed="0.000370"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:00.451214" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.453920" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:46:00.454139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.452772" elapsed="0.001568"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.454656" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.454998" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:00.452117" elapsed="0.003084"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:00.451540" elapsed="0.003728"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:00.386564" elapsed="0.068803"/>
</kw>
<msg time="2026-05-01T00:46:00.455477" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:00.455524" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.385934" elapsed="0.069626"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:00.455745" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:00.455637" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.455619" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.456267" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.456628" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.456703" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:00.385242" elapsed="0.071570"/>
</kw>
<msg time="2026-05-01T00:46:00.456905" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:00.456949" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "A "p "p "l "i "c "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.380591" elapsed="0.076394"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.457310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.457060" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.457043" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:00.380429" elapsed="0.076983"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:00.380246" elapsed="0.077200"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:00.377868" elapsed="0.079652"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:00.371227" elapsed="0.086348"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.370603" elapsed="0.087016"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:00.365730" elapsed="0.091942"/>
</kw>
<kw name="Switch_To_BGP_Application_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_app_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.458114" elapsed="0.000104"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.457841" elapsed="0.000433"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.466958" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-type...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.466630" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.467386" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.467145" elapsed="0.000344"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.471993" level="INFO">python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-05-01T00:46:00.472110" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-typ...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:00.467646" elapsed="0.004492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.472564" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.185 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.472301" elapsed="0.000312"/>
</kw>
<arg>${BGP_APP_PEER_DELETE_ALL_COMMAND} ${SCRIPT_URI_OPT}</arg>
<arg>${BGP_APP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:00.466193" elapsed="0.006476"/>
</kw>
<kw name="Wait_Until_Console_Tool_Finish" owner="BGPcliKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.612440" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:46:00.477428" elapsed="0.135109"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>SSHLibrary.Read Until Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:00.476933" elapsed="0.135656"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-05-01T00:46:00.476553" elapsed="0.136099"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.622263" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-05-01T00:46:00.634221" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:00.634438" level="INFO">${output_log} = 2026-05-01 00:46:00,570 INFO: Delete all prefixes from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:00.622108" elapsed="0.012428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.635571" level="INFO">2026-05-01 00:46:00,570 INFO: Delete all prefixes from 10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-05-01 00:46:00,588 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-05-01 00:46:00,588 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-05-01 00:46:00,589 DEBUG: Response: 
2026-05-01 00:46:00,589 DEBUG: &lt;Response [204]&gt; No Content
2026-05-01 00:46:00,589 INFO: Total test execution time: 0.019s
2026-05-01 00:46:00,589 INFO: Total build data time: 0.000s
2026-05-01 00:46:00,589 INFO: Total response time: 0.018s
2026-05-01 00:46:00,589 INFO: Total number of response(s): 1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.634913" elapsed="0.000796"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.636934" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_all_tc3.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_app_peer_delete_all_tc3.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:00.636127" elapsed="0.000935"/>
</kw>
<arg>bgp_app_peer.log</arg>
<arg>bgp_app_peer_delete_all_tc3.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.621693" elapsed="0.015506"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.638566" elapsed="0.000542"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.637854" elapsed="0.001398"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:00.364424" elapsed="0.274913"/>
</test>
<test id="s1-s7-t24" name="TC3_Check_Example-IPv4-Topology_Is_Empty" line="325">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:00.644392" elapsed="0.000311"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:00.644007" elapsed="0.000774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.646207" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.646031" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.646001" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.653203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.653095" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.653076" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.654405" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.654022" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.654908" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:00.654616" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:00.655020" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:46:00.655190" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.653524" elapsed="0.001691"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.660944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.660834" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.660815" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.662212" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.662104" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.662087" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:00.662759" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:00.662428" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.663164" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.662947" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.694877" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:00.663709" elapsed="0.031481"/>
</kw>
<msg time="2026-05-01T00:46:00.695503" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:00.695574" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.663351" elapsed="0.032264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.728505" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:00.696508" elapsed="0.032122"/>
</kw>
<msg time="2026-05-01T00:46:00.728798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:00.728844" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.695927" elapsed="0.032951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.729270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.728992" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.728957" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.729862" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "- "I "P "v "4 "- "T "o "p "o "l "o "g "y "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.729539" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.730277" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.730009" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.729988" elapsed="0.000385"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:00.730423" elapsed="0.000074"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.733321" elapsed="0.000166"/>
</kw>
<msg time="2026-05-01T00:46:00.733551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.732177" elapsed="0.001516"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.733987" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.734326" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:00.731496" elapsed="0.003045"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:00.730820" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:00.661804" elapsed="0.072983"/>
</kw>
<msg time="2026-05-01T00:46:00.734887" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:00.734933" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.661171" elapsed="0.073798"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:00.735157" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:00.735048" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.735029" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.735685" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.736068" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.736144" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:00.660490" elapsed="0.075796"/>
</kw>
<msg time="2026-05-01T00:46:00.736388" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:00.736433" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "C "h "e "c "k "_ "E "x "a "m "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.655622" elapsed="0.080865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.736876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.736599" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.736569" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:00.655473" elapsed="0.081507"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:00.655273" elapsed="0.081745"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:00.652735" elapsed="0.084346"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:00.645619" elapsed="0.091524"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.644993" elapsed="0.092197"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:00.640950" elapsed="0.096298"/>
</kw>
<kw name="Wait_For_Topology_To_Change_To">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Compare_Topology">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.791070" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.790526" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.792438" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:00.791855" elapsed="0.000729">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:00.792719" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:00.791354" elapsed="0.001400"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.793555" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.792990" elapsed="0.000603"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.794021" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:00.794255" level="INFO">${template} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:00.793825" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.794971" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.794621" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.796778" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.796083" elapsed="0.000758"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.797374" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:00.797009" elapsed="0.000391"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.797870" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.798623" elapsed="0.000049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.798965" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:46:00.797677" elapsed="0.001456"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.797490" elapsed="0.001710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:00.799253" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:46:00.799425" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:00.795596" elapsed="0.003869"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.795143" elapsed="0.004355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.799675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.799525" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.795110" elapsed="0.004642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.800376" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.799899" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:00.800467" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.789640" elapsed="0.010961"/>
</kw>
<msg time="2026-05-01T00:46:00.800657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.776414" elapsed="0.024292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.813439" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.825931" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.838374" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.838585" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.838802" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.839185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.839026" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:00.839012" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.839408" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.839596" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.839763" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:00.838982" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.838879" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.839990" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.840066" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:00.840186" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:00.772087" elapsed="0.068124"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.841501" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:00.841240" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:00.841658" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:00.840898" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.842001" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.841754" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.842578" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.842267" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.842083" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.841735" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.845035" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.842812" elapsed="0.002249"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:00.845113" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:00.845267" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:00.840570" elapsed="0.004721"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.846535" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:00.846277" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:00.846694" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:00.845941" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:46:00.846924" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:00.846789" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.846770" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.847158" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.847332" elapsed="0.000062"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.847445" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:46:00.849575" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:00.845619" elapsed="0.003983"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.851012" level="INFO">rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.850763" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.851464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.851211" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:00.861118" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:00.861270" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:00.861368" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:00.853757" elapsed="0.007636"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.851578" elapsed="0.009859"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.861735" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.861486" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.851560" elapsed="0.010298"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.866717" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.863271" elapsed="0.003512"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.862962" elapsed="0.003868"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.862938" elapsed="0.003928"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.870564" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.867250" elapsed="0.003380"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.866943" elapsed="0.003734"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.866920" elapsed="0.003792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.871502" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.870939" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.871972" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.871641" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.872828" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.872377" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.872087" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.871615" elapsed="0.001300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.873442" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.873078" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.873790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.873555" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.874323" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.874031" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.873871" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.873537" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.874570" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:00.875426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.875081" elapsed="0.000387"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:00.875631" elapsed="0.003995"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:00.862364" elapsed="0.017327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.879868" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.879762" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.879743" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:46:00.883799" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:46:00.880084" elapsed="0.003757"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:46:00.883915" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:46:00.884135" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:00.849930" elapsed="0.034243"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:00.884261" elapsed="0.000059"/>
</return>
<msg time="2026-05-01T00:46:00.884528" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:00.749415" elapsed="0.135152"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.916075" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.915145" elapsed="0.000969"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.918238" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:00.917650" elapsed="0.000747">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:00.918548" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:00.916286" elapsed="0.002287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.919506" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.918740" elapsed="0.000800"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:00.919943" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:00.920194" level="INFO">${template} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:00.919703" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.920844" level="INFO">{
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }
  }
 ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:00.920394" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:00.921620" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.920986" elapsed="0.000794"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.922610" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:00.921989" elapsed="0.000663"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.921811" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.920963" elapsed="0.001846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.923738" level="INFO">${final_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.922960" elapsed="0.000807"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:00.923819" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.914351" elapsed="0.009603"/>
</kw>
<msg time="2026-05-01T00:46:00.924007" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.901547" elapsed="0.022510"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.938787" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.951274" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.963764" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.963966" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.964144" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.964569" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.964407" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:00.964392" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.964791" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.964957" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.965121" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:00.964358" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.964226" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.965347" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.965422" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:00.965571" level="INFO">${expected_text} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
       "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:00.898128" elapsed="0.067471"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:00.965822" elapsed="0.002229"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:46:00.969216" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:46:00.968857" elapsed="0.000388"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:46:00.969727" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
   }...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:46:00.969398" elapsed="0.000357"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:46:00.969912" elapsed="0.000331"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:46:00.968413" elapsed="0.001890"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.968132" elapsed="0.002205"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:00.970529" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:00.970362" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.968113" elapsed="0.002495"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:46:00.886148" elapsed="0.084508"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:46:00.885025" elapsed="0.085706"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:00.884685" elapsed="0.086091"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.884659" elapsed="0.086141"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:00.970834" elapsed="0.000029"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:46:00.743172" elapsed="0.227793"/>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.738317" elapsed="0.232713"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:00.737769" elapsed="0.233307"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-05-01T00:46:00.737401" elapsed="0.233734"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.971733" elapsed="0.000238"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:00.971416" elapsed="0.000617"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:00.639832" elapsed="0.332241"/>
</test>
<test id="s1-s7-t25" name="TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes" line="330">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:00.975494" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:00.975213" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.976786" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.976676" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.976657" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.982088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.981981" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.981963" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.983160" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:00.982781" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:00.983704" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:00.983387" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:00.983775" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:00.983931" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:00.982389" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.989490" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.989366" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.989347" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:00.990720" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:00.990613" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:00.990596" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:00.991235" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:00.990934" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:00.991652" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:00.991420" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.023767" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:00.992170" elapsed="0.031700"/>
</kw>
<msg time="2026-05-01T00:46:01.024042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:01.024089" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.991838" elapsed="0.032286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.065577" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "[78Cr "[A[78Ce
 "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:01.024689" elapsed="0.041000"/>
</kw>
<msg time="2026-05-01T00:46:01.065847" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:01.065892" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.024294" elapsed="0.041634"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.066233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.066007" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.065986" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.066781" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "_ "C "h "e "c "k "_ "I "n "c "o "m "m "i "n "g "_ "U "p "d "a "t "e "s "_ "F "o "r "_ "3 "_ "W "i "t "h "d "r "a "w "n "_ "P "[78Cr "[A[78Ce
 "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.066479" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.067139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.066925" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.066907" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:01.067250" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:01.069819" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:46:01.070026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:01.068716" elapsed="0.001440"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.070433" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.070850" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:01.068076" elapsed="0.002960"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:01.067544" elapsed="0.003557"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:00.990287" elapsed="0.080910"/>
</kw>
<msg time="2026-05-01T00:46:01.071288" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:01.071331" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.989714" elapsed="0.081653"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:01.071736" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:01.071444" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.071425" elapsed="0.000399"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.072233" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.072617" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.072691" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:00.989028" elapsed="0.083772"/>
</kw>
<msg time="2026-05-01T00:46:01.072890" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:01.072933" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "_ "C "h...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.984330" elapsed="0.088638"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.073293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.073043" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.073026" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:00.984184" elapsed="0.089210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:00.984009" elapsed="0.089413"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:00.981618" elapsed="0.091875"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:00.976362" elapsed="0.097185"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:00.975905" elapsed="0.097687"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:00.973006" elapsed="0.100637"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:01.074040" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:01.073773" elapsed="0.000425"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.086736" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:01.099090" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:01.099293" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:01.086569" elapsed="0.012778"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.100287" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.099739" elapsed="0.000644"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:01.100788" elapsed="0.000709"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:01.086211" elapsed="0.015421"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:01.074351" elapsed="0.027393"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.118366" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:01.150528" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:01.150746" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:01.118205" elapsed="0.032595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.151750" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.151157" elapsed="0.000692"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:01.152181" elapsed="0.000703"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.0/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:01.117866" elapsed="0.035108"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.167727" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:01.206550" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:01.206767" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:01.167561" elapsed="0.039260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.207788" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.207186" elapsed="0.000700"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:01.208226" elapsed="0.000810"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.16/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:01.167196" elapsed="0.041981"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.228015" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:01.258901" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:01.259115" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:01.227850" elapsed="0.031320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.260137" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.259574" elapsed="0.000660"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:01.260628" elapsed="0.000694"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>withdrawn_prefix_received: 8.0.1.32/28</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:01.227502" elapsed="0.033987"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.278426" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:01.311372" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:01.311701" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:01.278263" elapsed="0.033498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.312978" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.312166" elapsed="0.000918"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:01.313505" elapsed="0.000650"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>nlri_prefix_received:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:01.277917" elapsed="0.036361"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:01.315217" elapsed="0.000364"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:01.314774" elapsed="0.000898"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:00.972419" elapsed="0.343315"/>
</test>
<test id="s1-s7-t26" name="TC3_Stop_BGP_Peer" line="346">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:01.320500" elapsed="0.000354"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:01.320075" elapsed="0.000859"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.322474" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:01.322259" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.322229" elapsed="0.000361"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.329944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:01.329830" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.329812" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.331047" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:01.330656" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.331561" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:01.331240" elapsed="0.000397"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:01.331687" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:46:01.331853" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:01.330253" elapsed="0.001625"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.337827" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:01.337545" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.337519" elapsed="0.000470"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.340850" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:01.340424" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.340383" elapsed="0.000628"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:01.341923" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:01.341345" elapsed="0.000606"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.342330" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:01.342114" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.375189" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:01.342878" elapsed="0.032427"/>
</kw>
<msg time="2026-05-01T00:46:01.375523" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:01.375577" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.342533" elapsed="0.033080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:01.395083" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:01.376150" elapsed="0.019040"/>
</kw>
<msg time="2026-05-01T00:46:01.395355" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:01.395401" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.375793" elapsed="0.019644"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.395801" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.395551" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.395526" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.396363" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "S "t "o "p "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:01.396050" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.396770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.396519" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.396499" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:01.396886" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:01.399672" elapsed="0.000160"/>
</kw>
<msg time="2026-05-01T00:46:01.399898" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:01.398485" elapsed="0.001553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.400323" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.400753" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:01.397802" elapsed="0.003155"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:01.397222" elapsed="0.003801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:01.339740" elapsed="0.061429"/>
</kw>
<msg time="2026-05-01T00:46:01.401263" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:01.401306" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.338343" elapsed="0.062999"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:01.401568" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:01.401420" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.401401" elapsed="0.000256"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.402074" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.402423" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:01.402516" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:01.337164" elapsed="0.065490"/>
</kw>
<msg time="2026-05-01T00:46:01.402754" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:01.402800" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "T "C "3 "_ "S "t "o "p "_ "B "G "P "_ "P "e...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.332268" elapsed="0.070567"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:01.403173" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:01.402914" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:01.402896" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:01.332119" elapsed="0.071158"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:01.331935" elapsed="0.071387"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:01.329295" elapsed="0.074105"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:01.321841" elapsed="0.081654"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:01.321147" elapsed="0.082413"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:01.316939" elapsed="0.086700"/>
</kw>
<kw name="Switch_To_BGP_Peer_Console">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:01.404120" elapsed="0.000108"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:01.403830" elapsed="0.000455"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:01.405748" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:01.405170" elapsed="0.000609"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:01.405965" elapsed="0.000228"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:01.404889" elapsed="0.001366"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.407373" level="INFO">2026-05-01 00:46:00,188 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.018s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:03.408152" level="INFO">${output} = 2026-05-01 00:46:00,188 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.018s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:01.406421" elapsed="2.001799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.409444" level="INFO">2026-05-01 00:46:00,188 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.018s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
^CTraceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt

[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.408743" elapsed="0.001160"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:01.404486" elapsed="2.005559"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.424039" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-05-01T00:46:03.436883" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:03.437018" level="INFO">${output_log} = 2026-05-01 00:45:50,147 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:50,148 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:03.423896" elapsed="0.013158"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.437753" level="INFO">2026-05-01 00:45:50,147 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:45:50,148 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:45:50,149 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:45:50,152 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:45:50,153 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:45:50,154 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,154 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0'
2026-05-01 00:45:50,155 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eaa9d100206010400010001020641040000fbf0
2026-05-01 00:45:50,157 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,158 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:45:50,159 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:45:50,167 INFO BGP-Thread-1 (job): ... idle for 0.008s
2026-05-01 00:45:50,167 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.008s
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:45:50,167 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,168 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,169 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,172 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,173 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,174 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,175 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,176 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,177 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:45:50,178 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-05-01 00:45:50,179 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:45:50,180 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:45:50,181 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,188 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.018s
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:46:00,189 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,591 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,592 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,593 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,594 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,595 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,596 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-05-01 00:46:00,597 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-05-01 00:46:00,598 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:46:00,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-05-01 00:46:00,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:00,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:00,602 DEBUG BGP-Thread-1 (job): NLRI prefix list: []</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.437292" elapsed="0.001134"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:03.439639" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc3.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer_tc3.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:03.438861" elapsed="0.000904"/>
</kw>
<arg>bgp_peer.log</arg>
<arg>bgp_peer_tc3.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:03.423511" elapsed="0.016389"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.441228" elapsed="0.000602"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.440540" elapsed="0.001436"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:01.316185" elapsed="2.125880"/>
</test>
<test id="s1-s7-t27" name="Delete_Bgp_Peer_Configuration" line="353">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:03.448062" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:03.447797" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.449376" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.449242" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.449221" elapsed="0.000246"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.454565" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.454440" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.454422" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.455661" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:03.455257" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.456148" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:03.455852" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:03.456218" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:46:03.456381" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:03.454874" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.462320" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.462211" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.462192" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.463606" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.463498" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.463478" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:03.464126" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.463823" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.464548" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:03.464314" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.495613" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:03.465075" elapsed="0.030759"/>
</kw>
<msg time="2026-05-01T00:46:03.496198" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:03.496302" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.464740" elapsed="0.031639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.526114" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:03.497638" elapsed="0.028582"/>
</kw>
<msg time="2026-05-01T00:46:03.526381" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:03.526495" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.496812" elapsed="0.029722"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.526848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.526615" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.526595" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.527367" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.527068" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.527746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.527522" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.527503" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:03.527858" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:03.530479" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:46:03.530691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.529303" elapsed="0.001523"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.531111" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.531478" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:03.528680" elapsed="0.002989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:03.528126" elapsed="0.003631"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:03.463171" elapsed="0.068687"/>
</kw>
<msg time="2026-05-01T00:46:03.531950" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:03.531994" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.462563" elapsed="0.069468"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:03.532218" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:03.532109" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.532090" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.532726" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.533063" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.533135" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:03.461869" elapsed="0.071374"/>
</kw>
<msg time="2026-05-01T00:46:03.533335" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:03.533379" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.456804" elapsed="0.076611"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.533776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.533507" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.533489" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:03.456659" elapsed="0.077219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:03.456480" elapsed="0.077428"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:03.454080" elapsed="0.079882"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:03.448946" elapsed="0.085069"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.448499" elapsed="0.085604"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:03.444158" elapsed="0.090000"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.534913" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.534328" elapsed="0.000614"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.578210" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.577817" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:03.579087" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:03.578855" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:03.579256" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:03.578407" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.579850" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:03.579445" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:03.580175" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:03.580314" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:03.580040" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.580762" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.580513" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.581780" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.581506" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.582244" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.581984" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.582940" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.582642" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.583708" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.583489" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.583784" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:03.583936" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.583156" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.584113" elapsed="0.000236"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:03.582503" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.584949" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.584654" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.585874" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.585489" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.585951" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:03.586142" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.585160" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.586322" elapsed="0.000242"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:46:03.584519" elapsed="0.002086"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.587154" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.586857" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.587913" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.587704" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.587989" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:03.588140" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.587367" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.588318" elapsed="0.000236"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:46:03.586720" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.589140" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.588844" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.589904" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.589685" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.589979" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:03.590128" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.589354" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.590302" elapsed="0.000236"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:03.588710" elapsed="0.001869"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:03.582317" elapsed="0.008296"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:03.590656" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:03.590813" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:03.581173" elapsed="0.009666"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.580875" elapsed="0.009995"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.591043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.590895" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.580857" elapsed="0.010262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.591895" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.591263" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:03.591971" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:03.577164" elapsed="0.014932"/>
</kw>
<msg time="2026-05-01T00:46:03.592148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.564377" elapsed="0.027817"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.604592" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.617068" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.629435" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.629641" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.629832" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.630199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.630052" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:03.630038" elapsed="0.000295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.630502" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.630674" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.630840" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:03.630009" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.629906" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.631068" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.631144" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:03.631266" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:03.560047" elapsed="0.071246"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.632395" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.632149" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:03.645926" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:03.645976" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:03.646068" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:03.634773" elapsed="0.011321"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.632525" elapsed="0.013609"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.646315" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.646161" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.632507" elapsed="0.013926"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.653947" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.648527" elapsed="0.005519"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.648014" elapsed="0.006112"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.647977" elapsed="0.006205"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.657047" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.654705" elapsed="0.002387"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.654305" elapsed="0.002822"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.654268" elapsed="0.002884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.657711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.657317" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.658057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.657820" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.658613" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.658302" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.658138" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.657803" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.659213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.658854" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.659557" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.659308" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.660092" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.659801" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.659638" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.659291" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.660325" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:03.661128" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.660850" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.661309" elapsed="0.002388"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:03.647075" elapsed="0.016684"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:03.663805" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:03.666080" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:03.631574" elapsed="0.034533"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:03.666160" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:03.535172" elapsed="0.131111"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.666871" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.666568" elapsed="0.000605"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:03.442749" elapsed="0.224461"/>
</test>
<test id="s1-s7-t28" name="Delete_Bgp_Application_Peer_Configuration" line="366">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:03.670549" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:03.670271" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.671853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.671737" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.671686" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.677127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.677019" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.677001" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.678381" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:03.678004" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.678883" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:03.678586" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:03.678954" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:03.679110" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:03.677423" elapsed="0.001712"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.684754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.684646" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.684628" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.686025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:03.685918" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.685899" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:03.686555" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.686242" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.686955" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:03.686742" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.720175" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:03.687492" elapsed="0.032781"/>
</kw>
<msg time="2026-05-01T00:46:03.720433" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:03.720505" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.687141" elapsed="0.033401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.754225" level="INFO">". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:03.721054" elapsed="0.033373"/>
</kw>
<msg time="2026-05-01T00:46:03.754646" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:03.754696" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "A "p "p "l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.720718" elapsed="0.034014"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.755084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.754828" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.754803" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.755646" level="INFO"> ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "A "p "p "l "i "c "a "t "i "o "n "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.755312" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.755999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.755783" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.755766" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:03.756109" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:03.758845" elapsed="0.001578"/>
</kw>
<msg time="2026-05-01T00:46:03.760502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.757671" elapsed="0.002971"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.760927" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.761267" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:03.757018" elapsed="0.004462"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:03.756471" elapsed="0.005078"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:03.685570" elapsed="0.076079"/>
</kw>
<msg time="2026-05-01T00:46:03.761741" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:03.761786" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "A "p "p "l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.684976" elapsed="0.076862"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:03.762025" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:03.761917" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.761898" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.762526" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.762874" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.762946" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:03.684287" elapsed="0.078767"/>
</kw>
<msg time="2026-05-01T00:46:03.763147" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:03.763190" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "A "p "p "[C "P "e "e "r "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "g "p "_ "A "p "p "l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.679521" elapsed="0.083704"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.763575" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.763301" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.763283" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:03.679358" elapsed="0.084319"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:03.679187" elapsed="0.084519"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:03.676657" elapsed="0.087103"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:03.671402" elapsed="0.092411"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:03.670977" elapsed="0.092880"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:03.668117" elapsed="0.095792"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.764659" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=${BGP_PEER_APP_NAME}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.764072" elapsed="0.000615"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.807582" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.807194" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:03.808352" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:03.808107" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:03.808584" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:03.807779" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.809157" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:03.808773" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:03.809494" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_application_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:03.809643" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:03.809345" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.810094" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.809850" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.811090" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.810837" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.811569" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.811294" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.812245" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.811947" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.813192" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.812974" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.813270" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:03.813423" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.812473" elapsed="0.000988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.813621" elapsed="0.000243"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:03.811813" elapsed="0.002092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.814465" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.814155" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.815206" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.814998" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.815282" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:03.815433" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.814682" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.815626" elapsed="0.000221"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:46:03.814020" elapsed="0.001866"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.816426" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.816133" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.817175" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.816967" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.817249" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:03.817399" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.816653" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.817591" elapsed="0.000282"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:46:03.815998" elapsed="0.001916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.818478" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:03.818166" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:03.819220" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.819012" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:03.819296" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:03.819463" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:03.818695" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.819643" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:03.818030" elapsed="0.001874"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:03.811643" elapsed="0.008297"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:03.819982" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:46:03.820140" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:03.810516" elapsed="0.009650"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.810208" elapsed="0.009989"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.820371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.820222" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.810190" elapsed="0.010270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.821215" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.820616" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:03.821292" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:03.806582" elapsed="0.014834"/>
</kw>
<msg time="2026-05-01T00:46:03.821486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.793756" elapsed="0.027777"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.834209" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.846791" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.859266" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.859508" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.859688" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.860054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.859910" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:03.859896" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.860276" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.860442" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.860624" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:03.859867" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.859762" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.860851" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:03.860926" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:03.861049" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:03.789437" elapsed="0.071638"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.862183" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.861934" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:03.876223" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01d9f4rkf20jm21isuevlyhlmda7.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:03.876332" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:03.876595" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:03.864338" elapsed="0.013301"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.862296" elapsed="0.015485"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.878299" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.877848" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.862278" elapsed="0.016165"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.883734" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.880382" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.880029" elapsed="0.003832"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.879995" elapsed="0.003901"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.887419" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.884293" elapsed="0.003213"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.883977" elapsed="0.003578"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.883952" elapsed="0.003640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.888503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.887872" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.889116" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.888782" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.889963" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.889518" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.889226" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.888620" elapsed="0.001464"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.890868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.890323" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.891328" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:03.891006" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.892111" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:03.891705" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:03.891442" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.890979" elapsed="0.001250"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:03.892487" elapsed="0.000502"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:03.893668" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:03.893223" elapsed="0.000481"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:03.893969" elapsed="0.004036"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:03.879211" elapsed="0.018912"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:03.898210" elapsed="0.000078"/>
</return>
<msg time="2026-05-01T00:46:03.901018" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:03.861337" elapsed="0.039716"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:03.901122" elapsed="0.000035"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_application_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:03.764915" elapsed="0.136377"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.902273" elapsed="0.000411"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:03.901793" elapsed="0.000973"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:03.667510" elapsed="0.235309"/>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.905202" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:46:03.928350" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:46:03.928640" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:03.904995" elapsed="0.023681"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:46:03.928779" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T00:46:03.929040" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:46:03.904618" elapsed="0.024449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.929859" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.929384" elapsed="0.000583"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.931566" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:46:03.931724" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:46:03.931001" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:46:03.932145" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-05-01T00:46:03.931920" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.931872" elapsed="0.000443"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.932654" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.932994" elapsed="0.000177"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.933510" elapsed="0.000044"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:46:03.930399" elapsed="0.003287"/>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:46:03.904169" elapsed="0.029607"/>
</kw>
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:03.935372" level="INFO">Executing command 'ps -elf | egrep python | egrep 'bgp_app_peer.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:46:03.985389" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:46:03.985795" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:03.935138" elapsed="0.050718"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:46:03.986051" elapsed="0.000112"/>
</return>
<msg time="2026-05-01T00:46:03.986529" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:46:03.934679" elapsed="0.051912"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.987895" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:03.987091" elapsed="0.000908"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:46:03.990235" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:46:03.990422" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:46:03.989528" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:46:03.991002" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:46:03.990704" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:03.990652" elapsed="0.000552"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.991618" elapsed="0.000054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.992041" elapsed="0.000049"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:03.992444" elapsed="0.000078"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:46:03.988727" elapsed="0.003952"/>
</kw>
<arg>'bgp_app_peer\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:46:03.934161" elapsed="0.058641"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:03.993336" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:46:03.993154" elapsed="0.000408"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:46:03.993973" elapsed="0.001032"/>
</kw>
<doc>Make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-05-01T00:46:03.903601" elapsed="0.091466"/>
</kw>
<doc>Basic tests for BGP application peer.

Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic BGP functional test cases for
BGP application peer operations and checks for IP4 topology updates
and updates towards BGP peer as follows:

Test case 1: Initial BGP peer connection with pre-filled topology,
POST and simple DELETE requests used.
BGP_Application_Peer_Post_3_Initial_Routes,
Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
Connect_BGP_Peer,
BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes,
BGP_Application_Peer_Delete_3_Initial_Routes,
Check_Example-IPv4-Topology_Is_Empty,
Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
Stop_BGP_Peer.

Test case 2: PUT and DELETE all routes requests while BGP peer is connected.
Reconnect_BGP_Peer,
BGP_Application_Peer_Put_3_Routes,
Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes,
BGP_Application_Peer_Delete_All_Routes,
Check_Example-IPv4-Topology_Is_Empty,
BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
Stop_BGP_Peer.

Test case 3: Repeated BGP peer re-connection with pre-filled topology.
BGP_Application_Peer_Put_3_Routes,
Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes,
BGP_Application_Peer_Delete_All_Routes,
Check_Example-IPv4-Topology_Is_Empty,
BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
Stop_BGP_Peer.

Brief description how to configure BGP application peer and
how to use restconf application peer interface:
https://wiki.opendaylight.org/view/BGP_LS_PCEP:User_Guide#BGP_Application_Peer
https://wiki.opendaylight.org/view/BGP_LS_PCEP:Programmer_Guide#BGP</doc>
<status status="PASS" start="2026-05-01T00:45:17.905373" elapsed="46.089731"/>
</suite>
<suite id="s1-s8" name="Ibgp Peers Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.119484" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:46:04.114758" elapsed="0.004791"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:46:04.114495" elapsed="0.005137"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.124787" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:46:04.120797" elapsed="0.004018"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:46:04.125124" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.124988" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.124958" elapsed="0.000249"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.125748" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:46:04.125366" elapsed="0.000425"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.126290" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:46:04.125956" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:46:04.126873" elapsed="0.000311"/>
</kw>
<msg time="2026-05-01T00:46:04.127287" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:04.127334" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.126507" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.127927" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:04.127545" elapsed="0.000409"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.129053" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:04.128791" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.129500" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:04.129232" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.129990" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.129691" elapsed="0.000339"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.133565" elapsed="0.000230"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.134328" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:04.133962" elapsed="0.000397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.134542" elapsed="0.000236"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.135589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:04.135278" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:46:04.135662" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:46:04.135833" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.134980" elapsed="0.000878"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:04.136481" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19461290&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:46:04.136018" elapsed="0.000622"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.136811" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:46:04.132982" elapsed="0.004077"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:04.132782" elapsed="0.004321"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:46:04.130094" elapsed="0.007046"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.137733" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:46:04.137316" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.138359" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:46:04.137946" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.138972" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:46:04.138584" elapsed="0.000430"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:46:04.128321" elapsed="0.010749"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:46:04.120422" elapsed="0.018749"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.139357" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.139240" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.139221" elapsed="0.000205"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.142710" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:04.142304" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.143195" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:04.142901" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:04.143266" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:04.143422" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:04.141949" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:04.144469" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.144190" elapsed="0.000307"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.145273" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:46:04.145375" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.145086" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.149043" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:04.148392" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.148372" elapsed="0.000799"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.150077" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:46:04.150314" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.149376" elapsed="0.000996"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.151351" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.150685" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.152682" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.151752" elapsed="0.000984"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.154470" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:46:04.154651" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:46:04.154092" elapsed="0.000603"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.155041" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.156725" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:46:04.485389" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:45:18 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:45:18 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:46:04.156318" elapsed="0.329480"/>
</kw>
<msg time="2026-05-01T00:46:04.485961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.155870" elapsed="0.330449"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:46:04.153177" elapsed="0.333507"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.487680" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:46:04.501246" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:46:04.501779" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:46:04.502004" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:04.487102" elapsed="0.015014"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.503013" elapsed="0.001235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.506935" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.505611" elapsed="0.001556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.508114" elapsed="0.000113"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.507563" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.507506" elapsed="0.001006"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:46:04.509184" elapsed="0.000145"/>
</return>
<status status="PASS" start="2026-05-01T00:46:04.508700" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.508661" elapsed="0.000962"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.509755" elapsed="0.000037"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.514080" elapsed="0.000582"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.514944" elapsed="0.000302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.515528" elapsed="0.000247"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.510831" elapsed="0.005024"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:46:04.147426" elapsed="0.368606"/>
</kw>
<msg time="2026-05-01T00:46:04.516092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.146603" elapsed="0.369549"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:46:04.146103" elapsed="0.370134"/>
</kw>
<msg time="2026-05-01T00:46:04.516279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.145577" elapsed="0.370749"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.519274" elapsed="0.000330"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.519771" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.520069" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.516636" elapsed="0.003579"/>
</kw>
<msg time="2026-05-01T00:46:04.520306" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:46:04.144718" elapsed="0.375613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.520782" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.520533" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:46:04.520867" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:46:04.143831" elapsed="0.377163"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:04.143647" elapsed="0.377451"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:04.143516" elapsed="0.377626"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:46:04.139673" elapsed="0.381532"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:46:04.521369" elapsed="0.000233"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.536504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.536375" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.536355" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.536877" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:46:04.536981" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.536736" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.537422" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.537164" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.537880" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.537639" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:04.538797" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:46:04.538551" elapsed="0.000360">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:46:04.539021" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:46:04.539067" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.538085" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.539396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:04.539167" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.539149" elapsed="0.000364"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:04.540268" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.539999" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:46:04.540342" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:04.540510" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.539722" elapsed="0.000814"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.540701" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.541389" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:46:04.541503" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.541284" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.541683" elapsed="0.002627"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.544766" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:46:04.736850" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.544493" elapsed="0.192536"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.741130" elapsed="0.000407"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.741719" elapsed="0.000183"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.742057" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.738516" elapsed="0.003703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:04.737645" elapsed="0.004623"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.536088" elapsed="0.206264"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:04.522423" elapsed="0.219997"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.521976" elapsed="0.220536"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:04.521827" elapsed="0.220741"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:46:04.521665" elapsed="0.220956"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:46:04.119959" elapsed="0.622735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.745618" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.745490" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.745448" elapsed="0.000251"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.751000" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.750888" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.750870" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.752078" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:04.751671" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.752588" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:04.752272" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:04.752660" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:46:04.752831" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:04.751308" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.758890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.758780" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.758762" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.760187" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:04.760059" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.760040" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:04.760767" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.760407" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.761188" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:04.760958" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.798472" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:04.761902" elapsed="0.036744"/>
</kw>
<msg time="2026-05-01T00:46:04.798814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:04.798862" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.761376" elapsed="0.037524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.871867" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "i "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "s "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:04.799883" elapsed="0.072142"/>
</kw>
<msg time="2026-05-01T00:46:04.872157" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:04.872202" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.799314" elapsed="0.072926"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.872673" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:04.872325" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.872302" elapsed="0.000551"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.873372" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "i "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "s "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:04.873007" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.873786" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:04.873544" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.873525" elapsed="0.000436"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:04.873998" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.876028" elapsed="0.000480"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.876860" elapsed="0.000302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:46:04.877513" elapsed="0.000245"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:04.875229" elapsed="0.002619"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:04.874302" elapsed="0.003682"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:04.759768" elapsed="0.118318"/>
</kw>
<msg time="2026-05-01T00:46:04.878180" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:04.878224" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.759115" elapsed="0.119147"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:04.878496" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:46:04.878340" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.878321" elapsed="0.000266"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.879021" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.879364" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:04.879436" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:04.758484" elapsed="0.121081"/>
</kw>
<msg time="2026-05-01T00:46:04.879660" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:04.879704" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.753256" elapsed="0.126486"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:04.880078" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:04.879818" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:04.879801" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:04.753105" elapsed="0.127116"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:04.752918" elapsed="0.127337"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:04.750582" elapsed="0.129734"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:46:04.743339" elapsed="0.137032"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:04.742869" elapsed="0.137545"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:46:04.114148" elapsed="0.766605"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-01T00:46:04.880914" elapsed="0.000181"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${ODL_SYSTEM_IP}</arg>
<arg>alias=bgp_peer1_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:04.881254" elapsed="0.000240"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:46:04.883212" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:46:04.883290" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:46:04.882917" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.883490" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:46:04.884988" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:46:05.209891" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:45:18 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:46:04 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:46:04.884663" elapsed="0.325416"/>
</kw>
<msg time="2026-05-01T00:46:05.210172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.884217" elapsed="0.326045"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:46:04.882470" elapsed="0.327915"/>
</kw>
<msg time="2026-05-01T00:46:05.210439" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:04.882042" elapsed="0.328466"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:46:04.881702" elapsed="0.328919"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${ODL_SYSTEM_IP}</arg>
<arg>alias=bgp_peer2_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:46:05.210882" elapsed="0.000379"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.213176" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:46:05.213257" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:46:05.212887" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.213444" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.214708" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:46:05.523861" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:45:18 UTC 2026

  System load:  0.04               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:46:05 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:46:05.214339" elapsed="0.309679"/>
</kw>
<msg time="2026-05-01T00:46:05.524193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.213978" elapsed="0.310296"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:46:05.212415" elapsed="0.311969"/>
</kw>
<msg time="2026-05-01T00:46:05.524436" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.211926" elapsed="0.312574"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:46:05.211532" elapsed="0.313045"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.526056" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-05-01T00:46:05.539218" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:05.539385" level="INFO">${stdout} = usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_ins...</msg>
<msg time="2026-05-01T00:46:05.539474" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:46:05.539537" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:05.525835" elapsed="0.013735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.541412" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:46:05.540792" elapsed="0.000755"/>
</kw>
<msg time="2026-05-01T00:46:05.541763" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:46:05.541859" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.539925" elapsed="0.001985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.543310" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:05.542293" elapsed="0.001076"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.544401" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.543592" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.543539" elapsed="0.001106"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:46:05.544994" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:46:05.544771" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.544737" elapsed="0.000458"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.545395" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.545318" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:05.545284" elapsed="0.000288"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.545900" elapsed="0.000048"/>
</kw>
<msg time="2026-05-01T00:46:05.546259" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>python3 --help</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:46:05.525443" elapsed="0.020874"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:46:05.546710" elapsed="0.000103"/>
</return>
<status status="PASS" start="2026-05-01T00:46:05.546501" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.546433" elapsed="0.000505"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.547262" elapsed="0.000049"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:05.524969" elapsed="0.022465"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.548872" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:46:05.682168" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:46:05.682434" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:46:05.682575" level="INFO">${stderr} = Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'</msg>
<msg time="2026-05-01T00:46:05.682675" level="INFO">${rc} = 1</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:05.548675" elapsed="0.134051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.684612" level="INFO">Length is 119.</msg>
<msg time="2026-05-01T00:46:05.684810" level="FAIL">'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:46:05.683989" elapsed="0.000977">'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</status>
</kw>
<msg time="2026-05-01T00:46:05.685200" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:46:05.685406" level="INFO">${result} = 'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.683170" elapsed="0.002328"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.686900" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:05.685892" elapsed="0.001069"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.689332" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.688779" elapsed="0.000647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.690796" level="INFO">Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.689806" elapsed="0.001143"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.691798" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.691312" elapsed="0.000530"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:46:05.687947" elapsed="0.003951"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:05.687139" elapsed="0.004796"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.687095" elapsed="0.004866"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:46:05.692119" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:46:05.692018" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.692001" elapsed="0.000205"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.692297" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.692261" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:05.692246" elapsed="0.000114"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.692520" elapsed="0.000023"/>
</kw>
<msg time="2026-05-01T00:46:05.692668" level="INFO">${passed} = False</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:46:05.548283" elapsed="0.144410"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-05-01T00:46:05.692852" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.692761" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.692745" elapsed="0.000170"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.731514" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:46:05.744012" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py' -&gt; '/home/jenkins/.//ipaddr.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:46:05.693062" elapsed="0.051035"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:46:05.547854" elapsed="0.196334"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.756036" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:46:05.744419" elapsed="0.011702"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:05.756805" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19f44710&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:46:05.756364" elapsed="0.000675"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.760348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.760236" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.760217" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:05.760822" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:05.760588" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.761185" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.761011" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.773689" level="INFO">log:set INFO</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:05.761737" elapsed="0.012016"/>
</kw>
<msg time="2026-05-01T00:46:05.773855" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:05.773899" level="INFO">${message_write} = log:set INFO
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.761371" elapsed="0.012551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.791909" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:05.774519" elapsed="0.017453"/>
</kw>
<msg time="2026-05-01T00:46:05.792072" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:05.792116" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.774145" elapsed="0.017998"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.792465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.792222" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.792201" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.792949" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.792695" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.793276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.793062" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.793045" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:05.793387" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.795026" elapsed="0.000138"/>
</kw>
<msg time="2026-05-01T00:46:05.795210" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.794544" elapsed="0.000729"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.795435" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.795622" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:05.794207" elapsed="0.001507"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:05.793693" elapsed="0.002067"/>
</kw>
<arg>log:set ${ODL_LOG_LEVEL}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:05.757584" elapsed="0.038271"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.798420" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.798309" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.798290" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:05.798906" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:05.798655" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.799274" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.799102" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.851866" level="INFO">log:set DEFAULT org.opendaylight.bgpcep</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:05.799816" elapsed="0.052190"/>
</kw>
<msg time="2026-05-01T00:46:05.852242" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:05.852343" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.bgpcep
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.799475" elapsed="0.052922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.857062" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:05.853644" elapsed="0.003551"/>
</kw>
<msg time="2026-05-01T00:46:05.857411" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:05.857542" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.852840" elapsed="0.004764"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.858281" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.857776" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.857734" elapsed="0.000751"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.859619" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.859004" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.860079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.859851" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.859830" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:05.860189" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.861753" elapsed="0.000134"/>
</kw>
<msg time="2026-05-01T00:46:05.861929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.861289" elapsed="0.000699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.862147" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.862309" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:05.860973" elapsed="0.001415"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:05.860466" elapsed="0.001967"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.bgpcep</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:05.796206" elapsed="0.066339"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.864942" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.864833" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.864814" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:05.865376" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:05.865159" elapsed="0.000243"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.865741" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.865575" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.913073" level="INFO">log:set DEFAULT org.opendaylight.protocol</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:05.866261" elapsed="0.046875"/>
</kw>
<msg time="2026-05-01T00:46:05.913239" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:05.913282" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.protocol
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.865928" elapsed="0.047378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.915407" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:05.913849" elapsed="0.001628"/>
</kw>
<msg time="2026-05-01T00:46:05.915575" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:05.915617" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.913506" elapsed="0.002137"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.915946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.915724" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.915701" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.916415" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:05.916166" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.916758" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:05.916545" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.916527" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:05.916867" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.918446" elapsed="0.000294"/>
</kw>
<msg time="2026-05-01T00:46:05.918783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:05.918005" elapsed="0.000875"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.919079" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:05.919249" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:05.917680" elapsed="0.001651"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:05.917144" elapsed="0.002232"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.protocol</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:05.862891" elapsed="0.056602"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
prepare directories for responses, put Python tool to mininet machine, setup imported resources.</doc>
<status status="PASS" start="2026-05-01T00:46:04.113746" elapsed="1.805806"/>
</kw>
<test id="s1-s8-t1" name="TC1_Configure_Two_iBGP_Route_Reflector_Client_Peers" line="84">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:05.922843" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:05.922578" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.924117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.924008" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.923989" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.929530" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.929410" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.929392" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.930616" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:05.930204" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:05.931118" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:05.930809" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:05.931188" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:05.931349" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:05.929829" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.937398" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.937268" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.937249" elapsed="0.000250"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:05.938696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:05.938589" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:05.938571" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:05.939224" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:05.938910" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.939643" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:05.939416" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:05.978793" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:05.940163" elapsed="0.038736"/>
</kw>
<msg time="2026-05-01T00:46:05.979089" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:05.979137" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.939829" elapsed="0.039345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:06.039221" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "R "o "u "t "e "_ "R "e "f "l "e "c "t "o "r "_ "C "l "i "e "n "t "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:05.979728" elapsed="0.059667"/>
</kw>
<msg time="2026-05-01T00:46:06.039729" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:06.039801" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.979351" elapsed="0.060507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.040321" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.039976" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.039946" elapsed="0.000494"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.041137" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "R "o "u "t "e "_ "R "e "f "l "e "c "t "o "r "_ "C "l "i "e "n "t "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.040682" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.041706" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.041354" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.041327" elapsed="0.000498"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:06.041875" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:06.045004" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:46:06.045206" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.043989" elapsed="0.001346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.045629" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.045968" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:06.043128" elapsed="0.003027"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:06.042265" elapsed="0.003952"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:05.938262" elapsed="0.108052"/>
</kw>
<msg time="2026-05-01T00:46:06.046404" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:06.046447" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.937657" elapsed="0.108843"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:06.046684" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:06.046577" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.046558" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.047230" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.047603" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.047677" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:05.936924" elapsed="0.110868"/>
</kw>
<msg time="2026-05-01T00:46:06.047886" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:06.047930" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.931785" elapsed="0.116182"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.048292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.048042" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.048024" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:05.931637" elapsed="0.116756"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:05.931433" elapsed="0.116991"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:05.929049" elapsed="0.119457"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:05.923720" elapsed="0.124880"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:05.923272" elapsed="0.125374"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:05.920280" elapsed="0.128419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.049692" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=rr-client | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=rr-client</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.048871" elapsed="0.000851"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.087653" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.087251" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.088433" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.088184" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.088618" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.087848" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.089191" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.088808" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.089536" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:06.089692" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:06.089383" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.090123" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.089880" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.091178" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.090873" elapsed="0.000354"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.091672" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.091389" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.092366" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.092069" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.093140" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.092919" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.093217" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.093369" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.092600" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.093565" elapsed="0.000239"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:06.091931" elapsed="0.001913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.094427" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.094092" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.095414" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.095167" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.095508" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.095663" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.094661" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.095843" elapsed="0.000223"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:46:06.093957" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.096670" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.096356" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.097408" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.097199" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.097499" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.097650" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.096885" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.097828" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:46:06.096220" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.098648" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.098335" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.099483" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.099243" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.099560" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.099711" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.098860" elapsed="0.000875"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.099888" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:06.098201" elapsed="0.001946"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.100704" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.100393" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.101438" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.101231" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.101528" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.101678" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.100916" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.101855" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:06.100260" elapsed="0.001855"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.102703" level="INFO">${value} = rr-client</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.102361" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.103523" level="INFO">${encoded} = rr-client</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.103293" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.103600" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.103750" level="INFO">${encoded_value} = rr-client</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.102917" elapsed="0.000857"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.103926" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-05-01T00:46:06.102227" elapsed="0.001958"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.104746" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.104434" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.105541" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.105316" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.105617" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.105768" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.104998" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.105945" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:06.104299" elapsed="0.001908"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.106950" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.106468" elapsed="0.000508"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.107794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.107584" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.107870" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:06.108020" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.107223" elapsed="0.000822"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.108197" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.106321" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.109016" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.108721" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.109771" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.109560" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.109847" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.109997" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.109229" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.110177" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:06.108586" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.111001" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.110705" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.111822" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.111608" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.111897" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.112046" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.111268" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.112222" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.110569" elapsed="0.001929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.113041" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.112748" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.113794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.113581" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.113869" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.114017" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.113252" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.114192" elapsed="0.000220"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.112613" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.115014" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.114720" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.115885" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.115677" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.115960" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.116111" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.115338" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.116290" elapsed="0.000237"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:06.114584" elapsed="0.001984"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:06.091746" elapsed="0.024858"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:06.116647" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:06.116808" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:06.090549" elapsed="0.026285"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.090236" elapsed="0.026630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.117042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.116891" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.090217" elapsed="0.026902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.118073" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.117266" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.118156" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:06.086580" elapsed="0.031704"/>
</kw>
<msg time="2026-05-01T00:46:06.118338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.072984" elapsed="0.045401"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.132052" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.145464" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.158783" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.158987" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.159194" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.159618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.159419" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:06.159405" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.159847" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.160019" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.160188" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:06.159376" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.159273" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.160418" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.160510" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:06.160634" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:06.068308" elapsed="0.092353"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.189262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.188887" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.190014" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.189807" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.190172" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.189470" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.190764" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.190363" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.191116" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:06.191257" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:06.190957" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.191713" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.191450" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:06.192135" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.191842" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.192727" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.192407" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.192251" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.191823" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.193787" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.192963" elapsed="0.000855"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.193868" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:06.188256" elapsed="0.005739"/>
</kw>
<msg time="2026-05-01T00:46:06.194053" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.174611" elapsed="0.019488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.207679" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.221032" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.234419" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.234637" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.234819" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.235236" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.235039" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:06.235025" elapsed="0.000310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.235515" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.235691" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.235858" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:06.234996" elapsed="0.000914"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.234893" elapsed="0.001044"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.236085" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.236161" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:06.236330" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:06.171627" elapsed="0.064731"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.237644" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.237385" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.237807" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.237043" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.238152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.237903" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.238719" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.238412" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.238233" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.237885" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.241320" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.238957" elapsed="0.002390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:06.241399" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.241570" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:06.236711" elapsed="0.004884"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.242973" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.242728" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.243483" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.243225" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.243937" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.243697" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.244370" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.244133" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:06.245223" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:06.245033" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:06.245611" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:06.245422" elapsed="0.000214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.245787" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.246384" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.246142" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:06.246529" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:06.246689" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:06.244629" elapsed="0.002086"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:06.268432" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1074', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:06.268527" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:46:06 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:06.268668" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:06.249230" elapsed="0.019465"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.246789" elapsed="0.021992"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.269217" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.268842" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.246772" elapsed="0.022644"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.277621" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.271741" elapsed="0.005979"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.271087" elapsed="0.006713"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.271047" elapsed="0.006810"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.281831" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.278544" elapsed="0.003334"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.277982" elapsed="0.003930"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.277945" elapsed="0.003993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.282511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.282111" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.282853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.282609" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.283566" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.283099" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.282933" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.282592" elapsed="0.001060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.284192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.283826" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.284540" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.284288" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.285081" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.284787" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.284622" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.284270" elapsed="0.000942"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.285368" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:06.286189" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.285904" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.286373" elapsed="0.002562"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:06.270248" elapsed="0.018750"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:06.289172" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:46:06.289066" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.289048" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.289414" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.289497" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:46:06.291967" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:06.241926" elapsed="0.050069"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.292060" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:06.292215" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:06.056534" elapsed="0.235705"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.292597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.292338" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.292321" elapsed="0.000368"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.292723" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:06.050011" elapsed="0.242836"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.293834" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=rr-client | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=rr-client</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.293021" elapsed="0.000843"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.329546" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.329161" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.330429" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.330203" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.330605" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.329740" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.331205" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.330796" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.331652" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:06.331797" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:06.331505" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.332235" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.331984" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.333251" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.332990" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.333737" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.333474" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.334431" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.334138" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.335209" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.334981" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.335298" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:46:06.335493" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.334662" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.335675" elapsed="0.000233"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:06.334000" elapsed="0.001949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.336515" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.336199" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.337409" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.337202" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.337502" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.337655" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.336867" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.337834" elapsed="0.000219"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:46:06.336064" elapsed="0.002029"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.338651" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.338341" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.339960" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.339400" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.340136" elapsed="0.000066"/>
</return>
<msg time="2026-05-01T00:46:06.340506" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.338863" elapsed="0.001701"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.340916" elapsed="0.000500"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:46:06.338207" elapsed="0.003327"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.342794" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.342096" elapsed="0.000755"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.344567" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.344079" elapsed="0.000546"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.344813" elapsed="0.000068"/>
</return>
<msg time="2026-05-01T00:46:06.345159" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.343334" elapsed="0.001879"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.345588" elapsed="0.000497"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:06.341794" elapsed="0.004379"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.347493" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.346757" elapsed="0.000797"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.349159" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.348699" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.349323" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:46:06.349688" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.347973" elapsed="0.001769"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.350080" elapsed="0.000526"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:06.346425" elapsed="0.004269"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.351834" level="INFO">${value} = rr-client</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.351289" elapsed="0.000571"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.352593" level="INFO">${encoded} = rr-client</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.352367" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.352667" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.352817" level="INFO">${encoded_value} = rr-client</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.352047" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.352994" elapsed="0.000217"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-05-01T00:46:06.350948" elapsed="0.002303"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.353844" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.353517" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.354780" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.354378" elapsed="0.000428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.354855" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.355004" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.354059" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.355193" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:06.353366" elapsed="0.002103"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.356014" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.355720" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.356767" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.356556" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.356843" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:06.356990" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.356228" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.357284" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.355584" elapsed="0.001986"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.358117" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.357821" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.358870" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.358663" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.358983" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:06.359140" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.358328" elapsed="0.000864"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.359359" elapsed="0.000240"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:06.357684" elapsed="0.001956"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.360189" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.359896" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.360940" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.360735" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.361014" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:06.361163" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.360402" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.361339" elapsed="0.000234"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.359758" elapsed="0.001855"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.362156" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.361862" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.362917" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.362708" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.362991" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.363140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.362367" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.363342" elapsed="0.000239"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:06.361726" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.364165" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:06.363871" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:06.364916" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.364710" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:06.364991" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.365141" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:06.364377" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.365317" elapsed="0.000237"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:06.363735" elapsed="0.001861"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:06.333812" elapsed="0.031819"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:06.365673" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:06.365835" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:06.332659" elapsed="0.033203"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.332348" elapsed="0.033546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.366071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.365919" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.332329" elapsed="0.033820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.367282" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.366296" elapsed="0.001015"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.367361" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:06.328544" elapsed="0.038960"/>
</kw>
<msg time="2026-05-01T00:46:06.367600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.314983" elapsed="0.052666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.380892" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.394049" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.407069" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.407313" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.407512" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.407887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.407736" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:06.407720" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.408108" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.408275" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.408439" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:06.407691" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.407589" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.408681" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.408756" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:06.408878" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:06.310424" elapsed="0.098481"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.436505" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.436117" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.437251" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.437043" elapsed="0.000272">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.437447" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.436706" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.438200" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.437790" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.438541" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:06.438672" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:06.438392" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.439100" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.438860" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:06.439593" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.439274" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.440123" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.439828" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.439678" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.439242" elapsed="0.000964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.441170" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.440354" elapsed="0.000845"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.441248" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:06.435504" elapsed="0.005869"/>
</kw>
<msg time="2026-05-01T00:46:06.441431" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.422202" elapsed="0.019290"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.454754" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.467948" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.481088" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.481287" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.481478" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.481847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.481699" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:06.481685" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.482070" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.482240" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.482407" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:06.481655" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.481553" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.482651" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.482728" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:06.482861" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:06.419472" elapsed="0.063418"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:06.484183" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.483934" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:06.484338" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:06.483589" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.484697" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.484431" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.485231" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.484944" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.484777" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.484414" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.487800" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.485479" elapsed="0.002353"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:06.487890" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.488043" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:06.483222" elapsed="0.004845"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.489577" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.489191" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.490059" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.489820" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.490531" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.490272" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.490966" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.490728" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:06.491846" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:06.491657" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:06.492200" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:06.492028" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.492376" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.492991" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.492748" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:06.493076" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:06.493236" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:06.491212" elapsed="0.002053"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:06.509177" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1074', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:06.509270" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:06.509396" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:06.495714" elapsed="0.013717"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.493341" elapsed="0.016180"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.509817" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.509560" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.493323" elapsed="0.016686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.517883" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.512241" elapsed="0.005738"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.511669" elapsed="0.006389"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.511628" elapsed="0.006485"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.521791" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.518767" elapsed="0.003071"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.518237" elapsed="0.003635"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.518200" elapsed="0.003696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.522434" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.522061" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.522790" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.522548" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.523343" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.523033" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.522870" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.522531" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.523973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.523607" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.524303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.524068" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.524857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.524559" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:06.524381" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.524050" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.525089" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:06.525893" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:06.525612" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.526075" elapsed="0.002497"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:06.510833" elapsed="0.017800"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:06.528804" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:06.528701" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.528682" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.529040" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.529107" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:06.531550" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:06.488393" elapsed="0.043184"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.531640" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:06.531794" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:06.298837" elapsed="0.232982"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.532150" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.531915" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.531899" elapsed="0.000341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:06.532273" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:06.294152" elapsed="0.238282"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:06.533039" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:06.532733" elapsed="0.000609"/>
</kw>
<doc>Configure two iBGP peers as routing reflector clients.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:05.919636" elapsed="0.613746"/>
</test>
<test id="s1-s8-t2" name="TC1_Connect_BGP_Peer1" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:06.537934" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:06.537667" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.539567" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:06.539428" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.539408" elapsed="0.000232"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.544901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:06.544795" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.544777" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.545974" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:06.545596" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.546470" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:06.546164" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:06.546541" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:06.546698" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:06.545203" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.552552" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:06.552429" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.552411" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.553793" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:06.553687" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.553669" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:06.554323" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:06.554025" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:06.554776" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:06.554551" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:06.583912" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:06.555335" elapsed="0.028685"/>
</kw>
<msg time="2026-05-01T00:46:06.584185" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:06.584231" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:06.554965" elapsed="0.029303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:06.605706" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:06.584814" elapsed="0.021006"/>
</kw>
<msg time="2026-05-01T00:46:06.605993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:06.606039" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:06.584443" elapsed="0.021632"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.606429" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.606198" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.606176" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.606975" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.606677" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.607368" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.607108" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.607090" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:06.607514" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:06.610009" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:46:06.610209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:06.608968" elapsed="0.001372"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.610640" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.610985" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:06.608324" elapsed="0.002848"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:06.607790" elapsed="0.003447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:06.553365" elapsed="0.057983"/>
</kw>
<msg time="2026-05-01T00:46:06.611445" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:06.611505" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:06.552776" elapsed="0.058768"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:06.611728" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:06.611622" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.611603" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.612209" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.612570" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:06.612642" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:06.552093" elapsed="0.060655"/>
</kw>
<msg time="2026-05-01T00:46:06.612840" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:06.612882" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:06.547097" elapsed="0.065823"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:06.613245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:06.612994" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:06.612977" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:06.546951" elapsed="0.066393"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:06.546780" elapsed="0.066594"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:06.544420" elapsed="0.069008"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:06.539098" elapsed="0.074401"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:06.538349" elapsed="0.075195"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:06.534086" elapsed="0.079509"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:06.613792" elapsed="0.000106"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.622865" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:06.622540" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.623293" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.623054" elapsed="0.000309"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:06.627217" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-05-01T00:46:06.627335" level="INFO">${output} =  python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:06.623534" elapsed="0.003830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.627799" level="INFO"> python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.627549" elapsed="0.000297"/>
</kw>
<arg>${BGP_PEER1_COMMAND}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:06.622146" elapsed="0.005755"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:06.636986" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:06.637124" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:06.637231" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:06.629105" elapsed="0.008152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.641144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.637424" elapsed="0.003797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.645049" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:06.641446" elapsed="0.003669"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:06.648875" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:06.645337" elapsed="0.003609">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:06.628678" elapsed="0.020382">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:07.661082" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:07.661607" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:07.661758" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:07.651212" elapsed="0.010582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.665681" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.662048" elapsed="0.003698"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.669656" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.666055" elapsed="0.003671"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:07.669949" elapsed="0.003488"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:07.650037" elapsed="0.023482"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:06.628065" elapsed="1.045507"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:07.674191" elapsed="0.000250"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:07.673874" elapsed="0.000652"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:06.533631" elapsed="1.140936"/>
</test>
<test id="s1-s8-t3" name="TC1_Connect_BGP_Peer2" line="134">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:07.677826" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:07.677559" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:07.679148" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:07.679018" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.678992" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:07.684775" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:07.684667" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.684649" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.685867" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:07.685482" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.686351" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:07.686058" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:07.686420" elapsed="0.000212"/>
</return>
<msg time="2026-05-01T00:46:07.686771" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:07.685077" elapsed="0.001720"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:07.692742" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:07.692628" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.692607" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:07.694053" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:07.693945" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.693926" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:07.694599" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:07.694273" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:07.695016" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:07.694796" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:07.731510" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:07.695560" elapsed="0.036108"/>
</kw>
<msg time="2026-05-01T00:46:07.731869" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:07.731948" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:07.695206" elapsed="0.036780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:07.757546" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:07.732653" elapsed="0.025117"/>
</kw>
<msg time="2026-05-01T00:46:07.757951" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:07.757998" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:07.732214" elapsed="0.025821"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.758431" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:07.758139" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.758109" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.759056" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.758700" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.759411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:07.759191" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.759172" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:07.759546" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:07.762197" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:46:07.762406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:07.761168" elapsed="0.001508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.762967" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.763312" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:07.760508" elapsed="0.003015"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:07.759884" elapsed="0.003705"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:07.693638" elapsed="0.070052"/>
</kw>
<msg time="2026-05-01T00:46:07.763792" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:07.763839" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:07.692979" elapsed="0.070900"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:07.764323" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:07.763985" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.763966" elapsed="0.000445"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.764848" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.765193" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:07.765263" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:07.692213" elapsed="0.073158"/>
</kw>
<msg time="2026-05-01T00:46:07.765477" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:07.765523" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:07.687214" elapsed="0.078346"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:07.765888" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:07.765635" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:07.765618" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:07.687034" elapsed="0.078953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:07.686855" elapsed="0.079165"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:07.684283" elapsed="0.081791"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:07.678708" elapsed="0.087471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:07.678240" elapsed="0.087987"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:07.675271" elapsed="0.091010"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:07.766449" elapsed="0.000138"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.775792" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:07.775436" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.776251" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.776003" elapsed="0.000301"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:07.780366" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-05-01T00:46:07.780473" level="INFO">${output} =  python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:07.776474" elapsed="0.004028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.780922" level="INFO"> python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.780669" elapsed="0.000301"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:07.775045" elapsed="0.005982"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:07.790207" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:07.790365" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:07.790520" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:07.782281" elapsed="0.008268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.794272" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.790744" elapsed="0.003639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.800928" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:07.794808" elapsed="0.006170"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:07.803871" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:07.801141" elapsed="0.002821">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:07.781838" elapsed="0.022248">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:08.816540" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:08.817443" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '412'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:08.817716" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:08.806285" elapsed="0.011493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.824645" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:08.818180" elapsed="0.006574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.827552" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:08.824954" elapsed="0.002648"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:08.827763" elapsed="0.002668"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:08.805093" elapsed="0.025422"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:07.781195" elapsed="1.049371"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:08.831180" elapsed="0.000252"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:08.830862" elapsed="0.000649"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:07.674806" elapsed="1.156746"/>
</test>
<test id="s1-s8-t4" name="TC1_BGP_Peer1_Check_Log_For_Introduced_Prefixes" line="146">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:08.835059" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:08.834792" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:08.836364" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:08.836241" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.836216" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:08.841840" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:08.841732" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.841714" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.842927" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:08.842538" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.843413" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:08.843119" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:08.843499" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:08.843665" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:08.842142" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:08.849688" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:08.849579" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.849560" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:08.850961" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:08.850851" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.850831" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:08.851516" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:08.851181" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:08.851933" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:08.851708" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:08.886542" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:08.852544" elapsed="0.034121"/>
</kw>
<msg time="2026-05-01T00:46:08.886830" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:08.886882" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:08.852165" elapsed="0.034754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:08.929027" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:08.887485" elapsed="0.041652"/>
</kw>
<msg time="2026-05-01T00:46:08.929295" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:08.929342" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:08.887098" elapsed="0.042280"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.929710" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:08.929477" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.929437" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.930232" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:08.929937" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.930612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:08.930373" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.930355" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:08.930725" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:08.933449" elapsed="0.000187"/>
</kw>
<msg time="2026-05-01T00:46:08.933698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:08.932193" elapsed="0.001644"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.934114" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.934469" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:08.931575" elapsed="0.003247"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:08.931019" elapsed="0.003875"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:08.850546" elapsed="0.084447"/>
</kw>
<msg time="2026-05-01T00:46:08.935086" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:08.935130" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:08.849914" elapsed="0.085253"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:08.935420" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:08.935245" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.935226" elapsed="0.000307"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.935940" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.936274" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:08.936345" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:08.849221" elapsed="0.087290"/>
</kw>
<msg time="2026-05-01T00:46:08.936636" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:08.936680" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:08.844075" elapsed="0.092643"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:08.937052" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:08.936794" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:08.936777" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:08.843926" elapsed="0.093225"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:08.843747" elapsed="0.093435"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:08.841355" elapsed="0.095882"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:08.835941" elapsed="0.101352"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:08.835494" elapsed="0.101844"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:08.832519" elapsed="0.104872"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:08.937567" elapsed="0.000107"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:08.951315" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:08.974819" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:08.975032" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:08.951146" elapsed="0.023942"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:08.976065" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:08.975495" elapsed="0.000668"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:08.976539" elapsed="0.000754"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER2_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:08.950735" elapsed="0.026698"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER2_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:08.937836" elapsed="0.039753"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:08.994414" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.2.0.0/28' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:09.019323" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:09.019570" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:08.994253" elapsed="0.025376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.020615" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.019998" elapsed="0.000719"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:09.021207" elapsed="0.000730"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received: ${BGP_PEER2_FIRST_PREFIX_IP}/${BGP_PEER2_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:08.993814" elapsed="0.028260"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.039524" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:09.072424" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:09.072839" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:09.039340" elapsed="0.033560"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.074080" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.073384" elapsed="0.000798"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:09.074558" elapsed="0.000703"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:09.038883" elapsed="0.036523"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:09.076948" elapsed="0.000345"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:09.076201" elapsed="0.001182"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:08.831909" elapsed="0.245655"/>
</test>
<test id="s1-s8-t5" name="TC1_BGP_Peer2_Check_Log_For_Introduced_Prefixes" line="163">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:09.083230" elapsed="0.000311"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:09.082859" elapsed="0.000759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.085105" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.084946" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.084909" elapsed="0.000274"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.090718" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.090611" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.090592" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.091804" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:09.091402" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.092293" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:09.092000" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:09.092363" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:46:09.092547" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:09.091025" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.098525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.098399" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.098380" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.099789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.099682" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.099664" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:09.100315" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:09.100009" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.100773" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.100519" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.135967" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:09.101307" elapsed="0.034798"/>
</kw>
<msg time="2026-05-01T00:46:09.136283" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:09.136330" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.100966" elapsed="0.035400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.165069" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:09.136948" elapsed="0.028247"/>
</kw>
<msg time="2026-05-01T00:46:09.165385" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:09.165438" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.136574" elapsed="0.028936"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.165887" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.165611" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.165587" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.166541" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.166166" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.167060" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.166789" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.166764" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:09.167189" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.170370" elapsed="0.000190"/>
</kw>
<msg time="2026-05-01T00:46:09.170634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:09.169003" elapsed="0.001789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.171128" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.171554" elapsed="0.000091"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:09.168215" elapsed="0.003560"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:09.167565" elapsed="0.004290"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:09.099353" elapsed="0.072623"/>
</kw>
<msg time="2026-05-01T00:46:09.172197" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:09.172249" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.098750" elapsed="0.073540"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:09.172799" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:46:09.172390" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.172364" elapsed="0.000550"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.173412" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.173863" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.173951" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:09.098055" elapsed="0.076024"/>
</kw>
<msg time="2026-05-01T00:46:09.174191" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:09.174240" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.093071" elapsed="0.081210"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.174720" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.174379" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.174356" elapsed="0.000455"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:09.092922" elapsed="0.081923"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:09.092654" elapsed="0.082234"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:09.090236" elapsed="0.084722"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:09.084468" elapsed="0.090557"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.083839" elapsed="0.091237"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:09.079204" elapsed="0.095939"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.175340" elapsed="0.000154"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.198314" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:09.211351" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:09.211620" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:09.198141" elapsed="0.013541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.212826" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.212159" elapsed="0.000772"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:09.213281" elapsed="0.000779"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:09.197297" elapsed="0.016905"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:09.175705" elapsed="0.038618"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.231517" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:09.262983" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:09.263198" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:09.231335" elapsed="0.031932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.264256" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.263686" elapsed="0.000680"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:09.264771" elapsed="0.000746"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received: ${BGP_PEER1_FIRST_PREFIX_IP}/${BGP_PEER1_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:09.230885" elapsed="0.034772"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.285787" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:09.315064" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:09.315277" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:09.285607" elapsed="0.029724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.316324" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.315745" elapsed="0.000679"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:09.316828" elapsed="0.000748"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:09.285214" elapsed="0.032501"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:09.319046" elapsed="0.000572"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:09.318331" elapsed="0.001429"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:09.078218" elapsed="0.241627"/>
</test>
<test id="s1-s8-t6" name="TC1_Disconnect_BGP_Peer1" line="180">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:09.326488" elapsed="0.000314"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:09.326053" elapsed="0.000832"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.328434" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.328240" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.328208" elapsed="0.000362"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.334631" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.334513" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.334493" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.335746" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:09.335326" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.336244" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:09.335948" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:09.336314" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:46:09.336514" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:09.334942" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.342409" elapsed="0.000093"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.342298" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.342279" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.343790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:09.343680" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.343661" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:09.344328" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:09.344010" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.344798" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.344544" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.374365" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:09.345335" elapsed="0.029156"/>
</kw>
<msg time="2026-05-01T00:46:09.374663" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:09.374709" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.344992" elapsed="0.029754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:09.397248" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:09.375279" elapsed="0.022075"/>
</kw>
<msg time="2026-05-01T00:46:09.397534" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:09.397581" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.374922" elapsed="0.022695"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.397921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.397695" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.397675" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.398447" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:09.398144" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.398830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.398613" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.398595" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:09.398941" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.401487" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:46:09.401692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:09.400381" elapsed="0.001442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.402099" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.402437" elapsed="0.000103"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:09.399765" elapsed="0.002887"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:09.399218" elapsed="0.003498"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:09.343329" elapsed="0.059483"/>
</kw>
<msg time="2026-05-01T00:46:09.402902" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:09.402945" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.342729" elapsed="0.060253"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:09.403165" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:09.403058" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.403040" elapsed="0.000247"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.403722" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.404067" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:09.404138" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:09.341959" elapsed="0.062286"/>
</kw>
<msg time="2026-05-01T00:46:09.404336" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:09.404380" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.336961" elapsed="0.067455"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:09.404759" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:09.404506" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:09.404488" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:09.336808" elapsed="0.068077"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:09.336598" elapsed="0.068321"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:09.334089" elapsed="0.070886"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:09.327802" elapsed="0.077228"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:09.327115" elapsed="0.077959"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:09.322186" elapsed="0.082939"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:09.405284" elapsed="0.000105"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:09.406540" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:09.406200" elapsed="0.000367"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:09.406723" elapsed="0.000219"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:09.405928" elapsed="0.001082"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.407886" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:11.408256" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:09.407160" elapsed="2.001161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.409600" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.408875" elapsed="0.000834"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:09.405613" elapsed="2.004257"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.426316" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-05-01T00:46:11.440409" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:11.440662" level="INFO">${output_log} = 2026-05-01 00:46:06,714 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:06,714 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:06,714 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:11.426171" elapsed="0.014552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.441702" level="INFO">2026-05-01 00:46:06,714 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:06,714 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:06,714 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:06,714 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:06,714 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:06,715 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:06,717 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:06,718 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:06,718 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:06,718 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:06,718 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:06,718 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:06,718 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-05-01 00:46:06,719 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:06,719 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:06,719 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-05-01 00:46:06,719 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-05-01 00:46:06,720 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:06,720 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,720 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:06,720 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:06,720 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:06,721 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:06,721 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,722 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:06,723 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:06,723 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-05-01 00:46:06,724 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,726 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:06,727 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:06,728 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-05-01 00:46:06,729 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.007744550704956055s
2026-05-01 00:46:06,729 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:06,730 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:06,730 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:07,915 INFO BGP-Thread-1 (job): ... idle for 1.185s
2026-05-01 00:46:07,916 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.185s
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,916 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,917 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:07,917 INFO BGP-Thread-1 (job): total_received_update_message_counter: 2
2026-05-01 00:46:07,917 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 1
2026-05-01 00:46:07,917 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-05-01 00:46:07,922 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020'
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,925 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,926 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.441094" elapsed="0.001396"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:11.443722" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:11.442927" elapsed="0.000922"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>tc1_${BGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:11.425720" elapsed="0.018265"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:11.445349" elapsed="0.000621"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:11.444633" elapsed="0.001480"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:09.320776" elapsed="2.125422"/>
</test>
<test id="s1-s8-t7" name="TC1_BGP_Peer2_Check_Log_For_Withdrawn_Prefixes" line="187">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:11.451287" elapsed="0.000311"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:11.450919" elapsed="0.000755"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.453109" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.452926" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.452895" elapsed="0.000320"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.459067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.458956" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.458938" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.460139" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:11.459756" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.460637" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:11.460327" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:11.460707" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:46:11.460871" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:11.459364" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.466856" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.466747" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.466728" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.468094" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.467988" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.467970" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:11.468640" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:11.468308" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.469039" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.468826" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.497021" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:11.469578" elapsed="0.027545"/>
</kw>
<msg time="2026-05-01T00:46:11.497286" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:11.497331" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.469225" elapsed="0.028142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.524503" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:11.497927" elapsed="0.026683"/>
</kw>
<msg time="2026-05-01T00:46:11.524802" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:11.524849" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.497565" elapsed="0.027321"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.525190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.524967" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.524945" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.525760" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.525447" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.526142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.525923" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.525884" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:11.526252" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.528824" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:46:11.529033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:11.527754" elapsed="0.001414"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.529443" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.529801" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:11.527117" elapsed="0.002885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:11.526539" elapsed="0.003528"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:11.467689" elapsed="0.062475"/>
</kw>
<msg time="2026-05-01T00:46:11.530254" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:11.530298" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.467081" elapsed="0.063254"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:11.530535" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:11.530411" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.530392" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.531020" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.531358" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.531429" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:11.466397" elapsed="0.065167"/>
</kw>
<msg time="2026-05-01T00:46:11.531656" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:11.531700" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.461279" elapsed="0.070457"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.532062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.531810" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.531793" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:11.461131" elapsed="0.071031"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:11.460952" elapsed="0.071241"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:11.458600" elapsed="0.073648"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:11.452514" elapsed="0.079825"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.451888" elapsed="0.080496"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:11.447705" elapsed="0.084731"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.532612" elapsed="0.000106"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.546397" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:11.559560" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:11.559772" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:11.546233" elapsed="0.013594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.560792" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.560193" elapsed="0.000698"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:11.561234" elapsed="0.000762"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:11.545811" elapsed="0.016346"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:11.532879" elapsed="0.029400"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.580081" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:11.610975" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:11.611200" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:11.579921" elapsed="0.031337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.612274" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.611668" elapsed="0.000705"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:11.612749" elapsed="0.000692"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received: ${BGP_PEER1_FIRST_PREFIX_IP}/${BGP_PEER1_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:11.579485" elapsed="0.034130"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:11.614957" elapsed="0.000580"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:11.614232" elapsed="0.001448"/>
</kw>
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:11.446844" elapsed="0.168920"/>
</test>
<test id="s1-s8-t8" name="TC1_Disconnect_BGP_Peer2" line="203">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:11.620918" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:11.620656" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.622183" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.622074" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.622055" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.627515" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.627393" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.627375" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.628696" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:11.628221" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.629184" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:11.628888" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:11.629253" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:11.629408" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:11.627812" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.635486" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.635327" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.635309" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.636725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:11.636616" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.636598" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:11.637237" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:11.636940" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.637655" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.637423" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.668805" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:11.638205" elapsed="0.030704"/>
</kw>
<msg time="2026-05-01T00:46:11.669071" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:11.669116" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.637844" elapsed="0.031308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:11.694226" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:11.669692" elapsed="0.024806"/>
</kw>
<msg time="2026-05-01T00:46:11.694760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:11.694808" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.669326" elapsed="0.025520"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.695386" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.694999" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.694944" elapsed="0.000556"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.696111" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:11.695661" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.696493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.696255" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.696236" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:11.696613" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.699517" elapsed="0.000155"/>
</kw>
<msg time="2026-05-01T00:46:11.699735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:11.698311" elapsed="0.001566"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.700167" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.700532" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:11.697625" elapsed="0.003102"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:11.696988" elapsed="0.003807"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:11.636292" elapsed="0.064717"/>
</kw>
<msg time="2026-05-01T00:46:11.701123" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:11.701169" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.635718" elapsed="0.065496"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:11.701407" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:11.701296" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.701276" elapsed="0.000320"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.702051" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.702416" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:11.702504" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:11.634991" elapsed="0.067628"/>
</kw>
<msg time="2026-05-01T00:46:11.702720" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:11.702766" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.629823" elapsed="0.072981"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:11.703144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:11.702883" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:11.702865" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:11.629679" elapsed="0.073569"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:11.629508" elapsed="0.073779"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:11.627036" elapsed="0.076315"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:11.621773" elapsed="0.081639"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:11.621330" elapsed="0.082156"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:11.617537" elapsed="0.086011"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:11.703722" elapsed="0.000108"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:11.705030" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:11.704694" elapsed="0.000364"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:11.705217" elapsed="0.000227"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:11.704363" elapsed="0.001165"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.706672" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:13.706988" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:11.705681" elapsed="2.001352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.707878" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.707388" elapsed="0.000559"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:11.704040" elapsed="2.003997"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.720082" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-05-01T00:46:13.733066" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:13.733208" level="INFO">${output_log} = 2026-05-01 00:46:07,856 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:07,857 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:07,857 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:13.719937" elapsed="0.013308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.733881" level="INFO">2026-05-01 00:46:07,856 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:07,857 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:07,857 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:07,857 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:07,857 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:07,857 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:07,859 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:07,859 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:07,860 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:07,860 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:07,861 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:07,861 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:07,861 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-05-01 00:46:07,862 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:07,863 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:07,864 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:07,864 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:07,865 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:07,866 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:07,867 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:07,868 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:07,870 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.006780147552490234s
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:07,871 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:07,871 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:07,872 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:07,873 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:46:07,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:07,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:07,874 INFO BGP-Thread-1 (job): ... idle for 0.001s
2026-05-01 00:46:07,874 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.001s
2026-05-01 00:46:07,874 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,875 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000'
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,918 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010000'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010000'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.0/28']
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.0/28
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,919 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010010'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010010'
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.16/28']
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.16/28
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,920 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020'
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:07,921 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010020'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010020'
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.32/28']
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.32/28
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:07,923 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:09,435 INFO BGP-Thread-1 (job): ... idle for 1.512s
2026-05-01 00:46:09,436 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.555s
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:09,436 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010000'
2026-05-01 00:46:09,437 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010000'
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.0/28']
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.0/28
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:09,438 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010010'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010010'
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.16/28']
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.16/28
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:09,439 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020'
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:09,440 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010020'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010020'
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.32/28']
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.32/28
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:09,441 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:09,441 INFO BGP-Thread-1 (job): total_received_update_message_counter: 7
2026-05-01 00:46:09,441 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:46:09,441 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 3
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.733506" elapsed="0.001026"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:13.735950" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:13.734815" elapsed="0.001217"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>tc1_${BGP_PEER2_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:13.719499" elapsed="0.016621"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:13.736994" elapsed="0.000348"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:13.736550" elapsed="0.000884"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:11.616387" elapsed="2.121129"/>
</test>
<test id="s1-s8-t9" name="TC_1_Check_for_Empty_IPv4_Topology" line="210">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:13.743006" elapsed="0.000312"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:13.742630" elapsed="0.000765"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.744856" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.744678" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.744648" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.752306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.752197" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.752180" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.753389" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:13.752998" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.753941" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:13.753643" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:13.754012" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:46:13.754175" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:13.752622" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.760227" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.760119" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.760100" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.761490" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.761360" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.761342" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:13.762013" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:13.761711" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.762414" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:13.762200" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.793640" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:13.762956" elapsed="0.030800"/>
</kw>
<msg time="2026-05-01T00:46:13.793932" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:13.793978" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.762619" elapsed="0.031396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.836723" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "1 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:13.794595" elapsed="0.042239"/>
</kw>
<msg time="2026-05-01T00:46:13.836996" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:13.837103" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "1 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.794215" elapsed="0.042928"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.837492" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.837228" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.837205" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.838032" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "1 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.837720" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.838389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.838170" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.838152" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:13.838520" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:13.841172" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:46:13.841380" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:13.840010" elapsed="0.001523"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.841838" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.842181" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:13.839364" elapsed="0.003009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:13.838809" elapsed="0.003629"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:13.761060" elapsed="0.081637"/>
</kw>
<msg time="2026-05-01T00:46:13.842791" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:13.842836" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "1 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.760465" elapsed="0.082408"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:13.843061" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:46:13.842950" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.842931" elapsed="0.000245"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.843604" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.843948" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.844019" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:13.759775" elapsed="0.084354"/>
</kw>
<msg time="2026-05-01T00:46:13.844222" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:13.844265" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "1 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.754597" elapsed="0.089705"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.844647" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.844378" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.844360" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:13.754434" elapsed="0.090314"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:13.754256" elapsed="0.090524"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:13.751701" elapsed="0.093135"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:13.744242" elapsed="0.100648"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.743630" elapsed="0.101343"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:13.738915" elapsed="0.106112"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:13.853017" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:13.853212" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:13.853369" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:13.846190" elapsed="0.007216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.857237" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.853704" elapsed="0.003597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.861208" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.857545" elapsed="0.003730"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:13.861525" elapsed="0.003713"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:46:13.845841" elapsed="0.019484"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:13.845203" elapsed="0.020191"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:13.866220" elapsed="0.000356"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:13.865793" elapsed="0.000873"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:13.738105" elapsed="0.128614"/>
</test>
<test id="s1-s8-t10" name="TC1_Delete_BGP_Peers_Configuration" line="218">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:13.870997" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:13.870732" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.872267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.872155" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.872136" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.877700" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.877592" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.877574" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.878794" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:13.878387" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.879285" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:13.878980" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:13.879354" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:13.879525" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:13.877997" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.885473" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.885348" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.885329" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.886700" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:13.886594" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.886576" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:13.887284" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:13.886966" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.887700" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:13.887487" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.915809" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:13.888224" elapsed="0.027686"/>
</kw>
<msg time="2026-05-01T00:46:13.916073" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:13.916119" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.887888" elapsed="0.028268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:13.942378" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:13.916698" elapsed="0.025820"/>
</kw>
<msg time="2026-05-01T00:46:13.942691" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:13.942737" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.916331" elapsed="0.026442"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.943117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.942863" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.942838" elapsed="0.000384"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.943717" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.943378" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.944070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.943854" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.943836" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:13.944182" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:13.946736" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:46:13.946940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:13.945694" elapsed="0.001381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.947366" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.947725" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:13.945044" elapsed="0.002865"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:13.944497" elapsed="0.003478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:13.886272" elapsed="0.061800"/>
</kw>
<msg time="2026-05-01T00:46:13.948166" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:13.948212" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.885699" elapsed="0.062550"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:13.948434" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-05-01T00:46:13.948326" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.948307" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.948952" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.949352" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:13.949425" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:13.885011" elapsed="0.064540"/>
</kw>
<msg time="2026-05-01T00:46:13.949646" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:13.949691" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "1 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.879919" elapsed="0.069809"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:13.950057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:13.949805" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.949788" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:13.879775" elapsed="0.070383"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:13.879603" elapsed="0.070586"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:13.877204" elapsed="0.073041"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:13.871868" elapsed="0.078433"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:13.871427" elapsed="0.078920"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:13.868201" elapsed="0.082201"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.951123" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:13.950590" elapsed="0.000562"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.996771" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:13.996379" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:13.997590" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:13.997299" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:13.997771" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:13.996963" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.998349" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:13.997963" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:13.998695" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:13.998866" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:13.998556" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:13.999323" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:13.999051" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.000328" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.000074" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.000810" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.000550" elapsed="0.000340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.001581" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.001263" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.002340" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.002121" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.002415" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.002586" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.001799" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.002767" elapsed="0.000248"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:14.001123" elapsed="0.001936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.003678" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.003355" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.004605" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.004222" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.004688" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.004845" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.003894" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.005028" elapsed="0.000225"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:46:14.003213" elapsed="0.002080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.005859" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.005561" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.006624" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.006394" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.006699" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.006852" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.006074" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.007031" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:46:14.005409" elapsed="0.001963"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.007951" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.007652" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.008703" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.008496" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.008777" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.008926" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.008164" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.009101" elapsed="0.000217"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.007510" elapsed="0.001847"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.000944" elapsed="0.008447"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.009434" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:46:14.009608" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:13.999749" elapsed="0.009885"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:13.999437" elapsed="0.010228"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.009839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.009690" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:13.999418" elapsed="0.010497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.010752" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.010062" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.010873" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:13.995761" elapsed="0.015249"/>
</kw>
<msg time="2026-05-01T00:46:14.011063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:13.982086" elapsed="0.029035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.025565" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.038674" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.051716" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.051912" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.052090" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.052475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.052308" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.052294" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.052701" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.052871" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.053038" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.052265" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.052164" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.053264" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.053339" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:46:14.053475" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:13.977591" elapsed="0.075912"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.054644" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.054378" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:14.069308" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.069414" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.069661" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:14.057110" elapsed="0.012611"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.054757" elapsed="0.015052"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.070217" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.069867" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.054739" elapsed="0.015663"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.077502" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.072699" elapsed="0.004864"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.072173" elapsed="0.005438"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.072134" elapsed="0.005512"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.081533" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.078034" elapsed="0.003565"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.077723" elapsed="0.003924"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.077701" elapsed="0.003980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.082435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.081917" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.082930" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.082593" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.083745" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.083304" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.083043" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.082569" elapsed="0.001294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.084648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.084090" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.084982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.084745" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.085535" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.085226" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.085063" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.084727" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.085770" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:14.086578" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.086280" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.086762" elapsed="0.002501"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:14.071219" elapsed="0.018106"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:14.089404" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:46:14.091851" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:14.053802" elapsed="0.038076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.091933" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:13.951420" elapsed="0.140637"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.092755" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.092227" elapsed="0.000556"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.138030" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.137646" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.138848" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.138584" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.139015" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.138230" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.139641" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.139208" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.139972" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:14.140119" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:14.139834" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.140562" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.140304" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.141579" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.141307" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.142046" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.141785" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.142740" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.142430" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.143521" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.143283" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.143597" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.143751" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.142954" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.143930" elapsed="0.000228"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:14.142293" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.144761" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.144464" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.145570" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.145296" elapsed="0.000300"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.145647" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.145799" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.144975" elapsed="0.000849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.145977" elapsed="0.000220"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:46:14.144315" elapsed="0.001922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.146795" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.146499" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.149117" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.148895" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.149200" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:46:14.149356" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.148565" elapsed="0.000815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.149552" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:46:14.146349" elapsed="0.003468"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.150370" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.150071" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.151132" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.150922" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.151209" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.151375" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.150601" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.151574" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.149932" elapsed="0.002002"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.142121" elapsed="0.009853"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.152019" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.152181" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:14.140987" elapsed="0.011219"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.140680" elapsed="0.011557"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.152413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.152263" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.140659" elapsed="0.011855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.153268" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.152662" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.153346" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.136991" elapsed="0.016497"/>
</kw>
<msg time="2026-05-01T00:46:14.153543" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.123434" elapsed="0.030155"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.166680" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.179980" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.193087" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.193283" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.193474" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.193848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.193698" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.193684" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.194074" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.194245" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.194412" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.193654" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.193551" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.194655" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.194731" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:14.194853" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:14.118725" elapsed="0.076155"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.196113" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.195868" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:14.210918" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.210967" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.211079" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:14.198578" elapsed="0.012536"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.196227" elapsed="0.014957"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.211496" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.211227" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.196209" elapsed="0.015460"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.216800" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.213082" elapsed="0.003778"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.212774" elapsed="0.004137"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.212749" elapsed="0.004197"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.220649" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.217342" elapsed="0.003353"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.217025" elapsed="0.003706"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.217002" elapsed="0.003753"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.221306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.220930" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.221658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.221403" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.222202" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.221905" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.221740" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.221386" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.222825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.222461" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.223163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.222922" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.223733" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.223420" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.223243" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.222904" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.223969" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:14.224767" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.224491" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.224948" elapsed="0.002490"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:14.212177" elapsed="0.015340"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:14.227564" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.229978" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:14.195139" elapsed="0.034867"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.230059" elapsed="0.000029"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:14.093014" elapsed="0.137174"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:14.230793" elapsed="0.000237"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:14.230486" elapsed="0.000608"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:13.867248" elapsed="0.363886"/>
</test>
<test id="s1-s8-t11" name="TC2_Configure_One_iBGP_Route_Reflector_Client_And_One_iBGP_Non_Client" line="240">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:14.234712" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:14.234426" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.236040" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.235894" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.235876" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.241675" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.241567" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.241549" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.242747" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.242350" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.243238" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:14.242939" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:14.243311" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:46:14.243498" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.241972" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.249331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.249223" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.249205" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.250593" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.250485" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.250444" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:14.251107" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.250810" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.251545" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:14.251296" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.280306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:14.252073" elapsed="0.028500"/>
</kw>
<msg time="2026-05-01T00:46:14.280943" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:14.281048" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.251735" elapsed="0.029398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.316467" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "O "n "e "_ "i "B "G "P "_ "R "o "u "t "e "_ "R "e "f "l "e "c "t "o "r "_ "C "l "i "e "n "t "_ "A "n "d "_ "O "n "e "_ "i "B "[78CG "[A[78CP
 "_ "N "o "n "_ "C "l "i "e "n "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:14.282341" elapsed="0.034248"/>
</kw>
<msg time="2026-05-01T00:46:14.316750" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:14.316796" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "O "n "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.281562" elapsed="0.035271"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.317141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.316911" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.316891" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.317689" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "O "n "e "_ "i "B "G "P "_ "R "o "u "t "e "_ "R "e "f "l "e "c "t "o "r "_ "C "l "i "e "n "t "_ "A "n "d "_ "O "n "e "_ "i "B "[78CG "[A[78CP
 "_ "N "o "n "_ "C "l "i "e "n "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.317366" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.318058" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.317839" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.317821" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:14.318209" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:14.320909" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:46:14.321113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.319832" elapsed="0.001411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.321543" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.321885" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:14.319037" elapsed="0.003033"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:14.318500" elapsed="0.003635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:14.250159" elapsed="0.072074"/>
</kw>
<msg time="2026-05-01T00:46:14.322324" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:14.322368" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "O "n "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.249570" elapsed="0.072835"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:14.322778" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:14.322498" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.322479" elapsed="0.000388"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.323270" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.323658" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.323732" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:14.248885" elapsed="0.074956"/>
</kw>
<msg time="2026-05-01T00:46:14.323932" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:14.323976" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "O "n "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.243897" elapsed="0.080116"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.324346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.324091" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.324071" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:14.243749" elapsed="0.080714"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:14.243577" elapsed="0.080918"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:14.241188" elapsed="0.083361"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:14.235607" elapsed="0.088998"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.235134" elapsed="0.089515"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:14.232123" elapsed="0.092578"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.325680" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=rr-client | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=rr-client</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.324870" elapsed="0.000840"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.361531" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.361130" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.362365" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.362132" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.362552" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.361787" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.363140" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.362747" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.363516" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:14.363659" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:14.363334" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.364094" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.363847" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.365121" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.364862" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.365728" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.365464" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.366426" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.366129" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.367419" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.367184" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.367518" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:46:14.367677" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.366856" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.367860" elapsed="0.000238"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:14.365990" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.368705" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.368390" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.369462" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.369237" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.369540" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.369692" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.368920" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.369870" elapsed="0.000221"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:46:14.368254" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.370695" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.370382" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.371478" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.371227" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.371595" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:14.371754" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.370908" elapsed="0.000872"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.371936" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:46:14.370246" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.372790" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.372485" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.373564" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.373334" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.373641" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.373794" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.373009" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.373974" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:14.372316" elapsed="0.001927"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.374806" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.374509" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.375575" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.375337" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.375650" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.375799" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.375021" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.375977" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:14.374358" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.376801" level="INFO">${value} = rr-client</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.376503" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.377829" level="INFO">${encoded} = rr-client</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.377330" elapsed="0.000525"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.377907" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.378061" level="INFO">${encoded_value} = rr-client</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.377015" elapsed="0.001069"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.378238" elapsed="0.000249"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-05-01T00:46:14.376351" elapsed="0.002178"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.379078" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.378781" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.379865" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.379654" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.379940" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.380090" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.379291" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.380268" elapsed="0.000236"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:14.378645" elapsed="0.001900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.381092" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.380797" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.381850" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.381640" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.381926" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.382118" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.381306" elapsed="0.000838"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.382299" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.380661" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.383126" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.382828" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.383897" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.383687" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.383972" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.384123" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.383340" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.384301" elapsed="0.000240"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:14.382693" elapsed="0.001891"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.385136" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.384838" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.385890" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.385682" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.385964" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.386114" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.385349" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.386290" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.384699" elapsed="0.001866"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.387106" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.386812" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.387885" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.387675" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.387959" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.388109" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.387316" elapsed="0.000817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.388285" elapsed="0.000235"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.386678" elapsed="0.001883"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.389296" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.388810" elapsed="0.000512"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.390052" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.389843" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.390128" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.390278" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.389527" elapsed="0.000775"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.390468" elapsed="0.000223"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:14.388675" elapsed="0.002058"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.365806" elapsed="0.024962"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.390810" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:14.390972" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:14.364536" elapsed="0.026462"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.364215" elapsed="0.026815"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.391207" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.391056" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.364194" elapsed="0.027161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.392306" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.391532" elapsed="0.000803"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.392385" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.360508" elapsed="0.032018"/>
</kw>
<msg time="2026-05-01T00:46:14.392582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.346837" elapsed="0.045792"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.405833" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.419005" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.432211" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.432407" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.432600" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.432969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.432822" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.432807" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.433191" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.433360" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.433542" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.432778" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.432676" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.433770" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.433845" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:14.433968" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:14.342296" elapsed="0.091698"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.462166" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.461791" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.462917" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.462712" elapsed="0.000268">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.463072" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.462358" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.463691" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.463266" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.464014" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:14.464139" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:14.463881" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.464580" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.464322" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:14.464996" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.464705" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.465589" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'rr-client', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.465226" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.465079" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.464687" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.466628" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.465818" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.466708" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.461157" elapsed="0.005677"/>
</kw>
<msg time="2026-05-01T00:46:14.466923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.447478" elapsed="0.019494"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.480196" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.493467" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.506617" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.506810" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.506984" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.507353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.507208" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.507193" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.507617" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.507789" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.507956" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.507164" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.507061" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.508180" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.508254" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:14.508388" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:14.444690" elapsed="0.063727"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.509685" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.509435" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.509838" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.509091" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.510220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.509970" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.510781" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.510491" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.510301" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.509951" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.513519" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.511018" elapsed="0.002528"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:14.513599" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.513757" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:14.508767" elapsed="0.005014"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.515165" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.514920" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.515657" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.515364" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.516114" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.515872" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.516569" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.516311" elapsed="0.000301"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:14.517413" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:14.517223" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:14.517792" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:14.517619" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.517968" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.518582" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.518320" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:14.518668" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.518824" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:14.516818" elapsed="0.002030"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:14.534659" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1074', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:14.534755" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.534850" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:14.521125" elapsed="0.013751"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.518918" elapsed="0.016003"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.535189" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.534948" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.518901" elapsed="0.016488"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.543661" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.537670" elapsed="0.006089"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.537139" elapsed="0.006697"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.537097" elapsed="0.006797"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.546789" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.544319" elapsed="0.002515"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.544023" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.543982" elapsed="0.002913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.547435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.547064" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.547808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.547562" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.548356" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.548055" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.547890" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.547544" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.548982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.548619" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.549315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.549078" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.550002" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.549698" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.549397" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.549060" elapsed="0.001035"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.550253" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:14.551077" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.550790" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.551264" elapsed="0.002527"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:14.536263" elapsed="0.017592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:14.554030" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:46:14.553922" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.553904" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.554280" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.554349" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:14.556794" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:14.514116" elapsed="0.042706"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.556934" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.557095" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:14.330601" elapsed="0.226519"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.557480" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.557219" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.557203" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.557607" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:14.325998" elapsed="0.231733"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.558716" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ibgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENC...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ibgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.557904" elapsed="0.000841"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.594273" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.593898" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.595036" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.594816" elapsed="0.000288">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.595201" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.594481" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.595808" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.595390" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.596130" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:14.596267" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:14.595997" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.596707" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.596466" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.597711" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.597429" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.598179" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.597920" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.598891" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.598596" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.599709" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.599473" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.599821" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:14.599976" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.599126" elapsed="0.000875"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.600162" elapsed="0.000224"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:14.598441" elapsed="0.001986"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.600990" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.600695" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.601752" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.601542" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.601827" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.601976" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.601203" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.602153" elapsed="0.000220"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:46:14.600559" elapsed="0.001854"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.602972" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.602680" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.603887" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.603678" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.603963" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.604111" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.603318" elapsed="0.000817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.604287" elapsed="0.000409"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:46:14.602544" elapsed="0.002194"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.605286" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.604987" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.606048" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.605841" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.606123" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.606271" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.605521" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.606463" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:14.604850" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.607393" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.606972" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.608199" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.607987" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.608274" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.608423" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.607650" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.608620" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:14.606837" elapsed="0.002043"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.609423" level="INFO">${value} = ibgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.609126" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.610176" level="INFO">${encoded} = ibgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.609969" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.610287" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.610441" level="INFO">${encoded_value} = ibgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.609653" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.610636" elapsed="0.000218"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-05-01T00:46:14.608992" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.611438" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.611146" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.612212" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.612005" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.612287" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.612437" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.611689" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.612632" elapsed="0.000218"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:14.611007" elapsed="0.001884"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.613431" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.613140" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.614193" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.613980" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.614268" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:14.614417" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.613663" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.614609" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.613005" elapsed="0.001864"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.615408" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.615115" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.617273" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.617062" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.617349" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.617515" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.615657" elapsed="0.001884"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.617695" elapsed="0.000218"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:14.614981" elapsed="0.002972"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.618510" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.618198" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.619245" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.619039" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.619321" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.619484" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.618724" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.619692" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.618064" elapsed="0.001890"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.620515" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.620202" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.621256" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.621045" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.621368" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.621536" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.620730" elapsed="0.000831"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.621717" elapsed="0.000221"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:14.620067" elapsed="0.001911"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.622539" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:14.622226" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:14.623274" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.623069" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:14.623348" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:14.623516" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:14.622753" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.623745" elapsed="0.000232"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:14.622091" elapsed="0.001929"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.598254" elapsed="0.025803"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:14.624105" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:14.624275" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:14.597109" elapsed="0.027195"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.596819" elapsed="0.027519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.624535" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.624364" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.596801" elapsed="0.027815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.625529" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.624764" elapsed="0.000796"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.625610" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.593264" elapsed="0.032477"/>
</kw>
<msg time="2026-05-01T00:46:14.625796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.579614" elapsed="0.046231"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.639342" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.652492" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.665631" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.665870" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.666047" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.666416" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.666269" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.666255" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.666657" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.666828" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.666994" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.666225" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.666123" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.667221" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.667298" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:14.667420" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:14.575133" elapsed="0.092327"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.695546" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.695154" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.696312" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.696101" elapsed="0.000274">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.696483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.695767" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.697055" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.696675" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.697375" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:14.697516" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:14.697243" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.697942" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.697701" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:14.698402" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.698109" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.698949" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.698650" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.698501" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.698090" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.700012" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.699181" elapsed="0.000861"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.700093" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.694539" elapsed="0.005682"/>
</kw>
<msg time="2026-05-01T00:46:14.700279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.680986" elapsed="0.019340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.713705" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.726804" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.739993" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.740195" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.740373" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.740766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.740619" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:14.740603" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.740992" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.741163" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.741330" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:14.740571" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.740463" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.741618" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.741697" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:46:14.741840" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:14.678200" elapsed="0.063669"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:14.743188" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.742930" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:14.743348" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:14.742563" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.743747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.743444" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.744305" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.744014" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.743829" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.743426" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.746859" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.744556" elapsed="0.002329"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:14.746937" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:14.747099" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:14.742206" elapsed="0.004919"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.748563" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.748296" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.749004" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.748768" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.749479" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.749214" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.749921" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.749679" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:14.750799" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:14.750598" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:14.751152" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:14.750980" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.751396" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.752075" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.751821" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:14.752168" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:14.752335" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:14.750173" elapsed="0.002188"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:14.767813" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1075', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:14.767917" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.768132" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:14.754980" elapsed="0.013214"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.752440" elapsed="0.015870"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.768820" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.768379" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.752420" elapsed="0.016617"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.777008" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.771530" elapsed="0.005524"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.770915" elapsed="0.006175"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.770870" elapsed="0.006247"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.779939" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.777405" elapsed="0.002581"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.777178" elapsed="0.002842"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.777161" elapsed="0.002883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.780662" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.780244" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.781006" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.780760" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.781572" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.781259" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.781091" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.780742" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.782177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.781817" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.782523" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.782271" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.783131" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.782837" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:14.782668" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.782254" elapsed="0.000960"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.783371" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:14.784216" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:14.783918" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.784400" elapsed="0.002552"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:14.769987" elapsed="0.017032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:14.787199" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:46:14.787089" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.787070" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.787467" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.787538" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:14.790139" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:14.747480" elapsed="0.042687"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.790232" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:14.790387" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:14.563719" elapsed="0.226692"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.790784" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.790528" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.790510" elapsed="0.000368"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:14.790913" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:14.559035" elapsed="0.232003"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:14.791669" elapsed="0.000247"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:14.791321" elapsed="0.000658"/>
</kw>
<doc>Configure iBGP peers: 1st one as RR client, 2nd one as RR non-client.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:14.231508" elapsed="0.560510"/>
</test>
<test id="s1-s8-t12" name="TC2_Connect_BGP_Peer1" line="278">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:14.795662" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:14.795348" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.796942" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.796831" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.796813" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.802464" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.802341" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.802323" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.803563" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:14.803155" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.804153" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:14.803781" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:14.804224" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:46:14.804383" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:14.802772" elapsed="0.001636"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.810275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.810164" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.810144" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.811568" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:14.811432" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.811414" elapsed="0.000254"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:14.812132" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:14.811822" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.812567" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:14.812324" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.843025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:14.813093" elapsed="0.030170"/>
</kw>
<msg time="2026-05-01T00:46:14.843530" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:14.843579" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.812755" elapsed="0.030863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.866084" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:14.844409" elapsed="0.021914"/>
</kw>
<msg time="2026-05-01T00:46:14.866592" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:14.866641" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.843923" elapsed="0.022757"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.867134" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.866803" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.866767" elapsed="0.000454"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.867808" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.867373" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.868167" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.867946" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.867928" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:14.868284" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:14.871075" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:46:14.871289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:14.869914" elapsed="0.001515"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.871766" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.872110" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:14.869237" elapsed="0.003061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:14.868651" elapsed="0.003712"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:14.811130" elapsed="0.061417"/>
</kw>
<msg time="2026-05-01T00:46:14.872645" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:14.872689" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.810521" elapsed="0.062206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:14.872917" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:14.872807" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.872787" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.873431" elapsed="0.000048"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.873810" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:14.873882" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:14.809811" elapsed="0.064182"/>
</kw>
<msg time="2026-05-01T00:46:14.874088" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:14.874132" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.804813" elapsed="0.069357"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:14.874529" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:14.874248" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:14.874230" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:14.804665" elapsed="0.069968"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:14.804481" elapsed="0.070188"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:14.801973" elapsed="0.072756"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:14.796538" elapsed="0.078249"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:14.796081" elapsed="0.078755"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:14.792880" elapsed="0.082012"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:14.875062" elapsed="0.000113"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.884619" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:14.884227" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.885066" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.884819" elapsed="0.000293"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:14.889684" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-05-01T00:46:14.889788" level="INFO">${output} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:14.885267" elapsed="0.004548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.890245" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.889989" elapsed="0.000303"/>
</kw>
<arg>${BGP_PEER1_COMMAND}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:14.883790" elapsed="0.006563"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:14.897324" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:14.897659" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:14.897808" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:14.891693" elapsed="0.006153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.902373" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.898104" elapsed="0.004338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.905720" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:14.902701" elapsed="0.003066"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:14.908687" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:14.905925" elapsed="0.002839">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:14.891209" elapsed="0.017671">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:15.921145" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:15.921366" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:15.921556" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:15.910989" elapsed="0.010609"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:15.925876" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:15.921893" elapsed="0.004053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:15.929882" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:15.926187" elapsed="0.003744"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:15.930091" elapsed="0.002744"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:15.909818" elapsed="0.023091"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:14.890546" elapsed="1.042421"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:15.933644" elapsed="0.000252"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:15.933290" elapsed="0.000669"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:14.792371" elapsed="1.141629"/>
</test>
<test id="s1-s8-t13" name="TC2_Connect_BGP_Peer2" line="290">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:15.937599" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:15.937312" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:15.938948" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:15.938815" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:15.938789" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:15.944750" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:15.944632" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:15.944612" elapsed="0.000287"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:15.945966" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:15.945556" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:15.946486" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:15.946163" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:15.946571" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:46:15.946744" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:15.945151" elapsed="0.001619"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:15.952766" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:15.952653" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:15.952632" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:15.954063" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:15.953954" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:15.953936" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:15.954664" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:15.954303" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:15.955080" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:15.954857" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:15.985067" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:15.955635" elapsed="0.029611"/>
</kw>
<msg time="2026-05-01T00:46:15.985479" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:15.985529" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:15.955268" elapsed="0.030298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:16.007699" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:15.986236" elapsed="0.021602"/>
</kw>
<msg time="2026-05-01T00:46:16.008039" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:16.008090" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:15.985807" elapsed="0.022321"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.008573" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:16.008233" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:16.008202" elapsed="0.000466"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.009177" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:16.008832" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.009573" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:16.009322" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:16.009303" elapsed="0.000368"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:16.009722" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:16.013515" elapsed="0.000208"/>
</kw>
<msg time="2026-05-01T00:46:16.013814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:16.011910" elapsed="0.002111"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.014816" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.015311" elapsed="0.000114"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:16.010986" elapsed="0.004631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:16.010156" elapsed="0.005554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:15.953651" elapsed="0.062188"/>
</kw>
<msg time="2026-05-01T00:46:16.015962" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:16.016023" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:15.953002" elapsed="0.063074"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:16.016368" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:46:16.016186" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:16.016160" elapsed="0.000380"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.017143" elapsed="0.000038"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.017740" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:16.017846" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:15.952270" elapsed="0.065743"/>
</kw>
<msg time="2026-05-01T00:46:16.018159" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:16.018226" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:15.947174" elapsed="0.071109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:16.018793" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:16.018404" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:16.018375" elapsed="0.000531"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:15.947012" elapsed="0.071929"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:15.946829" elapsed="0.072161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:15.944200" elapsed="0.074876"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:15.938503" elapsed="0.080664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:15.938028" elapsed="0.081209"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:15.935003" elapsed="0.084317"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:16.019584" elapsed="0.000154"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.031432" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:16.031066" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.031903" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:16.031647" elapsed="0.000304"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:16.036080" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-05-01T00:46:16.036179" level="INFO">${output} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:16.032114" elapsed="0.004094"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.036679" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:16.036401" elapsed="0.000327"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:16.030649" elapsed="0.006204"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:16.045081" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:16.045307" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:16.045508" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:16.038171" elapsed="0.007380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.049575" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:16.045804" elapsed="0.003839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.053744" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:16.049879" elapsed="0.003937"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:16.057811" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:16.054048" elapsed="0.003846">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:16.037725" elapsed="0.020292">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:17.069548" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:17.069752" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '412'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:17.069905" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:17.060133" elapsed="0.009812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.074230" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.070193" elapsed="0.004108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.078189" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.074567" elapsed="0.003694"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:17.078515" elapsed="0.003484"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:17.058957" elapsed="0.023106"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:16.037044" elapsed="1.045068"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.082810" elapsed="0.000249"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.082494" elapsed="0.000628"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:15.934423" elapsed="1.148738"/>
</test>
<test id="s1-s8-t14" name="TC2_BGP_Peer1_Check_Log_For_Introduced_Prefixes" line="302">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:17.086654" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:17.086370" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.087938" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.087817" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.087795" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.093352" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.093245" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.093227" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.094431" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:17.094049" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.094934" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:17.094639" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:17.095005" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:46:17.095165" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:17.093668" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.101349" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.101232" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.101213" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.102619" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.102512" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.102493" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:17.103138" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:17.102836" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.103574" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.103323" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.135156" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:17.104099" elapsed="0.031162"/>
</kw>
<msg time="2026-05-01T00:46:17.135429" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:17.135508" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.103763" elapsed="0.031783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.166096" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:17.136074" elapsed="0.030132"/>
</kw>
<msg time="2026-05-01T00:46:17.166364" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:17.166409" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.135725" elapsed="0.030720"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.166780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.166550" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.166529" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.167345" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.167047" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.167721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.167503" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.167484" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:17.167832" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.170382" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:46:17.170607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:17.169303" elapsed="0.001435"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.171015" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.171350" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:17.168659" elapsed="0.002901"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:17.168111" elapsed="0.003513"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:17.102189" elapsed="0.069532"/>
</kw>
<msg time="2026-05-01T00:46:17.171811" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.171854" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.101591" elapsed="0.070299"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:17.172073" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:46:17.171966" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.171948" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.172576" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.172940" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.173011" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:17.100884" elapsed="0.072236"/>
</kw>
<msg time="2026-05-01T00:46:17.173222" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.173265" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.095582" elapsed="0.077719"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.173644" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.173375" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.173358" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:17.095420" elapsed="0.078323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:17.095244" elapsed="0.078529"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:17.092885" elapsed="0.080942"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:17.087520" elapsed="0.086360"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.087068" elapsed="0.086857"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:17.084086" elapsed="0.089891"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.174136" elapsed="0.000105"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.187897" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.200875" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.201108" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.187733" elapsed="0.013428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.202134" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.201572" elapsed="0.000662"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.202607" elapsed="0.000687"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER2_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.187305" elapsed="0.016127"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER2_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:17.174438" elapsed="0.029147"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.219441" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.2.0.0/28' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.250405" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.250652" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.219281" elapsed="0.031426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.251664" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.251072" elapsed="0.000691"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.252107" elapsed="0.000718"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received: ${BGP_PEER2_FIRST_PREFIX_IP}/${BGP_PEER2_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.218846" elapsed="0.034142"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.270622" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.302750" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.302960" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.270437" elapsed="0.032578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.304006" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.303390" elapsed="0.000714"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.304443" elapsed="0.000763"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.269980" elapsed="0.035363"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.306695" elapsed="0.000534"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.305981" elapsed="0.001388"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:17.083517" elapsed="0.223965"/>
</test>
<test id="s1-s8-t15" name="TC2_BGP_Peer2_Check_Log_For_Introduced_Prefixes" line="319">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:17.313325" elapsed="0.000310"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:17.312959" elapsed="0.000752"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.315122" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.314954" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.314925" elapsed="0.000299"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.322931" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.322823" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.322804" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.324015" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:17.323629" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.324518" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:17.324207" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:17.324589" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:46:17.324750" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:17.323233" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.330669" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.330560" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.330541" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.331899" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.331794" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.331776" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:17.332410" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:17.332114" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.332828" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.332614" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.363961" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:17.333364" elapsed="0.030701"/>
</kw>
<msg time="2026-05-01T00:46:17.364226" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:17.364273" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.333027" elapsed="0.031283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.392970" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:17.364853" elapsed="0.028288"/>
</kw>
<msg time="2026-05-01T00:46:17.393323" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:17.393368" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.364506" elapsed="0.028899"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.393795" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.393524" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.393495" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.394359" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.394026" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.394738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.394521" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.394502" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:17.394852" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.397521" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:46:17.397734" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:17.396375" elapsed="0.001495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.398162" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.398547" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:17.395741" elapsed="0.002995"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:17.395165" elapsed="0.003635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:17.331495" elapsed="0.067401"/>
</kw>
<msg time="2026-05-01T00:46:17.399048" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.399094" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.330893" elapsed="0.068238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:17.399521" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:46:17.399209" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.399190" elapsed="0.000419"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.400017" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.400357" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.400428" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:17.330184" elapsed="0.070369"/>
</kw>
<msg time="2026-05-01T00:46:17.400644" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.400688" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.325240" elapsed="0.075485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.401084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.400799" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.400782" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:17.325094" elapsed="0.076092"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:17.324881" elapsed="0.076335"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:17.322442" elapsed="0.078830"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:17.314547" elapsed="0.086779"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.313921" elapsed="0.087449"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:17.309487" elapsed="0.091936"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.401606" elapsed="0.000107"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.415120" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.428370" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.428524" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.414957" elapsed="0.013604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.429183" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.428790" elapsed="0.000461"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.429487" elapsed="0.000440"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.414559" elapsed="0.015451"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:17.401874" elapsed="0.028208"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.449476" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.479969" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.480198" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.449299" elapsed="0.030955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.481302" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.480675" elapsed="0.000752"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.481836" elapsed="0.000804"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>nlri_prefix_received: ${BGP_PEER1_FIRST_PREFIX_IP}/${BGP_PEER1_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.448850" elapsed="0.033945"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.499695" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:17.530670" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:17.530896" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:17.499531" elapsed="0.031421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.531973" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.531335" elapsed="0.000738"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:17.532419" elapsed="0.000758"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>0</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:17.499139" elapsed="0.034178"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.534774" elapsed="0.000539"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:17.533965" elapsed="0.001518"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:17.308145" elapsed="0.227428"/>
</test>
<test id="s1-s8-t16" name="TC2_Disconnect_BGP_Peer1" line="336">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:17.542801" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:17.542531" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.544114" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.543980" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.543956" elapsed="0.000237"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.549535" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.549411" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.549392" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.550624" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:17.550219" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.551108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:17.550816" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:17.551177" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:17.551341" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:17.549840" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.557178" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.557059" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.557040" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.558435" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:17.558328" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.558310" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:17.558983" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:17.558679" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.559385" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.559169" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.591343" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:17.559931" elapsed="0.031515"/>
</kw>
<msg time="2026-05-01T00:46:17.591633" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:17.591678" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.559595" elapsed="0.032119"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:17.616314" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:17.592331" elapsed="0.024233"/>
</kw>
<msg time="2026-05-01T00:46:17.616921" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:17.617024" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.591888" elapsed="0.025265"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.617872" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.617330" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.617287" elapsed="0.000761"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.618752" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:17.618289" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.619272" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.618947" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.618921" elapsed="0.000465"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:17.619435" elapsed="0.000066"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.623161" elapsed="0.000205"/>
</kw>
<msg time="2026-05-01T00:46:17.623573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:17.621624" elapsed="0.002155"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.624193" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.624710" elapsed="0.000110"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:17.620681" elapsed="0.004300"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:17.619871" elapsed="0.005204"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:17.558023" elapsed="0.067230"/>
</kw>
<msg time="2026-05-01T00:46:17.625388" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.625473" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.557402" elapsed="0.068127"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:17.625799" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:46:17.625641" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.625615" elapsed="0.000308"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.626398" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.626760" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:17.626832" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:17.556724" elapsed="0.070215"/>
</kw>
<msg time="2026-05-01T00:46:17.627031" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:17.627074" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.551772" elapsed="0.075338"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:17.627441" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:17.627189" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:17.627172" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:17.551623" elapsed="0.075935"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:17.551423" elapsed="0.076206"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:17.549039" elapsed="0.078652"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:17.543678" elapsed="0.084067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:17.543218" elapsed="0.084571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:17.537301" elapsed="0.090539"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:17.628007" elapsed="0.000107"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:17.629239" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:17.628922" elapsed="0.000344"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:17.629423" elapsed="0.000293"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:17.628655" elapsed="0.001130"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.630691" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:19.631043" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:17.629937" elapsed="2.001171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.632291" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.631636" elapsed="0.000762"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:17.628322" elapsed="2.004241"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.646688" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-05-01T00:46:19.660173" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:19.660494" level="INFO">${output_log} = 2026-05-01 00:46:14,968 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:14,969 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:14,969 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:19.646516" elapsed="0.014047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.661721" level="INFO">2026-05-01 00:46:14,968 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:14,969 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:14,969 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:14,969 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:14,969 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:14,969 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:14,971 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:14,971 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:14,972 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:14,973 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:14,973 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:14,973 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:14,973 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:14,973 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-05-01 00:46:14,974 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:14,976 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:14,977 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:14,977 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:14,979 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:14,979 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:14,979 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:14,979 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:14,979 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,980 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:14,981 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:14,981 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:14,982 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:14,983 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:14,983 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-05-01 00:46:14,983 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-05-01 00:46:14,983 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:14,983 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:14,984 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:14,985 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:14,986 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:14,987 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-05-01 00:46:14,988 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.009179353713989258s
2026-05-01 00:46:14,988 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:14,989 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:14,989 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:16,137 INFO BGP-Thread-1 (job): ... idle for 1.147s
2026-05-01 00:46:16,137 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.147s
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,140 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-05-01 00:46:16,141 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,142 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,142 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:16,142 INFO BGP-Thread-1 (job): total_received_update_message_counter: 3
2026-05-01 00:46:16,142 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 2
2026-05-01 00:46:16,142 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:16,180 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020
2026-05-01 00:46:16,180 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,180 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,180 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020'
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,181 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,182 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.661019" elapsed="0.001555"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:19.663886" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:19.663036" elapsed="0.000984"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>tc2_${BGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:19.645943" elapsed="0.018231"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:19.665680" elapsed="0.000635"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:19.664889" elapsed="0.001611"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:17.536227" elapsed="2.130370"/>
</test>
<test id="s1-s8-t17" name="TC2_BGP_Peer2_Check_Log_For_Withdrawn_Prefixes" line="343">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:19.672371" elapsed="0.000328"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:19.671991" elapsed="0.000789"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.674271" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.674049" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.674018" elapsed="0.000362"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.679929" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.679821" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.679803" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.681024" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:19.680630" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.681534" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:19.681216" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:19.681605" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:19.681770" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:19.680234" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.687575" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.687461" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.687430" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.688847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.688740" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.688722" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:19.689370" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:19.689067" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.689796" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.689574" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.721253" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:19.690341" elapsed="0.031066"/>
</kw>
<msg time="2026-05-01T00:46:19.721638" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:19.721686" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.689982" elapsed="0.031741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.752549" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:19.722357" elapsed="0.030306"/>
</kw>
<msg time="2026-05-01T00:46:19.752890" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:19.752937" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.721933" elapsed="0.031041"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.753313" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.753063" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.753039" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.753893" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.753577" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.754287" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.754038" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.754019" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:19.754409" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.757169" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:46:19.757384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:19.756006" elapsed="0.001541"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.757834" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.758178" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:19.755297" elapsed="0.003106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:19.754738" elapsed="0.003753"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:19.688410" elapsed="0.070183"/>
</kw>
<msg time="2026-05-01T00:46:19.758704" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:19.758768" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.687807" elapsed="0.071010"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:19.759019" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:19.758906" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.758886" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.759544" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.759891" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.759964" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:19.687110" elapsed="0.072966"/>
</kw>
<msg time="2026-05-01T00:46:19.760170" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:19.760215" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.682175" elapsed="0.078079"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.760603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.760331" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.760313" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:19.682028" elapsed="0.078678"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:19.681851" elapsed="0.078888"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:19.679461" elapsed="0.081334"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:19.673633" elapsed="0.087256"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.672995" elapsed="0.087944"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:19.668174" elapsed="0.092822"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.761164" elapsed="0.000110"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.774756" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:19.787686" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:19.787782" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:19.774589" elapsed="0.013218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.788223" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.787972" elapsed="0.000298"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:19.788424" elapsed="0.000335"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:19.774136" elapsed="0.014685"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${BGP_PEER1_PREFIX_COUNT}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:19.761439" elapsed="0.027434"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.801634" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:19.838903" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:19.838995" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:19.801470" elapsed="0.037549"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.839431" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.839183" elapsed="0.000315"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:19.839651" elapsed="0.000305"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>withdrawn_prefix_received: ${BGP_PEER1_FIRST_PREFIX_IP}/${BGP_PEER1_PREFIX_LEN}</arg>
<arg>1</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:19.801018" elapsed="0.038999"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:19.840606" elapsed="0.000234"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:19.840288" elapsed="0.000615"/>
</kw>
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:19.667290" elapsed="0.173652"/>
</test>
<test id="s1-s8-t18" name="TC2_Disconnect_BGP_Peer2" line="359">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:19.844684" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:19.844403" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.845944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.845833" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.845814" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.851320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.851209" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.851191" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.852491" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:19.852097" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.852971" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:19.852680" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:19.853042" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:19.853197" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:19.851723" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.859132" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.858953" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.858935" elapsed="0.000273"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.860381" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:19.860274" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.860256" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:19.860930" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:19.860620" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.861328" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.861116" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.892124" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:19.861869" elapsed="0.030363"/>
</kw>
<msg time="2026-05-01T00:46:19.892391" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:19.892437" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.861532" elapsed="0.030961"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:19.916283" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:19.893008" elapsed="0.023376"/>
</kw>
<msg time="2026-05-01T00:46:19.916563" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:19.916609" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.892668" elapsed="0.023977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.916945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.916722" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.916703" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.917482" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:19.917168" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.917836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.917618" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.917600" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:19.917947" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.920438" elapsed="0.000158"/>
</kw>
<msg time="2026-05-01T00:46:19.920657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:19.919387" elapsed="0.001397"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.921060" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.921394" elapsed="0.000090"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:19.918779" elapsed="0.002815"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:19.918214" elapsed="0.003443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:19.859968" elapsed="0.061786"/>
</kw>
<msg time="2026-05-01T00:46:19.921845" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:19.921889" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.859363" elapsed="0.062563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:19.922111" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:46:19.922002" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.921984" elapsed="0.000256"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.922680" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.923019" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:19.923090" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:19.858617" elapsed="0.064581"/>
</kw>
<msg time="2026-05-01T00:46:19.923290" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:19.923333" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.853609" elapsed="0.069761"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:19.923722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:19.923446" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:19.923428" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:19.853461" elapsed="0.070362"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:19.853275" elapsed="0.070576"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:19.850850" elapsed="0.073055"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:19.845543" elapsed="0.078416"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:19.845095" elapsed="0.078908"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:19.841748" elapsed="0.082307"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:19.924213" elapsed="0.000104"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:19.925424" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:19.925120" elapsed="0.000345"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:19.925623" elapsed="0.000198"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:19.924855" elapsed="0.001033"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:21.926674" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:21.927018" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:19.926038" elapsed="2.001044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:21.928305" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:21.927635" elapsed="0.000776"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:19.924542" elapsed="2.004037"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:21.943008" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-05-01T00:46:21.956617" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:21.956768" level="INFO">${output_log} = 2026-05-01 00:46:16,111 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:16,111 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:16,111 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:21.942863" elapsed="0.013944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:21.957487" level="INFO">2026-05-01 00:46:16,111 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:16,111 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:16,111 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:16,111 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:16,111 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:16,111 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:16,113 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:16,114 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-05-01 00:46:16,114 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-05-01 00:46:16,116 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:16,116 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,116 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:16,116 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:16,117 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:16,119 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:16,119 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:16,120 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:16,122 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:16,122 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:16,123 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:16,124 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:16,125 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-05-01 00:46:16,126 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-05-01 00:46:16,126 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:16,126 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,126 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,127 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:16,128 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:16,129 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:16,130 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-05-01 00:46:16,130 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-05-01 00:46:16,130 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:16,130 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.011215448379516602s
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:16,131 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:16,132 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,132 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,133 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010000'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010000'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.0/28']
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.0/28
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,134 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010010'
2026-05-01 00:46:16,135 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010010'
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.16/28']
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.16/28
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:16,136 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:16,137 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010020'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:46:16,138 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010020'
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.32/28']
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.32/28
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:16,139 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:17,650 INFO BGP-Thread-1 (job): ... idle for 1.511s
2026-05-01 00:46:17,650 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.511s
2026-05-01 00:46:17,650 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000
2026-05-01 00:46:17,650 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:17,650 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000'
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:17,651 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010000'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010000'
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.0/28']
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.0/28
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:17,652 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010'
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:17,653 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010010'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010010'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.16/28']
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.16/28
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:17,654 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020'
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:46:17,655 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010020'
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010020'
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.32/28']
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.32/28
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:17,656 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:17,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 7
2026-05-01 00:46:17,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:46:17,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 3
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:21.957061" elapsed="0.001081"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:21.958981" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:21.958444" elapsed="0.000618"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>tc2_${BGP_PEER2_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:21.942421" elapsed="0.016732"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:21.960100" elapsed="0.000393"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:21.959631" elapsed="0.000957"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:19.841231" elapsed="2.119415"/>
</test>
<test id="s1-s8-t19" name="TC_2_Check_for_Empty_IPv4_Topology" line="366">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:21.966181" elapsed="0.000345"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:21.965783" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:21.968225" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:21.968034" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:21.968002" elapsed="0.000336"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:21.973711" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:21.973603" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:21.973584" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:21.974812" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:21.974398" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:21.975297" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:21.975005" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:21.975366" elapsed="0.000061"/>
</return>
<msg time="2026-05-01T00:46:21.975580" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:21.974017" elapsed="0.001588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:21.981398" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:21.981288" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:21.981270" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:21.982700" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:21.982593" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:21.982575" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:21.983233" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:21.982923" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:21.983699" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:21.983472" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.012942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:21.984225" elapsed="0.028919"/>
</kw>
<msg time="2026-05-01T00:46:22.013360" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:22.013407" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:21.983888" elapsed="0.029556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.038883" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "2 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:22.014128" elapsed="0.024938"/>
</kw>
<msg time="2026-05-01T00:46:22.039273" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:22.039405" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "2 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.013710" elapsed="0.025788"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.039928" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.039616" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.039584" elapsed="0.000431"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.040556" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "2 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.040164" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.040914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.040696" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.040677" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:22.041032" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:22.043750" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:46:22.043963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.042644" elapsed="0.001455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.044373" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.044728" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:22.041978" elapsed="0.002936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:22.041378" elapsed="0.003602"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:21.982265" elapsed="0.062815"/>
</kw>
<msg time="2026-05-01T00:46:22.045175" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.045220" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "2 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:21.981645" elapsed="0.063614"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:22.045528" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:46:22.045336" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.045318" elapsed="0.000305"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.046049" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.046403" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.046490" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:21.980942" elapsed="0.065662"/>
</kw>
<msg time="2026-05-01T00:46:22.046700" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.046744" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "2 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:21.975994" elapsed="0.070790"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.047114" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.046860" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.046842" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:21.975845" elapsed="0.071370"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:21.975665" elapsed="0.071585"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:21.973223" elapsed="0.074086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:21.967574" elapsed="0.079795"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:21.966847" elapsed="0.080658"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:21.961806" elapsed="0.085759"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:22.054793" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.055044" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:22.055273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:22.048748" elapsed="0.006584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.062199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.056511" elapsed="0.005783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.067943" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.062647" elapsed="0.005390"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:22.068336" elapsed="0.003272"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:46:22.048373" elapsed="0.023329"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:22.047748" elapsed="0.024034"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:22.072688" elapsed="0.000358"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:22.072204" elapsed="0.000934"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:21.961098" elapsed="0.112100"/>
</test>
<test id="s1-s8-t20" name="TC2_Delete_BGP_Peers_Configuration" line="374">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:22.077814" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:22.077429" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.079698" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.079527" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.079447" elapsed="0.000361"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.086021" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.085907" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.085888" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.087135" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.086736" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.087684" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:22.087330" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:22.087756" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:46:22.087923" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.086331" elapsed="0.001616"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.093986" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.093869" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.093848" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.095302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.095194" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.095176" elapsed="0.000327"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:22.095989" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.095662" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.096405" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:22.096182" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.124058" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:22.096965" elapsed="0.027210"/>
</kw>
<msg time="2026-05-01T00:46:22.124350" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:22.124397" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.096622" elapsed="0.027811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.149378" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:22.125004" elapsed="0.024511"/>
</kw>
<msg time="2026-05-01T00:46:22.149686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:22.149731" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.124645" elapsed="0.025123"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.150122" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.149864" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.149836" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.150715" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.150361" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.151094" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.150858" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.150840" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:22.151212" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:22.153886" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:46:22.154095" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.152830" elapsed="0.001402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.154526" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.154865" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:22.152166" elapsed="0.002885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:22.151592" elapsed="0.003523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:22.094890" elapsed="0.060322"/>
</kw>
<msg time="2026-05-01T00:46:22.155308" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.155352" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.094224" elapsed="0.061167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:22.155618" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:22.155505" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.155471" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.156124" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.156564" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.156636" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:22.093502" elapsed="0.063248"/>
</kw>
<msg time="2026-05-01T00:46:22.156845" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.156888" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "2 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.088338" elapsed="0.068587"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.157261" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.157002" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.156984" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:22.088191" elapsed="0.069171"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:22.088006" elapsed="0.069389"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:22.085533" elapsed="0.071937"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:22.079081" elapsed="0.078451"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.078425" elapsed="0.079154"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:22.074312" elapsed="0.083321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.158351" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.157812" elapsed="0.000568"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.214654" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.214021" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.216080" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.215474" elapsed="0.000772">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.216497" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.214969" elapsed="0.001587"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.217838" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.216937" elapsed="0.000963"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.218601" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:22.218916" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:22.218264" elapsed="0.000711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.219963" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.219329" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.222265" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.221697" elapsed="0.000669"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.223331" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.222751" elapsed="0.000790"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.225053" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.224369" elapsed="0.000741"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.226910" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.226265" elapsed="0.000701"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.227080" elapsed="0.000075"/>
</return>
<msg time="2026-05-01T00:46:22.227433" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.225558" elapsed="0.001958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.227924" elapsed="0.000521"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:22.224063" elapsed="0.004503"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.229256" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.228963" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.230008" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.229800" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.230082" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.230234" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.229482" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.230411" elapsed="0.050419"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:46:22.228820" elapsed="0.052095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.281702" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.281280" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.282570" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.282326" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.282652" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:46:22.282836" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.281967" elapsed="0.000893"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.283020" elapsed="0.000225"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:46:22.281075" elapsed="0.002212"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.283947" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.283572" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.284726" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.284513" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.284801" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.284952" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.284171" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.285129" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.283407" elapsed="0.001980"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.223663" elapsed="0.061760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.285486" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:22.285649" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:22.220956" elapsed="0.064719"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.220230" elapsed="0.065478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.285898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.285740" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.220181" elapsed="0.065793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.286816" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.286123" elapsed="0.000798"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.286974" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.213097" elapsed="0.074007"/>
</kw>
<msg time="2026-05-01T00:46:22.287161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.194605" elapsed="0.092608"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.300629" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.313773" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.326884" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.327118" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.327308" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.327771" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.327611" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:22.327592" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.328005" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.328175" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.328341" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:22.327537" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.327394" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.328596" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.328678" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:46:22.328847" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.188185" elapsed="0.140691"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.330213" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.329904" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:22.344623" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.344674" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.344793" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:22.332558" elapsed="0.012261"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.330339" elapsed="0.014520"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.345041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.344886" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.330321" elapsed="0.014802"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.348736" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.346158" elapsed="0.002622"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.345931" elapsed="0.002889"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.345913" elapsed="0.002948"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.353002" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.349270" elapsed="0.003799"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.348942" elapsed="0.004178"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.348918" elapsed="0.004238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.354026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.353419" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.354544" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.354169" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.355351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.354914" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.354666" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.354144" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.356302" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.355769" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.356659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.356405" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.357192" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.356901" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.356739" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.356387" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.357435" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:22.358273" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.357969" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.358473" elapsed="0.002654"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:22.345516" elapsed="0.015675"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:22.361287" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:46:22.363750" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:22.329234" elapsed="0.034544"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.363833" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:22.158629" elapsed="0.205334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.364694" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.364142" elapsed="0.000580"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.417823" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.417316" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.418712" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.418416" elapsed="0.000381">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.418894" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.418053" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.419501" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.419090" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.419855" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:22.420037" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:22.419709" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.420489" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.420226" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.421637" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.421359" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.422111" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.421843" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.422837" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.422536" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.423625" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.423383" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.423739" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:46:22.423913" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.423056" elapsed="0.000882"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.424096" elapsed="0.000249"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:22.422378" elapsed="0.002008"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.425172" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.424657" elapsed="0.000541"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.426009" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.425728" elapsed="0.000307"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.426085" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.426237" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.425389" elapsed="0.000872"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.426413" elapsed="0.000239"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:46:22.424521" elapsed="0.002173"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.427238" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.426943" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.428014" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.427803" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.428089" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.428239" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.427466" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.428417" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:46:22.426807" elapsed="0.001892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.429239" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.428947" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.429995" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.429789" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.430070" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:22.430219" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.429466" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.430396" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.428811" elapsed="0.001861"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.422191" elapsed="0.008516"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.430751" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:46:22.430908" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:22.421033" elapsed="0.009900"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.420634" elapsed="0.010331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.431143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.430991" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.420603" elapsed="0.010616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.432038" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.431367" elapsed="0.000699"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.432114" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.416422" elapsed="0.015817"/>
</kw>
<msg time="2026-05-01T00:46:22.432293" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.395644" elapsed="0.036701"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.445742" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.459097" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.472253" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.472471" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.472652" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.473024" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.472876" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:22.472862" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.473245" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.473418" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.473602" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:22.472832" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.472729" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.473832" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.473908" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:22.474033" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.391017" elapsed="0.083043"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.475162" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.474916" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:22.488425" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.488577" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.488778" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:22.477445" elapsed="0.011390"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.475275" elapsed="0.013648"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.489324" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.488980" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.475258" elapsed="0.014361"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.497683" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.491986" elapsed="0.005794"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.491358" elapsed="0.006500"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.491319" elapsed="0.006595"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.502046" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.498567" elapsed="0.003524"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.498038" elapsed="0.004087"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.498001" elapsed="0.004149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.502732" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.502338" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.503069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.502830" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.503625" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.503315" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.503149" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.502812" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.504247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.503887" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.504593" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.504342" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.505125" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.504835" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.504673" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.504324" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.505362" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:22.506163" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.505887" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.506343" elapsed="0.002645"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:22.490424" elapsed="0.018628"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:22.509097" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.511505" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:46:22.474327" elapsed="0.037206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.511585" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:46:22.364961" elapsed="0.146775"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:22.512347" elapsed="0.000284"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:22.512028" elapsed="0.000666"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:22.073601" elapsed="0.439133"/>
</test>
<test id="s1-s8-t21" name="TC3_Configure_Two_iBGP_Non_Client_Peers" line="396">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:22.516106" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:22.515840" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.517399" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.517240" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.517222" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.522749" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.522642" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.522624" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.523846" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.523421" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.524334" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:22.524036" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:22.524405" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.524577" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.523044" elapsed="0.001558"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.530503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.530381" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.530362" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.531786" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:22.531649" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.531631" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:22.532303" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.532002" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.532728" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:22.532509" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.561430" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:22.533251" elapsed="0.028297"/>
</kw>
<msg time="2026-05-01T00:46:22.561711" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:22.561756" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.532913" elapsed="0.028880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:22.613754" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "N "o "n "_ "C "l "i "e "n "t "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:22.562308" elapsed="0.051552"/>
</kw>
<msg time="2026-05-01T00:46:22.614019" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:22.614065" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.561966" elapsed="0.052135"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.614402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.614177" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.614158" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.614950" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "N "o "n "_ "C "l "i "e "n "t "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.614655" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.615301" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.615086" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.615068" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:22.615418" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:22.617935" elapsed="0.000139"/>
</kw>
<msg time="2026-05-01T00:46:22.618134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.616912" elapsed="0.001349"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.618562" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.618900" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:22.616240" elapsed="0.002846"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:22.615699" elapsed="0.003452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:22.531321" elapsed="0.087927"/>
</kw>
<msg time="2026-05-01T00:46:22.619339" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.619383" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.530725" elapsed="0.088695"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:22.619622" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:22.619516" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.619497" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.620135" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.620484" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.620557" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:22.530043" elapsed="0.090622"/>
</kw>
<msg time="2026-05-01T00:46:22.620757" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:22.620801" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.524968" elapsed="0.095869"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.621161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.620912" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.620895" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:22.524823" elapsed="0.096438"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:22.524654" elapsed="0.096635"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:22.522267" elapsed="0.099076"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:22.516955" elapsed="0.104443"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:22.516532" elapsed="0.104910"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:22.513552" elapsed="0.107960"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.622480" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ibgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENC...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ibgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.621680" elapsed="0.000831"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.658138" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.657767" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.658941" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.658719" elapsed="0.000288">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.659101" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.658367" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.659688" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.659292" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.660038" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:22.660170" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:22.659903" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.660621" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.660358" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.661632" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.661348" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.662098" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.661839" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.662899" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.662595" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.663800" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.663433" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.663879" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.664032" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.663114" elapsed="0.000943"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.664211" elapsed="0.000226"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:22.662351" elapsed="0.002142"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.665042" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.664746" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.665944" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.665733" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.666021" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.666174" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.665254" elapsed="0.000945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.666353" elapsed="0.000240"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:46:22.664609" elapsed="0.002024"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.667177" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.666883" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.667966" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.667728" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.668041" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.668228" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.667390" elapsed="0.000864"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.668409" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:46:22.666746" elapsed="0.001942"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.669232" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.668936" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.669990" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.669782" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.670065" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.670215" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.669460" elapsed="0.000780"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.670394" elapsed="0.000235"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:22.668800" elapsed="0.001869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.671214" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.670920" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.671979" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.671758" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.672054" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.672205" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.671425" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.672381" elapsed="0.000236"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:22.670785" elapsed="0.001872"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.673196" level="INFO">${value} = ibgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.672903" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.673945" level="INFO">${encoded} = ibgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.673740" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.674019" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.674169" level="INFO">${encoded_value} = ibgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.673407" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.674347" elapsed="0.000236"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-05-01T00:46:22.672770" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.675167" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.674870" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.676122" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.675712" elapsed="0.000437"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.676199" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.676350" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.675378" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.676543" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:22.674736" elapsed="0.002069"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.677346" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.677053" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.678099" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.677893" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.678173" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.678323" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.677577" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.678558" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.676918" elapsed="0.001904"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.679364" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.679070" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.680129" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.679922" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.680203" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.680353" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.679593" elapsed="0.000784"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.680546" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:22.678935" elapsed="0.001872"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.681346" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.681054" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.682099" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.681891" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.682174" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.682324" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.681574" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.682517" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.680919" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.683326" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.683030" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.684115" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.683902" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.684191" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.684343" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.683556" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.684536" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.682895" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.685342" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.685048" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.686122" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.685888" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.686198" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.686347" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.685571" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.686539" elapsed="0.000222"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:22.684913" elapsed="0.001888"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.662170" elapsed="0.024666"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.686878" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:22.687039" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:22.661024" elapsed="0.026041"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.660733" elapsed="0.026364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.687271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.687121" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.660715" elapsed="0.026675"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.688515" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.687559" elapsed="0.000985"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.688594" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.657137" elapsed="0.031583"/>
</kw>
<msg time="2026-05-01T00:46:22.688773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.643696" elapsed="0.045124"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.702184" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.715328" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.728532" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.728725" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.728903" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.729266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.729122" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:22.729107" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.729503" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.729674" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.729841" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:22.729078" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.728978" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.730066" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.730143" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:22.730266" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.639203" elapsed="0.091091"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.758343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.757969" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.759095" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.758883" elapsed="0.000276">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.759251" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.758550" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.759865" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.759439" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.760193" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:22.760318" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:22.760059" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.760758" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.760518" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:22.761174" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.760883" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.761721" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.761408" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.761257" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.760865" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.762771" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.761953" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.762852" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.757340" elapsed="0.005638"/>
</kw>
<msg time="2026-05-01T00:46:22.763035" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.743909" elapsed="0.019173"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.776557" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.789728" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.802992" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.803191" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.803370" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.803751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.803606" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:22.803592" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.804006" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.804174" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.804341" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:22.803563" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.803444" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.804584" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.804662" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:22.804795" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.741120" elapsed="0.063704"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.806064" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.805833" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.806217" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.805494" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.806577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.806313" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.807115" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.806824" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.806658" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.806295" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.809717" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.807387" elapsed="0.002357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:22.809796" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.809950" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:22.805155" elapsed="0.004820"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.811354" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.811104" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.811807" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.811570" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.812305" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.812062" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.812753" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.812516" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:22.813607" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:22.813403" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:22.813957" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:22.813787" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.814132" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.814742" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.814496" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:22.814827" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.814983" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:22.813000" elapsed="0.002008"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:22.847932" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1075', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:22.848150" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:22.848377" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:22.818317" elapsed="0.030118"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.815078" elapsed="0.033492"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.848980" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.848630" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.815061" elapsed="0.034115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.855316" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.851329" elapsed="0.004050"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.850833" elapsed="0.004597"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.850793" elapsed="0.004693"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.859388" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.855892" elapsed="0.003578"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.855566" elapsed="0.003956"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.855543" elapsed="0.004013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.860349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.859789" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.860733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.860492" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.861281" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.860982" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.860816" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.860472" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.861908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.861544" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.862241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.862005" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.862799" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.862506" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.862322" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.861987" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.863030" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:22.863820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.863550" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.864013" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:22.850005" elapsed="0.016563"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:22.866742" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:22.866636" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.866617" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.866977" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.867045" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:22.869588" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:22.810305" elapsed="0.059312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.869718" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.869876" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:22.627570" elapsed="0.242331"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.870239" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.869999" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.869982" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.870365" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:22.622796" elapsed="0.247709"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.871464" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ibgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENC...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ibgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.870675" elapsed="0.000820"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.907026" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:22.906653" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.907773" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:22.907567" elapsed="0.000268">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:22.907958" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:22.907219" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.908547" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:22.908149" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:22.908867" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:22.908989" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:22.908736" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.909412" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.909171" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.910411" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:22.910155" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.910891" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.910634" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.911587" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.911281" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.912340" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.912130" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.912468" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:46:22.912625" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.911800" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.912803" elapsed="0.000222"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:46:22.911146" elapsed="0.001919"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.913627" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.913312" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.914365" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.914155" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.914440" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:46:22.914610" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.913840" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.914788" elapsed="0.000221"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:46:22.913178" elapsed="0.001870"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.915605" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.915296" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.916538" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.916312" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.916613" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.916764" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.915991" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.916942" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:46:22.915161" elapsed="0.002041"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.917760" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.917464" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.918515" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.918291" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.918590" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.918739" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.917973" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.918918" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:46:22.917314" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.919738" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.919426" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.920526" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.920301" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.920602" elapsed="0.000159"/>
</return>
<msg time="2026-05-01T00:46:22.920883" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.919977" elapsed="0.000930"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.921061" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:46:22.919290" elapsed="0.002034"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.921887" level="INFO">${value} = ibgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.921589" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.922646" level="INFO">${encoded} = ibgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.922421" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.922767" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:46:22.922921" level="INFO">${encoded_value} = ibgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.922102" elapsed="0.000844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.923100" elapsed="0.000222"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-05-01T00:46:22.921437" elapsed="0.001926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.923949" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.923630" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.924715" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.924506" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.924791" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:22.924940" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.924166" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.925117" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:22.923493" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.925941" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.925646" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.926698" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.926488" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.926773" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.926925" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.926155" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.927102" elapsed="0.000429"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.925511" elapsed="0.002063"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.928229" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.927828" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.929002" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.928793" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.929076" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.929225" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.928469" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.929402" elapsed="0.000238"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:46:22.927689" elapsed="0.001992"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.930222" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.929929" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.930974" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.930767" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.931048" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:46:22.931196" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.930433" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.931376" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.929794" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.932212" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.931915" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.932968" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.932759" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.933083" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:22.933238" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.932425" elapsed="0.000838"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.933419" elapsed="0.000241"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:46:22.931768" elapsed="0.001933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.934246" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:46:22.933951" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:46:22.935001" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.934794" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:46:22.935076" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:22.935225" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:46:22.934474" elapsed="0.000775"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:22.935402" elapsed="0.000237"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:46:22.933815" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.910963" elapsed="0.024752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:46:22.935757" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:46:22.936042" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:46:22.909832" elapsed="0.026255"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:22.909540" elapsed="0.026587"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.936325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.936152" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:22.909522" elapsed="0.026881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:22.937332" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:22.936572" elapsed="0.000790"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:22.937415" elapsed="0.000050"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:22.906021" elapsed="0.031543"/>
</kw>
<msg time="2026-05-01T00:46:22.937618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.892548" elapsed="0.045116"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.951052" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.964194" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.977362" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.977611" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.977790" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.978158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:22.978013" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:22.977998" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.978385" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.978575" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.978745" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:22.977968" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.977865" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:22.978974" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:22.979050" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:22.979172" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.888019" elapsed="0.091179"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.007131" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.006756" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:23.008050" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:23.007792" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:23.008208" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:23.007435" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.008799" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:23.008399" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:23.009124" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:46:23.009259" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:46:23.008990" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.009706" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.009460" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:46:23.010179" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.009880" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.010734" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'P...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.010418" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.010264" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.009861" elapsed="0.000958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.011784" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:23.010968" elapsed="0.000847"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:46:23.011866" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:23.006111" elapsed="0.005897"/>
</kw>
<msg time="2026-05-01T00:46:23.012067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:22.992683" elapsed="0.019431"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.025723" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.039012" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.052175" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.052374" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.052566" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.052933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.052786" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:46:23.052772" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.053157" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.053331" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.053514" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:46:23.052743" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.052642" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.053781" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.053861" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:46:23.053996" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:46:22.989906" elapsed="0.064119"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:46:23.055280" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:46:23.055050" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:46:23.055435" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:46:23.054710" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.055794" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.055547" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.056344" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.056053" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.055875" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.055528" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.058895" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:23.056595" elapsed="0.002326"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:46:23.058973" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:23.059127" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:46:23.054358" elapsed="0.004793"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.060564" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.060301" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.060999" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.060764" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.061461" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.061209" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.061896" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.061659" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:23.062742" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:46:23.062555" elapsed="0.000213"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:46:23.063092" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:46:23.062923" elapsed="0.000194"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:46:23.063304" elapsed="0.000217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.063927" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.063681" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:46:23.064026" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:23.064183" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:46:23.062138" elapsed="0.002070"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:23.087051" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1075', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:46:23.087195" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:23.087393" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:23.066667" elapsed="0.020823"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.064283" elapsed="0.023313"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.088048" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.087657" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.064260" elapsed="0.023989"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.096091" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.090384" elapsed="0.005805"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.089891" elapsed="0.006376"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.089852" elapsed="0.006472"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.099085" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.096629" elapsed="0.002502"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.096390" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.096373" elapsed="0.002817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.099739" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:23.099354" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.100089" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.099836" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.100652" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.100339" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.100176" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.099818" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.101259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:23.100897" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.101612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.101355" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.102191" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.101896" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:46:23.101724" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.101337" elapsed="0.000938"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:23.102428" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:46:23.103226" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:23.102956" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:46:23.103407" elapsed="0.002525"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:46:23.089077" elapsed="0.016918"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:46:23.106167" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:23.106062" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.106043" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.106404" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.106488" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:46:23.108951" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:46:23.059490" elapsed="0.049489"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:23.109043" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:46:23.109196" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:46:22.876348" elapsed="0.232874"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.109572" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.109318" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.109301" elapsed="0.000364"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:46:23.109699" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:46:22.871782" elapsed="0.238040"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:23.110406" elapsed="0.000263"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:23.110101" elapsed="0.000631"/>
</kw>
<doc>Configure iBGP peers: 1st one as RR client, 2nd one as RR non-client.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:22.512967" elapsed="0.597803"/>
</test>
<test id="s1-s8-t22" name="TC3_Connect_BGP_Peer1" line="434">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:23.114234" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:23.113968" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.115504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:23.115376" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.115357" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.120941" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:23.120834" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.120816" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.122010" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:23.121634" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.122548" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:23.122197" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:23.122619" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:46:23.122775" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:23.121237" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.128609" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:23.128500" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.128480" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.129839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:23.129734" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.129716" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:23.130352" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:23.130053" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:23.130772" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:23.130557" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:23.161968" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:23.131296" elapsed="0.030802"/>
</kw>
<msg time="2026-05-01T00:46:23.162291" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:23.162337" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:23.130961" elapsed="0.031413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:23.195812" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:23.162946" elapsed="0.032968"/>
</kw>
<msg time="2026-05-01T00:46:23.196102" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:23.196153" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:23.162590" elapsed="0.033600"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.196548" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.196271" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.196248" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.197072" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.196777" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.197419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.197203" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.197185" elapsed="0.000502"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:23.197721" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:23.200190" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:46:23.200390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:23.199135" elapsed="0.001412"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.200825" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.201159" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:23.198521" elapsed="0.002822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:23.197982" elapsed="0.003425"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:23.129410" elapsed="0.072155"/>
</kw>
<msg time="2026-05-01T00:46:23.201656" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:23.201699" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:23.128836" elapsed="0.072899"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:23.201918" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:23.201812" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.201794" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.202397" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.202751" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:23.202823" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:23.128145" elapsed="0.074786"/>
</kw>
<msg time="2026-05-01T00:46:23.203023" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:23.203065" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:23.123163" elapsed="0.079938"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:23.203427" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:23.203175" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:23.203158" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:23.123018" elapsed="0.080526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:23.122850" elapsed="0.080724"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:23.120471" elapsed="0.083156"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:23.115089" elapsed="0.088593"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:23.114664" elapsed="0.089062"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:23.111521" elapsed="0.092257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:23.203937" elapsed="0.000104"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.213005" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:23.212682" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.213439" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.213194" elapsed="0.000396"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:23.217403" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-05-01T00:46:23.217510" level="INFO">${output} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:23.213745" elapsed="0.003793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.217946" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.217702" elapsed="0.000291"/>
</kw>
<arg>${BGP_PEER1_COMMAND}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:23.212285" elapsed="0.005763"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:23.225967" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:23.226199" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:46:23.226330" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:23.219257" elapsed="0.007110"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.230398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.226631" elapsed="0.003852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.234294" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:23.230708" elapsed="0.003651"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:23.238355" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:23.234600" elapsed="0.003868">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:23.218827" elapsed="0.019802">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:24.249498" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:24.249718" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:24.249902" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:24.240420" elapsed="0.009528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.253734" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.250185" elapsed="0.003615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.257623" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.254025" elapsed="0.003666"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:24.257909" elapsed="0.003658"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:24.239346" elapsed="0.022286"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:23.218212" elapsed="1.043472"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:24.262272" elapsed="0.000255"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:24.261961" elapsed="0.000629"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:23.111052" elapsed="1.151577"/>
</test>
<test id="s1-s8-t23" name="TC3_Connect_BGP_Peer2" line="446">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:24.265856" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:24.265591" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:24.267124" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:24.267008" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.266987" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:24.272705" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:24.272580" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.272562" elapsed="0.000258"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.273833" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:24.273435" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.274318" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:24.274026" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:24.274389" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:46:24.274568" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:24.273054" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:24.280367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:24.280260" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.280241" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:24.281658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:24.281550" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.281532" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:24.282177" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:24.281878" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:24.282603" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:24.282367" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:24.312314" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:24.283128" elapsed="0.029292"/>
</kw>
<msg time="2026-05-01T00:46:24.312606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:24.312663" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:24.282791" elapsed="0.029916"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:24.333531" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:24.313225" elapsed="0.020410"/>
</kw>
<msg time="2026-05-01T00:46:24.333796" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:24.333841" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:24.312882" elapsed="0.020995"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.334181" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:24.333954" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.333934" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.334895" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.334404" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.335244" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:24.335027" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.335009" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:24.335353" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:24.337862" elapsed="0.000273"/>
</kw>
<msg time="2026-05-01T00:46:24.338198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:24.336838" elapsed="0.001492"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.338772" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.339113" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:24.336184" elapsed="0.003114"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:24.335651" elapsed="0.003710"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:24.281215" elapsed="0.058272"/>
</kw>
<msg time="2026-05-01T00:46:24.339580" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:24.339624" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:24.280628" elapsed="0.059033"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:24.339844" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:24.339737" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.339719" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.340324" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.340699" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:24.340772" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:24.279923" elapsed="0.060956"/>
</kw>
<msg time="2026-05-01T00:46:24.340970" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:24.341014" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:24.274970" elapsed="0.066080"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:24.341376" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:24.341125" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:24.341108" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:24.274823" elapsed="0.066669"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:24.274649" elapsed="0.066875"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:24.272202" elapsed="0.069377"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:24.266719" elapsed="0.074915"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:24.266268" elapsed="0.075410"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:24.263284" elapsed="0.078447"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:24.341887" elapsed="0.000106"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.351220" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:24.350869" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.351682" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.351421" elapsed="0.000309"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:24.356169" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-05-01T00:46:24.356265" level="INFO">${output} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:24.351884" elapsed="0.004408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.356746" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.356472" elapsed="0.000322"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:46:24.350421" elapsed="0.006482"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:24.365791" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:24.365970" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:24.366125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:24.358150" elapsed="0.008012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.369926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.366395" elapsed="0.003595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.373928" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:24.370213" elapsed="0.003764"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:46:24.376849" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:46:24.374136" elapsed="0.002791">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:46:24.357718" elapsed="0.019323">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:46:25.388387" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:46:25.388615" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '412'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:46:25.388761" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:46:25.379141" elapsed="0.009657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.397770" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:25.389042" elapsed="0.008777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.400586" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:25.397982" elapsed="0.002654"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:46:25.400794" elapsed="0.002750"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:46:25.377992" elapsed="0.025618"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:24.357074" elapsed="1.046586"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:25.404321" elapsed="0.000265"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:25.404003" elapsed="0.000648"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:24.262836" elapsed="1.141854"/>
</test>
<test id="s1-s8-t24" name="TC3_BGP_Peer1_Check_Log_For_No_Updates" line="458">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:25.408174" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:25.407909" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:25.409491" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:25.409351" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.409329" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:25.414847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:25.414739" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.414721" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.415930" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:25.415545" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.416415" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:25.416120" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:25.416503" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:25.416668" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:25.415147" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:25.422689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:25.422580" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.422562" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:25.423942" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:25.423834" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.423817" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:25.424477" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:25.424159" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:25.424889" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:25.424668" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:25.455769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:25.425431" elapsed="0.030511"/>
</kw>
<msg time="2026-05-01T00:46:25.456147" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:25.456193" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:25.425079" elapsed="0.031151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:25.482600" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "N "o "_ "U "p "d "a "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:25.456895" elapsed="0.025819"/>
</kw>
<msg time="2026-05-01T00:46:25.482873" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:25.482918" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:25.456488" elapsed="0.026466"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.483337" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:25.483051" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.483026" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.484134" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "N "o "_ "U "p "d "a "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:25.483749" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.484530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:25.484285" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.484266" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:25.484649" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:25.487422" elapsed="0.000168"/>
</kw>
<msg time="2026-05-01T00:46:25.487653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:25.486276" elapsed="0.001513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.488074" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.488420" elapsed="0.000105"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:25.485622" elapsed="0.003018"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:25.484980" elapsed="0.003727"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:25.423536" elapsed="0.065273"/>
</kw>
<msg time="2026-05-01T00:46:25.488907" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:25.488953" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:25.422912" elapsed="0.066081"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:25.489185" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:46:25.489075" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.489055" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.489755" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.490135" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:25.490211" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:25.422225" elapsed="0.068100"/>
</kw>
<msg time="2026-05-01T00:46:25.490421" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:25.490493" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:25.417076" elapsed="0.073459"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:25.490869" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:25.490613" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:25.490595" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:25.416929" elapsed="0.074043"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:25.416749" elapsed="0.074257"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:25.414365" elapsed="0.076699"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:25.409042" elapsed="0.082080"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:25.408606" elapsed="0.082562"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:25.405641" elapsed="0.085580"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:25.491391" elapsed="0.000136"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>From neon onwards there is extra BGP End-Of-RIB message</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:46:25.491746" elapsed="0.000217"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.492384" level="INFO">${update_messages} = 1</msg>
<var>${update_messages}</var>
<arg>1</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:25.492125" elapsed="0.000285"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:25.506256" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:25.519710" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:25.519923" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:25.506089" elapsed="0.013888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.520958" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:25.520346" elapsed="0.000710"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:25.522261" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:25.521481" elapsed="0.000931">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:25.505670" elapsed="0.017015">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:26.542556" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:26.556214" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:26.556480" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:26.542335" elapsed="0.014206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:26.557590" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:26.556930" elapsed="0.000762"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:26.558880" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:26.558037" elapsed="0.001017">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:26.541802" elapsed="0.017489">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:27.580217" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:27.593348" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:27.593614" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:27.580012" elapsed="0.013659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:27.594720" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:27.594060" elapsed="0.000761"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:27.596003" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:27.595163" elapsed="0.000992">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:27.579433" elapsed="0.016959">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:28.619322" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:28.632125" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:28.632247" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:28.619108" elapsed="0.013165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:28.632833" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:28.632490" elapsed="0.000389"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:28.633414" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:28.633035" elapsed="0.000482">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:28.618506" elapsed="0.015138">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:29.652367" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:29.665599" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:29.665861" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:29.652168" elapsed="0.013750"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:29.667083" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:29.666374" elapsed="0.000810"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:29.668359" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:29.667559" elapsed="0.000985">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:29.651623" elapsed="0.017297">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:30.690532" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:30.703667" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:30.703890" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:30.690323" elapsed="0.013629"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:30.705002" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:30.704336" elapsed="0.000768"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:30.706295" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:30.705484" elapsed="0.000962">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:30.689800" elapsed="0.016916">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:31.729102" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:31.742490" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:31.742723" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:31.728912" elapsed="0.013867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:31.743816" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:31.743162" elapsed="0.000754"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:31.745077" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:31.744258" elapsed="0.000970">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:31.728395" elapsed="0.017097">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:32.765500" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:32.779063" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:32.779293" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:32.765301" elapsed="0.014051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:32.780383" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:32.779773" elapsed="0.000746"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:32.781672" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:32.780861" elapsed="0.000961">0 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:32.764817" elapsed="0.017234">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:33.802573" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:33.815758" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:33.815991" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:33.802344" elapsed="0.013702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:33.817193" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:33.816433" elapsed="0.000862"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:33.818551" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:33.817674" elapsed="0.001039">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:33.801746" elapsed="0.017207">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:34.840807" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:34.853961" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:34.854161" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:34.840548" elapsed="0.013663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:34.855085" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:34.854568" elapsed="0.000603"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:34.856138" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:34.855492" elapsed="0.000771">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:34.839841" elapsed="0.016659">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:35.875373" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:35.888964" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:35.889236" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:35.875064" elapsed="0.014234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:35.890395" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:35.889741" elapsed="0.000794"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:35.891774" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:35.890908" elapsed="0.001023">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:35.874557" elapsed="0.017618">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:36.911071" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:36.923981" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:36.924167" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:36.910853" elapsed="0.013366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:36.925102" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:36.924577" elapsed="0.000614"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:36.926092" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:36.925445" elapsed="0.000771">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:36.910330" elapsed="0.016080">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:37.948218" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:37.961004" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:37.961254" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:37.948048" elapsed="0.013267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:37.962499" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:37.961822" elapsed="0.000787"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:37.963838" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:37.962980" elapsed="0.001010">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:37.947604" elapsed="0.016626">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:38.982556" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:38.996088" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:38.996307" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:38.982369" elapsed="0.013995"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:38.997389" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:38.996779" elapsed="0.000742"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:38.998665" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:38.997870" elapsed="0.000934">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:38.981927" elapsed="0.017106">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:40.020291" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:40.033432" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:40.033595" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:40.020124" elapsed="0.013506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:40.034365" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:40.033863" elapsed="0.000631"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:40.035636" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:40.034844" elapsed="0.000929">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:40.019702" elapsed="0.016294">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:41.055108" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:41.068526" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:41.068768" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:41.054925" elapsed="0.013901"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:41.069998" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:41.069334" elapsed="0.000768"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:41.071264" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:41.070477" elapsed="0.000930">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:41.054422" elapsed="0.017248">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:42.091171" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:42.105090" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:42.105325" level="INFO">${output_log} = 1</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:42.090978" elapsed="0.014408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:42.106646" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:42.105849" elapsed="0.000909"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:42.107971" level="FAIL">1 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:42.107145" elapsed="0.000978">1 != 2</status>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:42.090494" elapsed="0.017861">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:43.122652" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:43.744143" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:43.744592" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:43.122417" elapsed="0.622242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:43.746043" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:43.745214" elapsed="0.000939"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:46:43.746554" elapsed="0.000784"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:46:43.121799" elapsed="0.625739"/>
</kw>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>2</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:25.492594" elapsed="18.255080"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:43.749275" elapsed="0.000650"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:43.748484" elapsed="0.001596"/>
</kw>
<doc>Check for no updates received by iBGP peer No. 1</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:25.405032" elapsed="18.345141"/>
</test>
<test id="s1-s8-t25" name="TC3_Disconnect_BGP_Peer1" line="472">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:43.756250" elapsed="0.000309"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:43.755877" elapsed="0.000759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:43.758126" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:43.757925" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.757891" elapsed="0.000349"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:43.765288" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:43.765175" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.765155" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:43.766429" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:43.766011" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:43.766934" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:43.766639" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:43.767004" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:46:43.767191" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:43.765618" elapsed="0.001598"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:43.773177" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:43.773067" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.773048" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:43.774438" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:43.774331" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.774313" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:43.774991" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:43.774684" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:43.775440" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:43.775213" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:43.803844" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:43.775991" elapsed="0.027980"/>
</kw>
<msg time="2026-05-01T00:46:43.804159" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:43.804206" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:43.775651" elapsed="0.028593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:43.828918" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:43.804859" elapsed="0.024165"/>
</kw>
<msg time="2026-05-01T00:46:43.829187" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:43.829234" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:43.804447" elapsed="0.024825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.829649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:43.829366" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.829339" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:43.830200" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:43.829885" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.830571" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:43.830337" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.830319" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:43.830689" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:43.833420" elapsed="0.000176"/>
</kw>
<msg time="2026-05-01T00:46:43.833658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:43.832279" elapsed="0.001516"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.834077" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.834590" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:43.831626" elapsed="0.003152"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:43.831033" elapsed="0.003811"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:43.774029" elapsed="0.060912"/>
</kw>
<msg time="2026-05-01T00:46:43.835060" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:43.835108" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:43.773403" elapsed="0.061749"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:43.835400" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:43.835290" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.835270" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.835924" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.836271" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:43.836343" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:43.772725" elapsed="0.063744"/>
</kw>
<msg time="2026-05-01T00:46:43.836567" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:43.836612" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:43.767636" elapsed="0.069013"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:43.836994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:43.836739" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:43.836708" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:43.767485" elapsed="0.069609"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:43.767279" elapsed="0.069850"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:43.764797" elapsed="0.072390"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:43.757497" elapsed="0.079748"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:43.756852" elapsed="0.080440"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:43.752167" elapsed="0.085181"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:43.837589" elapsed="0.000112"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:46:43.838845" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:46:43.838527" elapsed="0.000345"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:43.839037" elapsed="0.000294"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:46:43.838240" elapsed="0.001162"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.840398" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:46:45.840810" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:46:43.839576" elapsed="2.001300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.842121" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:45.841382" elapsed="0.000852"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:46:43.837915" elapsed="2.004453"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.859909" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-05-01T00:46:45.873105" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:45.873320" level="INFO">${output_log} = 2026-05-01 00:46:23,291 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:23,291 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:23,291 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:45.859750" elapsed="0.013629"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.874356" level="INFO">2026-05-01 00:46:23,291 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:23,291 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:46:23,291 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:23,291 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:23,292 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:23,292 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-05-01 00:46:23,295 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:23,296 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:23,296 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-05-01 00:46:23,297 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:23,300 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:23,301 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,301 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,302 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:23,303 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:23,305 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:23,305 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-05-01 00:46:23,305 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-05-01 00:46:23,305 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:23,305 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:23,307 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:23,307 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:23,307 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:23,307 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:23,308 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:23,309 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:23,310 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:23,310 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-05-01 00:46:23,310 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.008958816528320312s
2026-05-01 00:46:23,310 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:23,311 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:23,311 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:23,312 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:23,312 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:46:23,312 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:23,312 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:23,313 INFO BGP-Thread-1 (job): ... idle for 0.001s
2026-05-01 00:46:23,313 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.001s
2026-05-01 00:46:23,313 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:23,313 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:23,314 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:33,324 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:46:33,325 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.011s
2026-05-01 00:46:33,325 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:46:33,325 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:33,325 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:43,331 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-05-01 00:46:43,331 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.017s
2026-05-01 00:46:43,331 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:46:43,331 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:43,331 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:45.873789" elapsed="0.001155"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:46:45.876184" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc3_bgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc3_bgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:46:45.875373" elapsed="0.000936"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>tc3_${BGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:46:45.859316" elapsed="0.017129"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:46:45.877815" elapsed="0.000549"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:46:45.877091" elapsed="0.001457"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:43.750933" elapsed="2.127704"/>
</test>
<test id="s1-s8-t26" name="TC3_BGP_Peer2_Check_Log_For_No_Updates" line="479">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:46:45.885584" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:46:45.885296" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:45.886908" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:45.886771" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.886747" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:45.892284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:45.892176" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.892158" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.893367" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:46:45.892985" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.893873" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:46:45.893578" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:46:45.893947" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:46:45.894112" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:46:45.892603" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:45.900089" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:45.899971" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.899951" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:46:45.901365" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:46:45.901257" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.901239" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:46:45.901913" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:46:45.901610" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.902316" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:45.902100" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.932138" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:46:45.902872" elapsed="0.029509"/>
</kw>
<msg time="2026-05-01T00:46:45.932813" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:46:45.932923" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:45.902524" elapsed="0.030484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.958731" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "N "o "_ "U "p "d "a "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:46:45.934320" elapsed="0.024522"/>
</kw>
<msg time="2026-05-01T00:46:45.959004" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:46:45.959101" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:45.933441" elapsed="0.025701"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.959473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:45.959222" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.959202" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.960026" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "N "o "_ "U "p "d "a "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:45.959724" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.960386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:45.960167" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.960149" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:46:45.960517" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:45.962971" elapsed="0.000139"/>
</kw>
<msg time="2026-05-01T00:46:45.963171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:46:45.961952" elapsed="0.001350"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.963652" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.964014" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:46:45.961317" elapsed="0.002883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:46:45.960789" elapsed="0.003474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:46:45.900958" elapsed="0.063402"/>
</kw>
<msg time="2026-05-01T00:46:45.964471" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:45.964518" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:45.900332" elapsed="0.064224"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:46:45.964740" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:46:45.964632" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.964614" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.965224" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.965594" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:46:45.965667" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:46:45.899548" elapsed="0.066227"/>
</kw>
<msg time="2026-05-01T00:46:45.965865" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:46:45.965909" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:45.894545" elapsed="0.071401"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:46:45.966272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:46:45.966020" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:46:45.966003" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:46:45.894367" elapsed="0.072005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:46:45.894193" elapsed="0.072208"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:46:45.891816" elapsed="0.074653"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:46:45.886468" elapsed="0.080058"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:46:45.886005" elapsed="0.080603"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:46:45.880729" elapsed="0.085932"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:46:45.966823" elapsed="0.000106"/>
</kw>
<kw name="Convert Time" owner="DateTime">
<msg time="2026-05-01T00:46:45.967398" level="INFO">${log_check_timeout} = 20.0</msg>
<var>${log_check_timeout}</var>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>result_format=number</arg>
<doc>Converts between supported `time formats`.</doc>
<status status="PASS" start="2026-05-01T00:46:45.967094" elapsed="0.000331"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>From neon onwards there is extra BGP End-Of-RIB message</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:46:45.967623" elapsed="0.000227"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.968266" level="INFO">${update_messages} = 1</msg>
<var>${update_messages}</var>
<arg>1</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:46:45.968013" elapsed="0.000279"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:45.984153" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:45.997095" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:45.997301" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:45.983987" elapsed="0.013370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.998325" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:45.997763" elapsed="0.000661"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:45.999595" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:45.998803" elapsed="0.000967">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:45.983552" elapsed="0.016451">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:47.022831" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:47.036505" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:47.036731" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:47.022642" elapsed="0.014145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:47.037827" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:47.037172" elapsed="0.000757"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:47.039115" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:47.038275" elapsed="0.000989">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:47.022101" elapsed="0.017428">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:48.060943" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:48.074630" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:48.074858" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:48.060753" elapsed="0.014161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:48.075966" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:48.075302" elapsed="0.000764"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:48.077240" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:48.076415" elapsed="0.000973">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:48.060233" elapsed="0.017452">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:49.098960" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:49.112354" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:49.112473" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:49.098723" elapsed="0.013777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:49.112959" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:49.112685" elapsed="0.000320"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:49.113619" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:49.113160" elapsed="0.000550">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:49.098088" elapsed="0.015766">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:50.134166" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:50.147557" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:50.147775" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:50.133994" elapsed="0.013837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:50.148847" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:50.148227" elapsed="0.000721"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:50.150099" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:50.149294" elapsed="0.000945">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:50.133443" elapsed="0.017058">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:51.169039" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:51.182545" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:51.182684" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:51.168869" elapsed="0.013851"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:51.183327" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:51.182956" elapsed="0.000432"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:51.184130" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:51.183647" elapsed="0.000572">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:51.168416" elapsed="0.015944">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:52.204690" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:52.218532" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:52.218719" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:52.204483" elapsed="0.014272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:52.219602" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:52.219046" elapsed="0.000667"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:52.220985" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:52.220095" elapsed="0.001050">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:52.203867" elapsed="0.017538">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:53.241441" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:53.254565" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:53.254849" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:53.241246" elapsed="0.013683"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:53.256426" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:53.255567" elapsed="0.001046"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:53.258195" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:53.257086" elapsed="0.001317">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:53.240635" elapsed="0.018150">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:54.279501" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:54.293082" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:54.293319" level="INFO">${output_log} = 2</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:54.279288" elapsed="0.014088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:54.294482" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:54.293811" elapsed="0.000777"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:54.295824" level="FAIL">2 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:54.294969" elapsed="0.001012">2 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:54.278738" elapsed="0.017480">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:55.318080" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:55.333952" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:55.334183" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:55.317883" elapsed="0.016356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:55.335448" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:55.334801" elapsed="0.000783"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:55.336766" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:55.335935" elapsed="0.000982">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:55.317335" elapsed="0.019816">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:56.356739" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:56.369566" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:56.369813" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:56.356526" elapsed="0.013344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:56.370978" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:56.370283" elapsed="0.000798"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:56.372258" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:56.371429" elapsed="0.000980">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:56.355921" elapsed="0.016767">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:57.392274" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:57.405981" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:57.406213" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:57.392078" elapsed="0.014191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:57.407349" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:57.406705" elapsed="0.000770"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:57.408651" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:57.407826" elapsed="0.000976">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:57.391473" elapsed="0.017564">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:58.428102" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:58.442204" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:58.442529" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:58.427916" elapsed="0.014674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:58.443631" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:58.442993" elapsed="0.000743"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:58.444893" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:58.444080" elapsed="0.000958">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:58.427419" elapsed="0.017904">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:46:59.464239" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:46:59.477819" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:46:59.478075" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:46:59.463971" elapsed="0.014162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:46:59.479281" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:46:59.478601" elapsed="0.000780"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:46:59.480598" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:46:59.479763" elapsed="0.001031">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:46:59.463219" elapsed="0.017822">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:00.501156" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:00.515092" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:00.515326" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:00.500951" elapsed="0.014432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:00.516461" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:00.515817" elapsed="0.000775"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:00.517998" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:00.517143" elapsed="0.001014">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:00.500362" elapsed="0.018039">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:01.536718" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:01.550068" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:01.550298" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:01.536518" elapsed="0.013837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:01.551515" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:01.550830" elapsed="0.000791"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:01.552794" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:01.551975" elapsed="0.000970">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:01.535967" elapsed="0.017215">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:02.572930" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:02.586731" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:02.586966" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:02.572727" elapsed="0.014296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:02.588127" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:02.587447" elapsed="0.000782"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:02.589413" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:02.588617" elapsed="0.000988">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:02.572165" elapsed="0.017678">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:03.611198" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:03.625857" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:03.626190" level="INFO">${output_log} = 3</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:03.610990" elapsed="0.015263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:03.627347" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:03.626698" elapsed="0.000757"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:03.628677" level="FAIL">3 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:03.627836" elapsed="0.001001">3 != 4</status>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:03.610410" elapsed="0.018670">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:04.648901" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:04.662740" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:04.662947" level="INFO">${output_log} = 4</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:04.648699" elapsed="0.014305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:04.664124" level="INFO">4</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:04.663417" elapsed="0.000807"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:47:04.664596" elapsed="0.000695"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="PASS" start="2026-05-01T00:47:04.648089" elapsed="0.017347"/>
</kw>
<arg>${log_check_timeout*2}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>BGPCliKeywords.Check_File_For_Word_Count</arg>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>total_received_update_message_counter: ${update_messages}</arg>
<arg>4</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:46:45.968485" elapsed="18.697107"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:04.666964" elapsed="0.000572"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:04.666232" elapsed="0.001469"/>
</kw>
<doc>Consequent check for no updates received by iBGP peer No. 2</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:46:45.879343" elapsed="18.788443"/>
</test>
<test id="s1-s8-t27" name="TC3_Disconnect_BGP_Peer2" line="494">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:04.673929" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:04.673571" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:04.675359" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:04.675212" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.675185" elapsed="0.000258"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:04.680849" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:04.680741" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.680722" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:04.681956" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:04.681560" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:04.682443" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:04.682148" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:04.682534" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:47:04.682703" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:04.681157" elapsed="0.001571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:04.688599" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:04.688486" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.688466" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:04.689882" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:04.689774" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.689757" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:04.690419" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:04.690106" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:04.690876" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:04.690653" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:04.722107" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:04.691406" elapsed="0.030911"/>
</kw>
<msg time="2026-05-01T00:47:04.722578" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:04.722627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:04.691064" elapsed="0.031599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:04.745900" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:04.723380" elapsed="0.022757"/>
</kw>
<msg time="2026-05-01T00:47:04.746376" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:04.746424" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:04.722928" elapsed="0.023560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.746962" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:04.746610" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.746576" elapsed="0.000474"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:04.747629" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:04.747213" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.747990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:04.747768" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.747750" elapsed="0.000398"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:04.748189" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:04.751018" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:47:04.751231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:04.749834" elapsed="0.001534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.751674" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.752012" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:04.749160" elapsed="0.003041"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:04.748572" elapsed="0.003695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:04.689450" elapsed="0.062947"/>
</kw>
<msg time="2026-05-01T00:47:04.752511" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:04.752557" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:04.688825" elapsed="0.063771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:04.752784" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:04.752675" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.752657" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.753292" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.753658" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:04.753730" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:04.688131" elapsed="0.065711"/>
</kw>
<msg time="2026-05-01T00:47:04.753937" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:04.753981" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:04.683118" elapsed="0.070902"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:04.754350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:04.754098" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:04.754081" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:04.682971" elapsed="0.071482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:04.682786" elapsed="0.071716"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:04.680364" elapsed="0.074198"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:04.674899" elapsed="0.079724"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:04.674419" elapsed="0.080251"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:04.669608" elapsed="0.085117"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:04.754891" elapsed="0.000108"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:04.756189" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:04.755822" elapsed="0.000395"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:04.756378" elapsed="0.000342"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:47:04.755547" elapsed="0.001231"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.757751" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:47:06.758267" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:47:04.756940" elapsed="2.001394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.759604" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.758874" elapsed="0.000843"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:47:04.755206" elapsed="2.004645"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.773189" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-05-01T00:47:06.786117" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:06.786347" level="INFO">${output_log} = 2026-05-01 00:46:24,436 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:24,436 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:24,436 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:06.773046" elapsed="0.013365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.787493" level="INFO">2026-05-01 00:46:24,436 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:46:24,436 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:46:24,436 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:46:24,436 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:46:24,437 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:46:24,437 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:46:24,439 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:46:24,440 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:46:24,440 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:46:24,440 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:46:24,440 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,440 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-05-01 00:46:24,441 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:24,443 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:46:24,444 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:46:24,444 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:46:24,444 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:46:24,444 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:46:24,445 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,446 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:24,446 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:24,446 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:24,446 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:24,446 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,448 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:24,448 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:24,449 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:24,450 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:24,451 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:46:24,452 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-05-01 00:46:24,453 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-05-01 00:46:24,454 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.009571075439453125s
2026-05-01 00:46:24,454 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job):   
2026-05-01 00:46:24,455 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:46:24,455 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:46:34,465 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:46:34,465 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-05-01 00:46:34,466 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:46:34,466 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:34,466 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:44,476 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:46:44,476 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-05-01 00:46:44,476 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:46:44,477 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:44,477 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:46:54,487 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:46:54,487 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.030s
2026-05-01 00:46:54,487 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:46:54,487 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:46:54,487 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:04,498 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:04,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.040s
2026-05-01 00:47:04,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:04,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:04,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.786850" elapsed="0.001217"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:06.789309" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc3_bgp_peer2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc3_bgp_peer2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:47:06.788568" elapsed="0.000871"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>tc3_${BGP_PEER2_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:06.772609" elapsed="0.017013"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:06.791057" elapsed="0.000624"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:06.790277" elapsed="0.001616"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:04.668442" elapsed="2.123544"/>
</test>
<test id="s1-s8-t28" name="TC_3_Check_for_Empty_IPv4_Topology" line="501">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:06.797142" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:06.796761" elapsed="0.000780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.798986" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.798810" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.798781" elapsed="0.000308"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.804968" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.804858" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.804839" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.806045" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:06.805664" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.806544" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:06.806234" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:06.806613" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:47:06.806775" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:06.805271" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.812629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.812520" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.812501" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.813885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.813777" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.813760" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:06.814408" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:06.814103" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.814831" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:06.814615" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.846942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:06.815362" elapsed="0.031690"/>
</kw>
<msg time="2026-05-01T00:47:06.847223" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:06.847271" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.815024" elapsed="0.032283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.875533" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "3 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:06.847874" elapsed="0.027767"/>
</kw>
<msg time="2026-05-01T00:47:06.875802" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:06.875893" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "3 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.847515" elapsed="0.028418"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.876249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.876014" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.875994" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.876843" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "3 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.876536" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.877211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.876984" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.876965" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:06.877325" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:06.879885" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:47:06.880098" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:06.878813" elapsed="0.001417"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.880563" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.880919" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:06.878163" elapsed="0.002943"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:06.877619" elapsed="0.003552"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:06.813446" elapsed="0.067822"/>
</kw>
<msg time="2026-05-01T00:47:06.881360" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:06.881403" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "3 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.812853" elapsed="0.068587"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:06.881645" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:06.881536" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.881517" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.882131" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.882489" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.882563" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:06.812163" elapsed="0.070509"/>
</kw>
<msg time="2026-05-01T00:47:06.882763" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:06.882807" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "3 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.807174" elapsed="0.075670"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.883176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.882918" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.882901" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:06.807029" elapsed="0.076246"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:06.806854" elapsed="0.076451"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:06.804496" elapsed="0.078864"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:06.798376" elapsed="0.085038"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.797762" elapsed="0.085760"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:06.793096" elapsed="0.090481"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:06.893489" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:06.893710" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:06.893851" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:06.884744" elapsed="0.009145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.898208" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.894136" elapsed="0.004142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.902390" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.898538" elapsed="0.003948"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:47:06.902725" elapsed="0.003446"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:47:06.884378" elapsed="0.021855"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:06.883750" elapsed="0.022533"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:06.906891" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:06.906578" elapsed="0.000618"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:06.792416" elapsed="0.114819"/>
</test>
<test id="s1-s8-t29" name="TC3_Delete_BGP_Peers_Configuration" line="509">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:06.910673" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:06.910390" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.911969" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.911858" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.911839" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.917383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.917276" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.917259" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.918486" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:06.918086" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.918974" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:06.918679" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:06.919046" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:06.919202" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:06.917702" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.925228" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.925119" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.925101" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.926481" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:06.926349" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.926331" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:06.927045" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:06.926742" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.927452" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:06.927234" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.957284" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:06.927998" elapsed="0.029388"/>
</kw>
<msg time="2026-05-01T00:47:06.957573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:06.957621" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.927658" elapsed="0.029999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:06.983421" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:06.958194" elapsed="0.025351"/>
</kw>
<msg time="2026-05-01T00:47:06.983706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:06.983752" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.957833" elapsed="0.025955"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.984100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.983868" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.983848" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.984646" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:06.984326" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.985035" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.984786" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.984768" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:06.985149" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:06.987837" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:47:06.988048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:06.986622" elapsed="0.001562"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.988493" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.988834" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:06.985978" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:06.985423" elapsed="0.003689"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:06.926047" elapsed="0.063163"/>
</kw>
<msg time="2026-05-01T00:47:06.989302" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:06.989347" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.925476" elapsed="0.063909"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:06.989591" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:06.989480" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.989444" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.990075" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.990479" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:06.990553" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:06.924778" elapsed="0.065884"/>
</kw>
<msg time="2026-05-01T00:47:06.990756" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:06.990799" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "3 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.919619" elapsed="0.071218"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:06.991171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:06.990913" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:06.990896" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:06.919471" elapsed="0.071802"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:06.919283" elapsed="0.072022"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:06.916882" elapsed="0.074480"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:06.911571" elapsed="0.079847"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:06.911122" elapsed="0.080360"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:06.908115" elapsed="0.083423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:06.992242" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer1 | IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer1</arg>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:06.991711" elapsed="0.000560"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.039614" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.039219" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.040416" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.040155" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.040612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.039813" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.041193" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.040805" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.041570" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.041735" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.041413" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.042165" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.041920" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.043175" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.042918" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.043664" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.043381" elapsed="0.000351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.044410" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.044109" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.045189" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.044968" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.045266" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:07.045444" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.044649" elapsed="0.000835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.045642" elapsed="0.000240"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:47:07.043963" elapsed="0.001961"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.046484" level="INFO">${value} = example-bgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.046174" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.047222" level="INFO">${encoded} = example-bgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.047014" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.047298" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.047452" level="INFO">${encoded_value} = example-bgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.046698" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.047646" elapsed="0.000386"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-05-01T00:47:07.046038" elapsed="0.002037"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.048647" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.048325" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.049396" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.049187" elapsed="0.000282"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.049524" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.049678" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.048863" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.049856" elapsed="0.000227"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:07.048189" elapsed="0.001936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.050687" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.050372" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.051429" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.051221" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.051522" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.051672" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.050900" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.051851" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:07.050237" elapsed="0.001876"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.043786" elapsed="0.008361"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.052190" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:07.052346" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:07.042594" elapsed="0.009778"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.042279" elapsed="0.010125"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.052598" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.052429" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.042259" elapsed="0.010416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.053441" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.052820" elapsed="0.000715"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.053588" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.038596" elapsed="0.015118"/>
</kw>
<msg time="2026-05-01T00:47:07.053769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.025029" elapsed="0.028787"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.066918" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.080086" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.093276" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.093490" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.093671" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.094063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.093907" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.093893" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.094287" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.094469" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.094641" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.093864" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.093760" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.094870" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.094946" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:07.095070" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.020481" elapsed="0.074616"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.096246" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.095996" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:07.110089" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.110159" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.110304" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:07.098746" elapsed="0.011596"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.096361" elapsed="0.014038"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.110688" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.110436" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.096343" elapsed="0.014464"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.116173" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.112216" elapsed="0.004053"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.111903" elapsed="0.004447"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.111877" elapsed="0.004527"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.121063" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.116969" elapsed="0.004189"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.116552" elapsed="0.004862"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.116514" elapsed="0.004975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.122586" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.121855" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.123100" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.122741" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.123816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.123475" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.123215" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.122711" elapsed="0.001190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.124477" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.124072" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.124828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.124583" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.125369" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.125075" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.124909" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.124563" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.125655" elapsed="0.000387"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:07.126543" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.126214" elapsed="0.000357"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.126731" elapsed="0.002684"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:07.111306" elapsed="0.018202"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:07.129691" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:47:07.132192" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:47:07.095401" elapsed="0.036818"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.132276" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:47:06.992536" elapsed="0.139869"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.133149" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer2 | IP=127.0.0.2 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-bgp-peer2</arg>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.132603" elapsed="0.000575"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.178793" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.178396" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.179598" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.179327" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.179772" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.178991" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.180351" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.179968" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.180708" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.180871" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.180565" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.181305" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.181061" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.182343" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.182065" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.182838" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.182572" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.183558" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.183243" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.184312" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.184095" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.184389" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.184560" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.183774" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.184743" elapsed="0.000231"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:47:07.183101" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.185582" level="INFO">${value} = example-bgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.185267" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.186399" level="INFO">${encoded} = example-bgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.186114" elapsed="0.000312"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.186492" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.186645" level="INFO">${encoded_value} = example-bgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.185796" elapsed="0.000874"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.186826" elapsed="0.000225"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-05-01T00:47:07.185131" elapsed="0.001961"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.187657" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.187341" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.188398" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.188190" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.188492" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.188644" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.187873" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.188824" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:47:07.187205" elapsed="0.001884"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.189850" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.189341" elapsed="0.000535"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.190634" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.190408" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.190711" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:07.190862" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.190070" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.191041" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:07.189204" elapsed="0.002100"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.182920" elapsed="0.008420"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.191383" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:07.191560" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer2', 'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:07.181741" elapsed="0.009845"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.181420" elapsed="0.010199"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.191800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.191645" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.181400" elapsed="0.010477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.192661" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.192030" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.192740" elapsed="0.000099"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.177735" elapsed="0.015207"/>
</kw>
<msg time="2026-05-01T00:47:07.193000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.163953" elapsed="0.029097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.206367" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.219733" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.233105" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.233329" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.233534" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.233953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.233799" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.233781" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.234193" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.234367" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.234554" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.233738" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.233619" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.234817" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.234899" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:47:07.235054" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.159390" elapsed="0.075692"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.236278" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.235987" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:07.247914" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.247981" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.248131" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:07.238607" elapsed="0.009563"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.236397" elapsed="0.011840"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.248580" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.248280" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.236379" elapsed="0.012415"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.254678" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.250398" elapsed="0.004345"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.250050" elapsed="0.004764"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.250023" elapsed="0.004829"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.259082" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.255268" elapsed="0.003881"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.254936" elapsed="0.004265"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.254912" elapsed="0.004326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.260080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.259533" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.260421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.260179" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.260994" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.260693" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.260522" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.260161" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.261622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.261243" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.261957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.261719" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.262521" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.262208" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.262043" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.261701" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.262765" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:07.263629" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.263308" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.263814" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:07.249382" elapsed="0.016984"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:07.266416" elapsed="0.000058"/>
</return>
<msg time="2026-05-01T00:47:07.268887" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:47:07.235355" elapsed="0.033560"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.268971" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:47:07.133441" elapsed="0.135657"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:07.269759" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:07.269401" elapsed="0.000661"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:06.907567" elapsed="0.362536"/>
</test>
<test id="s1-s8-t30" name="TC4_Configure_Two_iBGP_RR_Clients_With_Cluster_Id" line="531">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:07.273533" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:07.273247" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.274879" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.274700" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.274682" elapsed="0.000302"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.280442" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.280335" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.280317" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.281538" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.281138" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.282020" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:07.281727" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:07.282092" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.282248" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.280761" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.288227" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.288119" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.288100" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.289553" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.289417" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.289399" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:07.290079" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.289773" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.290510" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:07.290270" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.322831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:07.291077" elapsed="0.031888"/>
</kw>
<msg time="2026-05-01T00:47:07.323148" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:07.323196" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.290702" elapsed="0.032559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.351385" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "R "R "_ "C "l "i "e "n "t "s "_ "W "i "t "h "_ "C "l "u "s "t "e "r "_ "I "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:07.323879" elapsed="0.027682"/>
</kw>
<msg time="2026-05-01T00:47:07.351740" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:07.351786" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.323492" elapsed="0.028331"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.352203" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.351923" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.351893" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.352803" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "_ "i "B "G "P "_ "R "R "_ "C "l "i "e "n "t "s "_ "W "i "t "h "_ "C "l "u "s "t "e "r "_ "I "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.352439" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.353165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.352947" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.352929" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:07.353282" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:07.356005" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:47:07.356215" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.354929" elapsed="0.001422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.356869" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.357224" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:07.354261" elapsed="0.003148"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:07.353624" elapsed="0.003869"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:07.289116" elapsed="0.068477"/>
</kw>
<msg time="2026-05-01T00:47:07.357686" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:07.357731" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.288468" elapsed="0.069300"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:07.357951" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:07.357845" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.357827" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.358444" elapsed="0.000048"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.358809" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.358880" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:07.287786" elapsed="0.071201"/>
</kw>
<msg time="2026-05-01T00:47:07.359081" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:07.359124" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "f "i "g "u "r "e "_ "T "w "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.282678" elapsed="0.076482"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.359523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.359235" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.359219" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:07.282530" elapsed="0.077094"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:07.282330" elapsed="0.077327"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:07.279973" elapsed="0.079742"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:07.274390" elapsed="0.085384"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.273947" elapsed="0.085874"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:07.270986" elapsed="0.088891"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.360680" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RR_CLIENT=true }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RR_CLIENT=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.360061" elapsed="0.000648"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.396726" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.396304" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.397706" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.397278" elapsed="0.000509">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.397884" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.396938" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.398488" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.398084" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.398825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.399013" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.398682" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.399447" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.399200" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.400545" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.400268" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.401247" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.400753" elapsed="0.000521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.401978" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.401679" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.402758" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.402535" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.402838" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:47:07.403003" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.402197" elapsed="0.000830"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.403187" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:07.401534" elapsed="0.001953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.404074" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.403768" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.404921" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.404711" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.405002" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.405150" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.404365" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.405328" elapsed="0.000239"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:47:07.403604" elapsed="0.002006"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.406155" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.405861" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.406910" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.406703" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.406986" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:47:07.407138" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.406368" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.407316" elapsed="0.000238"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:47:07.405723" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.408204" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.407906" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.408964" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.408756" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.409040" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.409191" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.408420" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.409370" elapsed="0.000238"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:07.407764" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.410201" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.409901" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.410960" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.410752" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.411035" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.411186" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.410415" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.411365" elapsed="0.000236"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:07.409764" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.412398" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.411919" elapsed="0.000505"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.413155" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.412950" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.413230" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.413379" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.412631" elapsed="0.000772"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.413574" elapsed="0.000221"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:07.411755" elapsed="0.002082"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.401329" elapsed="0.012542"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.413914" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:07.414076" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:07.399942" elapsed="0.014160"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.399596" elapsed="0.014537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.414312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.414159" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.399571" elapsed="0.014817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.415228" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.414555" elapsed="0.000701"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.415305" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.395624" elapsed="0.019805"/>
</kw>
<msg time="2026-05-01T00:47:07.415504" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.382041" elapsed="0.033512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.428853" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.442067" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.455215" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.455431" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.455636" elapsed="0.000122"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.456312" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.456002" elapsed="0.000379"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.455985" elapsed="0.000423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.456597" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.456770" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.456936" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.455946" elapsed="0.001043"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.455829" elapsed="0.001193"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.457172" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.457250" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:07.457402" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.377421" elapsed="0.080009"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.486054" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.485648" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.486889" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.486619" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.487142" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.486257" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.487744" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.487338" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.488077" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.488288" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.487937" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.488830" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
            &lt;route-reflector-cluster-id&gt;$IP&lt;/route-reflector-cluster-id&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.488504" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:07.489311" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.488982" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.489864" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.489569" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.489399" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.488958" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.490857" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.490100" elapsed="0.000787"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.490938" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.484993" elapsed="0.006080"/>
</kw>
<msg time="2026-05-01T00:47:07.491134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.471026" elapsed="0.020156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.504388" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.517682" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.530923" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.531178" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.531371" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.531833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.531675" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.531656" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.532070" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.532237" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.532403" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.531611" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.531476" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.532668" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.532751" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:47:07.532937" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.468209" elapsed="0.064759"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.534467" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.534135" elapsed="0.000409">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.534638" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.533719" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.535003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.534736" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.535586" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.535273" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.535085" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.534717" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.538402" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.535825" elapsed="0.002604"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:07.538497" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:47:07.538720" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:07.533331" elapsed="0.005415"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.540164" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.539909" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.540705" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
            &lt;route-reflector-cluster-id&gt;127.0.0.1&lt;/route-reflector-cluster-id&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.540432" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.541164" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.540921" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.541625" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.541360" elapsed="0.000309"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:07.542521" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:47:07.542280" elapsed="0.000268"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:47:07.542877" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:47:07.542705" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.543054" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.543681" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.543418" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:47:07.543768" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:07.543921" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:47:07.541875" elapsed="0.002071"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:07.559725" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1153', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
            &lt;route-reflector-cluster-id&gt;127.0.0.1&lt;/route-reflector-cluster-id&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:47:07.559871" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.560070" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:07.546227" elapsed="0.013900"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.544017" elapsed="0.016210"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.560691" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.560285" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.543999" elapsed="0.016888"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.569597" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.563144" elapsed="0.006523"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.562649" elapsed="0.007074"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.562610" elapsed="0.007152"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.573657" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.570193" elapsed="0.003510"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.569849" elapsed="0.003889"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.569823" elapsed="0.003941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.574375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.573960" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.574737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.574491" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.575289" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.574988" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.574819" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.574472" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.575915" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.575552" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.576254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.576010" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.576822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.576516" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.576334" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.575993" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.577059" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:07.577891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.577584" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.578076" elapsed="0.002567"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:07.561817" elapsed="0.018894"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:07.580919" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:47:07.580806" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.580786" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.581174" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.581241" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:07.583681" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:07.539089" elapsed="0.044619"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.583772" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:07.583926" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:07.365631" elapsed="0.218320"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.584308" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.584048" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.584031" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.584522" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/ibgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:47:07.360980" elapsed="0.223668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.585465" level="INFO">&amp;{mapping} = { IP=127.0.0.2 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RR_CLIENT=true }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RR_CLIENT=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.584843" elapsed="0.000653"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.621534" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.621111" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.622354" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.622096" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.622544" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.621746" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.623122" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.622738" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.623470" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.623639" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.623313" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.624070" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.623827" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.625160" level="INFO">mapping: {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.624875" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.625658" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.625367" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.626362" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.626064" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.627141" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.626921" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.627221" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:47:07.627383" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.626599" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.627581" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:47:07.625924" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.628407" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.628111" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.629198" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.628956" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.629272" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.629503" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.628638" elapsed="0.000892"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.629685" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:47:07.627976" elapsed="0.001971"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.630509" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.630195" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.631249" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.631040" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.631326" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.631495" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.630725" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.631678" elapsed="0.000221"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:47:07.630060" elapsed="0.001881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.632706" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.632195" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.633490" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.633263" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.633566" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.633718" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.632924" elapsed="0.000819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.633897" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:07.632057" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.634730" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.634411" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.635497" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.635270" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.635575" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.635728" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.634949" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.635908" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:07.634275" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.636730" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:07.636418" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:07.637521" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.637295" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:07.637598" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:07.637749" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:07.636942" elapsed="0.000831"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.637925" elapsed="0.000219"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:07.636283" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.625739" elapsed="0.012481"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:07.638264" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:07.638420" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:07.624549" elapsed="0.013898"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.624196" elapsed="0.014301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.638679" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.638525" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.624169" elapsed="0.014677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.639688" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.638999" elapsed="0.000718"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.639766" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.620415" elapsed="0.019476"/>
</kw>
<msg time="2026-05-01T00:47:07.639947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.606633" elapsed="0.033363"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.653321" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.666841" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.680065" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.680268" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.680467" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.680859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.680709" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.680692" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.681084" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.681254" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.681436" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.680658" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.680549" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.681681" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.681758" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:07.681890" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.602075" elapsed="0.079844"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.710310" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.709927" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.711103" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.710865" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.711271" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.710524" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.711869" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.711480" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.712199" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:07.712353" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:07.712063" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.712805" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.712560" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:07.713229" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.712933" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.713787" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RR_CLIENT': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.713478" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.713312" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.712914" elapsed="0.000959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.714760" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.714023" elapsed="0.000768"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.714841" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.709259" elapsed="0.005710"/>
</kw>
<msg time="2026-05-01T00:47:07.715029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.695577" elapsed="0.019500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.728715" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.741940" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.755238" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.755436" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.755633" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.755999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.755853" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:07.755839" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.756223" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.756393" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.756578" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:07.755809" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.755707" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.756806" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.756882" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:07.757014" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:07.692762" elapsed="0.064281"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:07.758358" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.758115" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:07.758532" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:07.757720" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.758875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.758629" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.759426" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.759136" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.758955" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.758610" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.762036" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.759718" elapsed="0.002344"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:07.762114" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:07.762266" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:07.757377" elapsed="0.004914"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.763691" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.763429" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.764139" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.763895" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.764613" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.764351" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.765048" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.764811" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:07.765946" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:47:07.765716" elapsed="0.000257"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:47:07.766301" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:47:07.766129" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.766493" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.767244" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.766857" elapsed="0.000437"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:47:07.767337" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.767515" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:47:07.765294" elapsed="0.002247"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:07.781847" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '1074', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:47:07.781986" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.782166" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:07.770022" elapsed="0.012183"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.767611" elapsed="0.014661"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.782569" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.782310" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.767594" elapsed="0.015107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.790488" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.784685" elapsed="0.005901"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.784167" elapsed="0.006497"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.784128" elapsed="0.006594"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.793677" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.791169" elapsed="0.002554"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.790846" elapsed="0.002912"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.790809" elapsed="0.002975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.794354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.793953" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.794713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.794468" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.795258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.794960" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.794794" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.794435" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.795889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.795524" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.796225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.795987" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.796787" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.796491" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:07.796307" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.795969" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.797024" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:07.797838" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:07.797555" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.798760" elapsed="0.002715"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:07.783352" elapsed="0.018195"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:07.801738" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:47:07.801624" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.801606" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.801995" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.802083" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:07.804533" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:07.762639" elapsed="0.041922"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.804626" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:07.804866" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:07.590416" elapsed="0.214477"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.805247" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.804993" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.804976" elapsed="0.000364"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:07.805375" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:47:07.585778" elapsed="0.219739"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:07.806150" elapsed="0.000257"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:07.805811" elapsed="0.000677"/>
</kw>
<doc>Configure two iBGP peers as routing reflector clients with cluster-id argument.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:07.270336" elapsed="0.536195"/>
</test>
<test id="s1-s8-t31" name="TC4_Connect_BGP_Peers" line="557">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:07.809988" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:07.809722" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.811268" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.811159" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.811141" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.816820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.816713" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.816696" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.817892" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:07.817511" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.818403" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:07.818087" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:07.818492" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:07.818649" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:07.817115" elapsed="0.001558"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.824616" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.824508" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.824488" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.825938" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:07.825776" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.825758" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:07.826496" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:07.826156" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.826910" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:07.826684" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.856522" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:07.827440" elapsed="0.029183"/>
</kw>
<msg time="2026-05-01T00:47:07.856786" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:07.856832" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.827103" elapsed="0.029809"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.878366" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:07.857436" elapsed="0.021079"/>
</kw>
<msg time="2026-05-01T00:47:07.878679" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:07.878725" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.857089" elapsed="0.021673"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.879065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.878840" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.878820" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.879743" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.879414" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.880096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.879877" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.879859" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:07.880209" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:07.882701" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:47:07.882903" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:07.881667" elapsed="0.001364"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.883312" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.883687" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:07.881028" elapsed="0.002845"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:07.880495" elapsed="0.003444"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:07.825452" elapsed="0.058584"/>
</kw>
<msg time="2026-05-01T00:47:07.884128" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:07.884172" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.824841" elapsed="0.059368"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:07.884393" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:47:07.884286" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.884267" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.884901" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.885235" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:07.885307" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:07.824155" elapsed="0.061260"/>
</kw>
<msg time="2026-05-01T00:47:07.885525" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:07.885569" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.819042" elapsed="0.066563"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:07.885929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:07.885680" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:07.885663" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:07.818896" elapsed="0.067176"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:07.818724" elapsed="0.067378"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:07.816338" elapsed="0.069820"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:07.810873" elapsed="0.075340"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:07.810427" elapsed="0.075829"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:07.807278" elapsed="0.079036"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:07.886486" elapsed="0.000189"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.891681" level="INFO">${peer1_cluster_id} = 127.0.0.4</msg>
<arg>${peer1_cluster_id}</arg>
<arg>127.0.0.4</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:07.886843" elapsed="0.004886"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.896784" level="INFO">${default_cluster_id} = 192.0.2.2</msg>
<arg>${default_cluster_id}</arg>
<arg>192.0.2.2</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:07.891900" elapsed="0.004929"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.905849" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.l...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:07.905524" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.906277" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.906037" elapsed="0.000288"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:07.910653" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-05-01T00:47:07.910776" level="INFO">${output} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.l...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:07.906492" elapsed="0.004311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.911211" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.910967" elapsed="0.000291"/>
</kw>
<arg>${BGP_PEER1_COMMAND} --cluster=${peer1_cluster_id}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:47:07.905034" elapsed="0.006279"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:07.918717" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:07.918892" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:07.918986" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:07.912536" elapsed="0.006486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.923369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.919266" elapsed="0.004173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.927411" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:07.923698" elapsed="0.003777"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:07.930339" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:07.927635" elapsed="0.002770">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:07.912091" elapsed="0.018485">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '{"prefix":"8.1.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:08.941699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:08.941893" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:47:08.942042" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:08.932777" elapsed="0.009303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.946121" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.942333" elapsed="0.003856"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.950094" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.946415" elapsed="0.003748"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:47:08.950384" elapsed="0.003472"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:47:08.931502" elapsed="0.022422"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:07.911492" elapsed="1.042484"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:08.954146" elapsed="0.000115"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.963340" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.l...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:08.963013" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.963792" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.963547" elapsed="0.000292"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:08.968129" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-05-01T00:47:08.968226" level="INFO">${output} = python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.l...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:08.963992" elapsed="0.004262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.968710" level="INFO">python3 play.py --firstprefix 8.2.0.0 --prefixlen 28 --amount 3 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.968418" elapsed="0.000339"/>
</kw>
<arg>${BGP_PEER2_COMMAND} --cluster=${BGP_PEER2_IP}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:47:08.962531" elapsed="0.006282"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:08.975868" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:08.975980" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '338'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:47:08.976078" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:08.970025" elapsed="0.006133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.979887" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.976326" elapsed="0.003625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.983799" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:08.980174" elapsed="0.003692"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:08.987189" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:08.984083" elapsed="0.003181">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:08.969600" elapsed="0.017775">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.1.0.0/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"}]}}]}]}' does not contain '{"prefix":"8.2.0.0/28"}'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:09.997783" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:09.997949" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '412'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]} 
 </msg>
<msg time="2026-05-01T00:47:09.998102" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:09.989114" elapsed="0.009027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.001959" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:09.998381" elapsed="0.003643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.005918" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}},"node":[{"node-id":"192.0.2.1","l3-unicast-igp-topology:igp-node-attributes":{"prefix":[{"prefix":"8.2.0.16/28"},{"prefix":"8.1.0.16/28"},{"prefix":"8.1.0.32/28"},{"prefix":"8.2.0.32/28"},{"prefix":"8.2.0.0/28"},{"prefix":"8.1.0.0/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.002255" elapsed="0.003732"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:47:10.006205" elapsed="0.003767"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="PASS" start="2026-05-01T00:47:09.988069" elapsed="0.021991"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>{"prefix":"${BGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:08.968979" elapsed="1.041142"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.010732" elapsed="0.000246"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.010404" elapsed="0.000638"/>
</kw>
<doc>Connect BGP peers, each set to send 3 prefixes.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:07.806771" elapsed="2.204309"/>
</test>
<test id="s1-s8-t32" name="TC4_BGP_Peer1_Check_Rib_Out_For_Introduced_Prefixes" line="579">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:10.014659" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:10.014375" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.015989" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.015867" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.015845" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.021832" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.021722" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.021703" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.022929" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.022543" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.023415" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:10.023120" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:10.023504" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:47:10.023665" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.022135" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.029553" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.029413" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.029395" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.030834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.030726" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.030708" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:10.031363" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.031055" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.031804" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.031585" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.062334" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:10.032336" elapsed="0.030142"/>
</kw>
<msg time="2026-05-01T00:47:10.062644" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:10.062690" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.031997" elapsed="0.030730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.093227" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "R "i "b "_ "O "u "t "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:10.063240" elapsed="0.030098"/>
</kw>
<msg time="2026-05-01T00:47:10.093516" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:10.093563" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.062901" elapsed="0.030699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.093926" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.093677" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.093658" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.094447" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "c "k "_ "R "i "b "_ "O "u "t "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.094153" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.094848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.094631" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.094613" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:10.094959" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.097429" elapsed="0.000322"/>
</kw>
<msg time="2026-05-01T00:47:10.097815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.096417" elapsed="0.001545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.098278" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.098659" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:10.095784" elapsed="0.003063"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:10.095237" elapsed="0.003674"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:10.030397" elapsed="0.068610"/>
</kw>
<msg time="2026-05-01T00:47:10.099098" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.099142" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.029786" elapsed="0.069394"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:10.099361" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:10.099255" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.099237" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.099875" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.100213" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.100284" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:10.029075" elapsed="0.071317"/>
</kw>
<msg time="2026-05-01T00:47:10.100501" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.100547" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "1 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.024070" elapsed="0.076513"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.100909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.100657" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.100641" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:10.023922" elapsed="0.077085"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:10.023747" elapsed="0.077290"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:10.021176" elapsed="0.079917"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:10.015570" elapsed="0.085580"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.015109" elapsed="0.086085"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:10.012093" elapsed="0.089153"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.102037" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib | PEER_NUMBER=2 | CLUSTER_ID=127.0.0.2 | DEFAULT_ID=192.0.2.2 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PEER_NUMBER=2</arg>
<arg>CLUSTER_ID=${BGP_PEER2_IP}</arg>
<arg>DEFAULT_ID=${default_cluster_id}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.101413" elapsed="0.000653"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.154830" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.154442" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.155648" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.155354" elapsed="0.000398">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.155848" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.155022" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.156427" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.156042" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.156773" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:10.156931" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:10.156637" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.157370" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.157124" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.160017" level="INFO">mapping: {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '2', 'CLUSTER_ID': '127.0.0.2', 'DEFAULT_ID': '192.0.2.2'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.159752" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.160520" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.160234" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.161234" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.160908" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.162191" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.161829" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.162269" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:10.162426" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.161480" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.162625" elapsed="0.000280"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:10.160771" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.163533" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.163197" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.164420" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.164084" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.164513" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.164667" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.163746" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.164845" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:10.163062" elapsed="0.002093"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.165755" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.165403" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.166695" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.166343" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.166770" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.166921" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.165967" elapsed="0.000978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.167098" elapsed="0.000268"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:47:10.165269" elapsed="0.002170"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.168033" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.167710" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.168938" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.168603" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.169014" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.169171" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.168247" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.169349" elapsed="0.000299"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:47:10.167575" elapsed="0.002115"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.170278" level="INFO">${value} = 192.0.2.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.169940" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.171197" level="INFO">${encoded} = 192.0.2.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.170867" elapsed="0.000356"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.171272" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.171422" level="INFO">${encoded_value} = 192.0.2.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.170529" elapsed="0.000918"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.171617" elapsed="0.000269"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">192.0.2.2</var>
<status status="PASS" start="2026-05-01T00:47:10.169805" elapsed="0.002121"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:10.160595" elapsed="0.011366"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:10.172003" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:10.172161" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '2', 'CLUSTER_ID': '127.0.0.2', 'DEFAULT_ID': '192.0.2.2'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:10.157801" elapsed="0.014386"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.157503" elapsed="0.014716"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.172394" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.172244" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.157483" elapsed="0.015006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.173495" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.172635" elapsed="0.000891"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.173575" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.153810" elapsed="0.019892"/>
</kw>
<msg time="2026-05-01T00:47:10.173754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.140365" elapsed="0.033437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.187268" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.200629" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.213922" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.214124" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.214420" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.214811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.214664" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:10.214650" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.215033" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.215203" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.215372" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:10.214620" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.214517" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.215634" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.215710" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:10.215832" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:10.135864" elapsed="0.079995"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.217122" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.216865" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.217278" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.216523" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.217637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.217374" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.218176" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.217887" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.217717" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.217355" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.220755" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.218426" elapsed="0.002355"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:10.220833" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.220986" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:10.216180" elapsed="0.004831"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.222235" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.221999" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.222470" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.221664" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:47:10.222706" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:10.222570" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.222551" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.222942" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.223116" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.223181" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:10.225416" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:10.221318" elapsed="0.004125"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.226871" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.226621" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.227315" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.227073" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:10.238607" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:10.239524" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '972'} 
 body={"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.2.0.16/28","prefix":"8.2.0.16/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.2.0.32/28","prefix":"8.2.0.32/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.2.0.0/28","prefix":"8.2.0.0/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}} 
 </msg>
<msg time="2026-05-01T00:47:10.239783" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:10.229689" elapsed="0.010155"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.227425" elapsed="0.012515"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.240350" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.240000" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.227407" elapsed="0.013172"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.247905" level="INFO">{"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.2.0.16/28","prefix":"8.2.0.16/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.2.0.32/28","prefix":"8.2.0.32/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.2.0.0/28","prefix":"8.2.0.0/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["192.0.2.2","127.0.0.2"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.242908" elapsed="0.005050"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.242358" elapsed="0.005635"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.242318" elapsed="0.005700"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.250828" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.248303" elapsed="0.002571"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.248074" elapsed="0.002864"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.248058" elapsed="0.002908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.251546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.251139" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.251890" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.251646" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.252442" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.252139" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.251972" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.251628" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.253073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.252712" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.253416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.253172" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.253976" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.253681" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.253516" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.253154" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.254212" elapsed="0.000391"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:10.255049" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.254772" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.255239" elapsed="0.002723"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:10.241387" elapsed="0.016639"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.258208" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.258099" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.258078" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.261892" level="INFO">${text_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.258426" elapsed="0.003496"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:47:10.261975" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:10.262133" level="INFO">${response_text} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:10.225774" elapsed="0.036387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.262223" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:10.262371" level="INFO">${response_text} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:10.111506" elapsed="0.150891"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.292410" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.292038" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.293269" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.293002" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.293428" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.292621" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.294038" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.293650" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.294365" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:10.294525" level="INFO">${template} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.0/28",
        "route-key": "8.$PEER_NUMBER.0.0/28",
        "attributes": {
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:10.294229" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.294979" level="INFO">{
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.0/28",
        "route-key": "8.$PEER_NUMBER.0.0/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      },
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.16/28",
        "route-key": "8.$PEER_NUMBER.0.16/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      },
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.32/28",
        "route-key": "8.$PEER_NUMBER.0.32/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.294712" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:10.295441" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.295122" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.295987" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '2', 'CLUSTER_ID': '127.0.0.2', 'DEFAULT_ID': '192.0.2.2'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.295694" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.295544" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.295099" elapsed="0.000973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.297064" level="INFO">${final_text} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.2.0.0/28",
        "route-key": "8.2.0.0/28",
        "attributes": {
          "origin": {
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.296221" elapsed="0.000872"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.297142" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.291408" elapsed="0.005862"/>
</kw>
<msg time="2026-05-01T00:47:10.297333" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.277759" elapsed="0.019621"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.310991" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.324359" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.337767" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.337965" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.338143" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.338527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.338364" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:10.338350" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.338752" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.338922" elapsed="0.000032"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.339105" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:10.338321" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.338218" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.339334" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.339410" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:10.339560" level="INFO">${expected_text} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.2.0.0/28",
        "route-key": "8.2.0.0/28",
        "attributes": {
          "origin": {
       ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:10.274981" elapsed="0.064607"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.339767" elapsed="0.002348"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.343938" level="INFO">${expected_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.342864" elapsed="0.001104"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.345135" level="INFO">${actual_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.344126" elapsed="0.001038"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:47:10.345357" elapsed="0.000349"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:47:10.342434" elapsed="0.003334"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.342194" elapsed="0.003607"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.345977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.345826" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.342176" elapsed="0.003877"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:47:10.263574" elapsed="0.082528"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:47:10.262760" elapsed="0.083418"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.262496" elapsed="0.083727"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.262478" elapsed="0.083768"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.346279" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/peer_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:47:10.106889" elapsed="0.239514"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/peer_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:10.102243" elapsed="0.244233"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.347081" elapsed="0.000237"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.346760" elapsed="0.000620"/>
</kw>
<doc>Check incomming updates for new routes and respective cluster-ids
on first peer which should contain default-cluster id from global config reflected
from the second peer equal to router-id.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:10.011305" elapsed="0.336113"/>
</test>
<test id="s1-s8-t33" name="TC4_BGP_Peer2_Check_Rib_Out_For_Introduced_Prefixes" line="599">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:10.350869" elapsed="0.000237"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:10.350605" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.352162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.352048" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.352030" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.357775" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.357667" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.357649" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.358845" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.358448" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.359369" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:10.359065" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:10.359441" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:47:10.359616" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.358073" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.365504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.365380" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.365362" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.366728" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.366622" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.366604" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:10.367314" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.366946" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.367737" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.367521" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.400313" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:10.368265" elapsed="0.032145"/>
</kw>
<msg time="2026-05-01T00:47:10.400617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:10.400664" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.367926" elapsed="0.032775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.446568" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "R "i "b "_ "O "u "t "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:10.401217" elapsed="0.045622"/>
</kw>
<msg time="2026-05-01T00:47:10.447099" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:10.447149" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.400874" elapsed="0.046319"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.447765" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.447329" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.447286" elapsed="0.000574"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.448441" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "c "k "_ "R "i "b "_ "O "u "t "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.448016" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.448853" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.448631" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.448611" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:10.448972" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.451795" elapsed="0.000156"/>
</kw>
<msg time="2026-05-01T00:47:10.452013" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.450705" elapsed="0.001457"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.452454" elapsed="0.000346"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.453094" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:10.450014" elapsed="0.003275"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:10.449347" elapsed="0.004010"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:10.366292" elapsed="0.087185"/>
</kw>
<msg time="2026-05-01T00:47:10.453577" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.453622" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.365726" elapsed="0.087939"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:10.454128" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:47:10.453744" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.453725" elapsed="0.000565"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.454875" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.455306" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.455380" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:10.365045" elapsed="0.090474"/>
</kw>
<msg time="2026-05-01T00:47:10.455615" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.455660" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "B "G "P "_ "P "e "e "r "2 "_ "C "h "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.360008" elapsed="0.095689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.456031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.455775" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.455757" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:10.359863" elapsed="0.096271"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:10.359692" elapsed="0.096477"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:10.357293" elapsed="0.098935"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:10.351764" elapsed="0.104527"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.351312" elapsed="0.105027"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:10.348308" elapsed="0.108089"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.457263" level="INFO">&amp;{mapping} = { IP=127.0.0.2 | BGP_RIB_OPENCONFIG=example-bgp-rib | PEER_NUMBER=1 | CLUSTER_ID=127.0.0.1 | DEFAULT_ID=127.0.0.4 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PEER_NUMBER=1</arg>
<arg>CLUSTER_ID=${BGP_PEER1_IP}</arg>
<arg>DEFAULT_ID=${peer1_cluster_id}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.456607" elapsed="0.000690"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.511349" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.510908" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.512254" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.511969" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.512440" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.511586" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.513045" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.512656" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.513384" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:10.513584" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:10.513239" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.514022" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.513776" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.515146" level="INFO">mapping: {'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '1', 'CLUSTER_ID': '127.0.0.1', 'DEFAULT_ID': '127.0.0.4'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.514888" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.515738" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.515430" elapsed="0.000335"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.516829" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.516159" elapsed="0.000696"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.517794" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.517405" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.517877" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:47:10.518050" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.517054" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.518239" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:47:10.516015" elapsed="0.002597"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.519193" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.518869" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.520141" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.519800" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.520218" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:10.520372" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.519411" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.520567" elapsed="0.000274"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:10.518731" elapsed="0.002154"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.521471" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.521136" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.522369" level="INFO">${encoded} = 1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.522031" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.522445" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:47:10.522621" level="INFO">${encoded_value} = 1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.521688" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.522800" elapsed="0.000271"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-05-01T00:47:10.521000" elapsed="0.002114"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.523709" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.523367" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.524637" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.524280" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.524713" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:10.524864" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.523936" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.525042" elapsed="0.000278"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:10.523230" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.525954" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.525633" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:10.526883" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.526545" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:10.526960" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:10.527113" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:10.526172" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.527293" elapsed="0.000293"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:47:10.525496" elapsed="0.002172"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:10.515822" elapsed="0.011883"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:10.527779" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.527946" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '1', 'CLUSTER_ID': '127.0.0.1', 'DEFAULT_ID': '127.0.0.4'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:10.514554" elapsed="0.013418"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.514160" elapsed="0.013845"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.528192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.528032" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.514133" elapsed="0.014138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.529102" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.528420" elapsed="0.000710"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.529180" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.510138" elapsed="0.019168"/>
</kw>
<msg time="2026-05-01T00:47:10.529362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.496514" elapsed="0.032897"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.543257" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.556778" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.570070" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.570304" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.570511" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.570955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.570798" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:10.570780" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.571186" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.571355" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.571538" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:10.570737" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.570598" elapsed="0.001090"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.571844" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.571940" elapsed="0.000023"/>
</return>
<msg time="2026-05-01T00:47:10.572117" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:10.491907" elapsed="0.080241"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.573659" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.573334" elapsed="0.000408">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.573838" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.572917" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.574204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.573934" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.574789" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.574496" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.574284" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.573915" elapsed="0.000956"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.577414" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.575024" elapsed="0.002416"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:10.577509" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:47:10.577669" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:10.572548" elapsed="0.005146"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.578931" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.578700" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.579088" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.578343" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:47:10.579320" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:10.579183" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.579166" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.579571" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.579746" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.579810" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:10.582049" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:10.578011" elapsed="0.004065"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.583520" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.583247" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.584031" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.583760" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:10.594694" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:10.595685" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '972'} 
 body={"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.1.0.16/28","prefix":"8.1.0.16/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.1.0.32/28","prefix":"8.1.0.32/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}} 
 </msg>
<msg time="2026-05-01T00:47:10.595831" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:10.586363" elapsed="0.009504"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.584149" elapsed="0.011776"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.596219" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.595962" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.584130" elapsed="0.012211"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.601840" level="INFO">{"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.1.0.16/28","prefix":"8.1.0.16/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}},{"path-id":0,"route-key":"8.1.0.32/28","prefix":"8.1.0.32/28","attributes":{"origin":{"value":"igp"},"originator-id":{"originator":"192.0.2.2"},"cluster-id":{"cluster":["127.0.0.1","127.0.0.4"]},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.597841" elapsed="0.004078"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.597509" elapsed="0.004462"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.597482" elapsed="0.004527"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.606184" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.602421" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.602089" elapsed="0.004212"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.602065" elapsed="0.004272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.607185" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.606609" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.607710" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.607327" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.608572" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.608106" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.607831" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.607301" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.609348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.608940" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.609700" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.609444" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.610267" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.609944" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.609780" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.609426" elapsed="0.000957"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.610558" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:10.611552" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.611078" elapsed="0.000500"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.611739" elapsed="0.002640"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:10.596878" elapsed="0.017565"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.614636" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.614530" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.614511" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.618311" level="INFO">${text_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.614853" elapsed="0.003487"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:47:10.618393" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:10.618569" level="INFO">${response_text} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:10.582400" elapsed="0.036195"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.618658" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:10.618810" level="INFO">${response_text} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:10.467063" elapsed="0.151773"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.648666" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.648260" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.649534" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:10.649218" elapsed="0.000382">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:10.649694" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:10.648861" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.650296" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.649883" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:10.650640" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/peer_rib_out/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:10.650797" level="INFO">${template} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.0/28",
        "route-key": "8.$PEER_NUMBER.0.0/28",
        "attributes": {
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:10.650503" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.651219" level="INFO">{
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.0/28",
        "route-key": "8.$PEER_NUMBER.0.0/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      },
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.16/28",
        "route-key": "8.$PEER_NUMBER.0.16/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      },
      {
        "path-id": 0,
        "prefix": "8.$PEER_NUMBER.0.32/28",
        "route-key": "8.$PEER_NUMBER.0.32/28",
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "originator-id": {
            "originator": "192.0.2.2"
          },
          "local-pref": {
            "pref": 100
          },
          "as-path": {
            "segments": [
              {
                "as-sequence": [
                  64496
                ]
              }
            ]
          },
          "cluster-id": {
            "cluster": [
              "$CLUSTER_ID",
              "$DEFAULT_ID"
            ]
          },
          "ipv4-next-hop": {
            "global": "192.0.2.1"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.650981" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:10.651734" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.651387" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.652289" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_NUMBER': '1', 'CLUSTER_ID': '127.0.0.1', 'DEFAULT_ID': '127.0.0.4'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:10.651968" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.651819" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.651368" elapsed="0.001009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.653381" level="INFO">${final_text} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.1.0.0/28",
        "route-key": "8.1.0.0/28",
        "attributes": {
          "origin": {
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.652542" elapsed="0.000867"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.653476" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.647553" elapsed="0.006053"/>
</kw>
<msg time="2026-05-01T00:47:10.653669" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.634122" elapsed="0.019595"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.667164" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.685770" elapsed="0.000096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/peer_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.700919" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.701141" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.701330" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.701781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.701622" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:10.701604" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.702018" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.702189" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.702359" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:10.701560" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.701417" elapsed="0.001025"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.702684" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.702768" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:47:10.702948" level="INFO">${expected_text} = {
  "bgp-inet:ipv4-routes": {
    "ipv4-route": [
      {
        "path-id": 0,
        "prefix": "8.1.0.0/28",
        "route-key": "8.1.0.0/28",
        "attributes": {
          "origin": {
       ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:10.631319" elapsed="0.071660"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.703166" elapsed="0.002481"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.707547" level="INFO">${expected_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.706424" elapsed="0.001152"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:47:10.708757" level="INFO">${actual_normalized} = {
 "bgp-inet:ipv4-routes": {
  "ipv4-route": [
   {
    "attributes": {
     "as-path": {
      "segments": [
       {
        "as-sequence": [
         64496
        ]
       }
      ]
     },
     "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:47:10.707732" elapsed="0.001053"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:47:10.708944" elapsed="0.000335"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:47:10.705975" elapsed="0.003364"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.705729" elapsed="0.003643"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.709705" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.709397" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.705710" elapsed="0.004076"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:47:10.619991" elapsed="0.089845"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:47:10.619166" elapsed="0.090751"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:10.618920" elapsed="0.091045"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.618903" elapsed="0.091087"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:10.710027" elapsed="0.000034"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/peer_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:47:10.462340" elapsed="0.247826"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/peer_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:10.457501" elapsed="0.252731"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.710852" elapsed="0.000238"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:10.710546" elapsed="0.000607"/>
</kw>
<doc>Check incomming updates for new routes and respective cluster-ids
in second peer which has local route-reflector-cluster-id</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:10.347658" elapsed="0.363535"/>
</test>
<test id="s1-s8-t34" name="TC4_Disconnect_BGP_Peers" line="618">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:10.716786" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:10.716514" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.718059" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.717947" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.717929" elapsed="0.000244"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.723521" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.723399" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.723381" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.724604" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:10.724193" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.725084" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:10.724791" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:10.725153" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:10.725308" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:10.723819" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.731167" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.731056" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.731037" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.732393" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:10.732287" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.732269" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:10.732956" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:10.732655" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.733365" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.733145" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.764029" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:10.733908" elapsed="0.030223"/>
</kw>
<msg time="2026-05-01T00:47:10.764296" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:10.764342" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.733569" elapsed="0.030810"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:10.786410" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:10.764984" elapsed="0.021542"/>
</kw>
<msg time="2026-05-01T00:47:10.786687" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:10.786732" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.764585" elapsed="0.022184"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.787071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.786846" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.786826" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.787611" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:10.787294" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.787961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.787744" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.787725" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:10.788072" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.790680" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:47:10.790882" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:10.789569" elapsed="0.001445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.791293" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.791657" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:10.788933" elapsed="0.002907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:10.788359" elapsed="0.003544"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:10.731986" elapsed="0.060013"/>
</kw>
<msg time="2026-05-01T00:47:10.792090" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.792133" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.731390" elapsed="0.060779"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:10.792352" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:10.792245" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.792227" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.792888" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.793227" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:10.793299" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:10.730720" elapsed="0.062687"/>
</kw>
<msg time="2026-05-01T00:47:10.793516" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:10.793562" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.725717" elapsed="0.067881"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:10.793922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:10.793673" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:10.793655" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:10.725572" elapsed="0.068449"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:10.725382" elapsed="0.068669"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:10.723043" elapsed="0.071062"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:10.717659" elapsed="0.076499"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:10.717203" elapsed="0.076998"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:10.712205" elapsed="0.082048"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:10.794408" elapsed="0.000122"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:10.795719" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:10.795338" elapsed="0.000408"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:10.795900" elapsed="0.000235"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:47:10.795077" elapsed="0.001117"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:47:12.797116" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:47:12.797384" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:47:10.796352" elapsed="2.001078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:12.798275" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:12.797812" elapsed="0.000659"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:47:10.794762" elapsed="2.003807"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:12.816635" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-05-01T00:47:12.829727" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:12.829895" level="INFO">${output_log} = 2026-05-01 00:47:07,995 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:07,995 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:47:07,996 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:12.816357" elapsed="0.013569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:12.830567" level="INFO">2026-05-01 00:47:07,995 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:07,995 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:47:07,996 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:47:07,996 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:47:07,996 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:47:07,996 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-05-01 00:47:07,998 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Cluster list: 127.0.0.4
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:47:07,999 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:47:07,999 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-05-01 00:47:08,000 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-05-01 00:47:08,001 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:08,001 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,001 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:08,001 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:08,001 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:08,002 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:47:08,002 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:08,003 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-05-01 00:47:08,004 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-05-01 00:47:08,005 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010000
2026-05-01 00:47:08,005 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:47:08,005 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:47:08,005 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:08,006 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,007 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:08,008 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:08,008 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:08,008 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:08,008 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:08,010 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-05-01 00:47:08,010 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:08,010 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:08,010 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010010
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:08,011 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:47:08,012 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-05-01 00:47:08,013 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010020
2026-05-01 00:47:08,013 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:47:08,013 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:47:08,013 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:47:08,013 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:47:08,013 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.010757207870483398s
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:08,014 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:47:08,014 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:08,014 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:47:08,015 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:47:09,066 INFO BGP-Thread-1 (job): ... idle for 1.051s
2026-05-01 00:47:09,068 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.051s
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020000
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020000'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020010
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020010'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020020
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,072 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020020'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-05-01 00:47:09,073 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-05-01 00:47:09,074 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-05-01 00:47:09,074 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,074 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,074 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,074 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-05-01 00:47:09,074 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:47:09,074 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:12.830184" elapsed="0.000727"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:12.831551" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc4_bgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc4_bgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:47:12.831131" elapsed="0.000479"/>
</kw>
<arg>${BGP_PEER1_LOG_FILE}</arg>
<arg>tc4_${BGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:12.815533" elapsed="0.016147"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>bgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:12.831849" elapsed="0.000115"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:12.833250" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:12.832865" elapsed="0.000452"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:12.833724" elapsed="0.000488"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:47:12.832590" elapsed="0.001779"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.835641" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:47:14.836007" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:47:12.834760" elapsed="2.001313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.837263" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:14.836597" elapsed="0.000776"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:47:12.832194" elapsed="2.005349"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.852929" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-05-01T00:47:14.866294" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:14.866401" level="INFO">${output_log} = 2026-05-01 00:47:09,041 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:09,041 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:47:09,041 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:14.852787" elapsed="0.013641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.866880" level="INFO">2026-05-01 00:47:09,041 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:09,041 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:47:09,041 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:47:09,041 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:47:09,041 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:47:09,041 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:47:09,043 INFO BGP-Thread-1 (job):   Cluster list: 127.0.0.2
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:47:09,044 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:47:09,044 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:47:09,045 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-05-01 00:47:09,045 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:47:09,045 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:47:09,045 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-05-01 00:47:09,045 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-05-01 00:47:09,046 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:09,046 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,046 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:09,047 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-05-01 00:47:09,047 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:09,048 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020000
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-05-01 00:47:09,049 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020010
2026-05-01 00:47:09,050 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:09,051 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:09,057 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-05-01 00:47:09,058 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020020
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.010562896728515625s
2026-05-01 00:47:09,058 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:47:09,061 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:47:09,061 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:09,061 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:09,061 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:47:09,061 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:09,062 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:09,062 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:47:09,062 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:09,063 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-05-01 00:47:09,064 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,065 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010000
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,066 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010000'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010000'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010000'
2026-05-01 00:47:09,067 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.0/28']
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.0/28
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010010
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010010'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,068 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010010'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010010'
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.16/28']
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.16/28
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,069 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010020
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800e0e00010104c0000201001c08010020'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:09,070 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010020'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010020'
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.32/28']
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.32/28
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:09,071 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:10,821 INFO BGP-Thread-1 (job): ... idle for 1.750s
2026-05-01 00:47:10,821 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.751s
2026-05-01 00:47:10,821 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004802000000314001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010000
2026-05-01 00:47:10,821 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:10,821 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0048' (72)
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0031' (49)
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010000'
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:10,822 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010000'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010000'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.0/28']
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.0/28
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004802000000314001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010010
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0048' (72)
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:10,823 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0031' (49)
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010010'
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:10,824 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010010'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010010'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.16/28']
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.16/28
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004802000000314001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010020
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0048' (72)
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:10,825 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0031' (49)
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a087f0000017f000004800f080001011c08010020'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'7f0000017f000004'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010020'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-05-01 00:47:10,826 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010020'
2026-05-01 00:47:10,827 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.32/28']
2026-05-01 00:47:10,827 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.32/28
2026-05-01 00:47:10,827 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:10,827 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:10,827 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:10,827 INFO BGP-Thread-1 (job): total_received_update_message_counter: 7
2026-05-01 00:47:10,827 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-05-01 00:47:10,827 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 3
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:14.866618" elapsed="0.000730"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:14.868691" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc4_bgp_peer2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc4_bgp_peer2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:47:14.867843" elapsed="0.000979"/>
</kw>
<arg>${BGP_PEER2_LOG_FILE}</arg>
<arg>tc4_${BGP_PEER2_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:14.852338" elapsed="0.016622"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:14.870330" elapsed="0.000841"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:14.869614" elapsed="0.001710"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:10.711694" elapsed="4.159722"/>
</test>
<test id="s1-s8-t35" name="TC4_Check_for_Empty_IPv4_Topology" line="628">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:14.877232" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:14.876964" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.878663" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.878518" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.878484" elapsed="0.000261"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.884142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.884033" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.884014" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.885227" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:14.884840" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.885727" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:14.885417" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:14.885797" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:47:14.885962" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:14.884444" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.891982" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.891872" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.891853" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.893252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.893144" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.893126" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:14.893801" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:14.893496" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.894206" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:14.893989" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.923982" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:14.894776" elapsed="0.029312"/>
</kw>
<msg time="2026-05-01T00:47:14.924263" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:14.924337" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.894421" elapsed="0.029955"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.948244" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:14.924926" elapsed="0.023428"/>
</kw>
<msg time="2026-05-01T00:47:14.948538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:14.948639" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.924580" elapsed="0.024099"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.948988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:14.948759" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.948739" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.949532" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:14.949212" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.949887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:14.949670" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.949651" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:14.949998" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:14.952610" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:47:14.952817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:14.951516" elapsed="0.001432"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.953226" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.953586" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:14.950869" elapsed="0.002902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:14.950285" elapsed="0.003550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:14.892843" elapsed="0.061088"/>
</kw>
<msg time="2026-05-01T00:47:14.954021" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:14.954065" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.892211" elapsed="0.061891"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:14.954285" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:14.954178" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.954159" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.954802" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.955144" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.955216" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:14.891534" elapsed="0.063790"/>
</kw>
<msg time="2026-05-01T00:47:14.955416" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:14.955475" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "C "h "e "c "k "_ "f "o "r "_ "E "m "p "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.886395" elapsed="0.069121"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:14.955849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:14.955594" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.955576" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:14.886222" elapsed="0.069728"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:14.886043" elapsed="0.069938"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:14.883673" elapsed="0.072362"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:14.878119" elapsed="0.077970"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.877671" elapsed="0.078501"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:14.873235" elapsed="0.082991"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:14.966053" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:14.966192" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:14.966306" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:14.957383" elapsed="0.008950"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.969126" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:14.966550" elapsed="0.002622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.972155" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:14.969331" elapsed="0.002872"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:47:14.972362" elapsed="0.002711"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:47:14.957038" elapsed="0.018099"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:14.956407" elapsed="0.018779"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:14.975785" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:14.975475" elapsed="0.000615"/>
</kw>
<doc>Checks for empty topology after</doc>
<status status="PASS" start="2026-05-01T00:47:14.872100" elapsed="0.104028"/>
</test>
<test id="s1-s8-t36" name="TC4_Delete_BGP_Peers_Configuration" line="637">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:14.979572" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:14.979293" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.980819" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.980709" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.980689" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.986218" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.986112" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.986094" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.987321" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:14.986936" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:14.987825" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:14.987528" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:14.987896" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:14.988052" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:14.986531" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.994093" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.993985" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.993966" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:14.995399" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:14.995227" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:14.995209" elapsed="0.000287"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:14.995949" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:14.995649" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:14.996353" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:14.996137" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.031918" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:14.996901" elapsed="0.035117"/>
</kw>
<msg time="2026-05-01T00:47:15.032181" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:15.032228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.996560" elapsed="0.035710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.057705" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:15.032817" elapsed="0.024995"/>
</kw>
<msg time="2026-05-01T00:47:15.057975" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:15.058020" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:15.032444" elapsed="0.025613"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.058360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.058135" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.058115" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.058938" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.058611" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.059295" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.059077" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.059059" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:15.059406" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:15.061937" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:47:15.062144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.060869" elapsed="0.001407"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.062576" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.062941" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:15.060234" elapsed="0.002894"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:15.059696" elapsed="0.003496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:14.994924" elapsed="0.068364"/>
</kw>
<msg time="2026-05-01T00:47:15.063380" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:15.063424" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.994317" elapsed="0.069167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:15.063671" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:15.063564" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.063545" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.064158" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.064584" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.064657" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:14.993646" elapsed="0.071122"/>
</kw>
<msg time="2026-05-01T00:47:15.064859" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:15.064902" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "4 "_ "D "e "l "e "t "e "_ "B "G "P "_ "P "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.988448" elapsed="0.076491"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.065273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.065019" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.064997" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:14.988302" elapsed="0.077071"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:14.988130" elapsed="0.077272"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:14.985753" elapsed="0.079730"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:14.980403" elapsed="0.085140"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:14.979982" elapsed="0.085605"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:14.976971" elapsed="0.088668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.066265" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.065805" elapsed="0.000491"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.112634" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.112228" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:15.113470" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:15.113176" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:15.113650" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:15.112835" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.114229" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:15.113845" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:15.114577" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/cluster_id/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:15.114737" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:15.114420" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.115187" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.114940" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.116211" level="INFO">mapping: {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.115955" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.116712" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.116424" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.117480" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:15.117162" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:15.118248" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.118026" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:15.118325" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:47:15.118502" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:15.117701" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.118688" elapsed="0.000268"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:15.117019" elapsed="0.001979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.119569" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:15.119252" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:15.120311" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.120102" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:15.120386" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:15.120557" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:15.119783" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.120735" elapsed="0.000389"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:15.119114" elapsed="0.002051"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:15.116840" elapsed="0.004361"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:15.121246" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:15.121412" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:15.115629" elapsed="0.005809"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.115307" elapsed="0.006180"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.121706" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.121514" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.115286" elapsed="0.006498"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.122531" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.121931" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:15.122610" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:15.111608" elapsed="0.011129"/>
</kw>
<msg time="2026-05-01T00:47:15.122791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.097946" elapsed="0.024892"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.136204" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.149478" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//cluster_id/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.162878" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.163092" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.163274" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.163666" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.163516" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:15.163501" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.163888" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.164059" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.164227" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:15.163469" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.163350" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.164471" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.164549" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:15.164672" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:15.093302" elapsed="0.071397"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.165808" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.165559" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:15.183216" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:15.183335" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:15.183608" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:15.168125" elapsed="0.015544"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.165920" elapsed="0.017841"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.184182" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.183820" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.165903" elapsed="0.018470"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.192629" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.186688" elapsed="0.005987"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.186152" elapsed="0.006559"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.186113" elapsed="0.006656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.195602" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.193062" elapsed="0.002589"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.192832" elapsed="0.002854"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.192814" elapsed="0.002898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.196276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.195895" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.196639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.196375" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.197190" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.196889" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.196721" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.196357" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.197819" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.197439" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.198155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.197916" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.198713" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.198401" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.198236" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.197899" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.198950" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:15.199791" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.199510" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.199975" elapsed="0.002518"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:15.185199" elapsed="0.017357"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:15.202603" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:15.205081" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:47:15.164965" elapsed="0.040143"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:15.205164" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}cluster_id/ibgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:47:15.066543" elapsed="0.138745"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.205956" level="INFO">&amp;{mapping} = { IP=127.0.0.2 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${BGP_PEER2_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.205506" elapsed="0.000478"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.251675" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.251286" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:15.252433" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:15.252203" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:15.252619" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:15.251871" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.253191" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:15.252809" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:15.253578" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:15.253713" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:15.253424" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.254143" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.253900" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.255145" level="INFO">mapping: {'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.254890" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.255849" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.255402" elapsed="0.000474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.256553" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:15.256235" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:15.257301" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.257090" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:15.257376" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:15.257547" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:15.256771" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.257726" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:47:15.256094" elapsed="0.001897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.258593" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:15.258267" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:15.259347" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.259124" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:15.259422" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:47:15.259589" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:15.258808" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.259766" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:15.258125" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:15.255926" elapsed="0.004136"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:15.260105" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:15.260261" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:15.254567" elapsed="0.005718"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.254257" elapsed="0.006059"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.260509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.260341" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.254238" elapsed="0.006348"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.261298" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.260729" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:15.261375" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:15.250653" elapsed="0.010865"/>
</kw>
<msg time="2026-05-01T00:47:15.261608" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.237039" elapsed="0.024618"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.276032" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.291273" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.304645" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.304858" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.305044" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.305445" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.305293" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:15.305276" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.305691" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.305863" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.306031" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:15.305240" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.305125" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.306261" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.306339" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:47:15.306500" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:15.232499" elapsed="0.074031"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.307744" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.307441" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:15.321860" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0pkugftrdna8xarqj6mjmtdk216.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:15.322068" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:15.322290" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:15.310291" elapsed="0.012063"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.307862" elapsed="0.014621"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.322996" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.322551" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.307844" elapsed="0.015356"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.332110" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.325695" elapsed="0.006519"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.325134" elapsed="0.007147"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.325092" elapsed="0.007215"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.335127" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.332607" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.332363" elapsed="0.002846"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.332347" elapsed="0.002887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.335868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.335416" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.336210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.335967" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.336777" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.336475" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.336292" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.335949" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.337384" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.337025" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.337737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.337498" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.338274" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.337983" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:15.337818" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.337478" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.338525" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:15.339332" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:15.339036" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.339559" elapsed="0.002516"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:15.324125" elapsed="0.018014"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:15.342185" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:47:15.344652" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:47:15.306803" elapsed="0.037877"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:15.344735" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:47:15.206212" elapsed="0.138648"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:15.345467" elapsed="0.000242"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:15.345146" elapsed="0.000627"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:14.976406" elapsed="0.369459"/>
</test>
<kw name="Teardown_Everything" owner="BgpOperations" type="TEARDOWN">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.347957" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:47:15.371044" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:47:15.371273" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:15.347812" elapsed="0.023524"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:47:15.371488" elapsed="0.000121"/>
</return>
<msg time="2026-05-01T00:47:15.371923" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:47:15.347370" elapsed="0.024614"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.373078" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.372371" elapsed="0.000807"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.375151" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:47:15.375331" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:47:15.374529" elapsed="0.000859"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:47:15.379267" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-05-01T00:47:15.375609" elapsed="0.003814"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.375544" elapsed="0.003995"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.379999" elapsed="0.000057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.380354" elapsed="0.000026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.380555" elapsed="0.000023"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:47:15.373786" elapsed="0.006858"/>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:47:15.347084" elapsed="0.033610"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:15.380911" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:47:15.380837" elapsed="0.000153"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:47:15.381136" elapsed="0.000529"/>
</kw>
<doc>Create and Log the diff between expected and actual responses, make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-05-01T00:47:15.346801" elapsed="0.034925"/>
</kw>
<doc>Basic tests for iBGP peers.

Copyright (c) 2015-2018 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic iBGP functional test cases for
BGP peers in different roles (iBGP, iBGP RR-client):

Test Case 1: Two iBGP RR-client peers introduce prefixes
Expected result: controller forwards updates towards both peers

Test Case 2: Two iBGP peers: one RR client and one non-client introduces prefixes
Expected result: controller forwards updates towards both peers

Test Case 3: Two iBGP RR non-client peers introduce prefixes
Expected result: controller does not forward any update towards peers

Test Case 4: Two iBGP(play.py) RR-client peers configured, first of them configured
with route-reflector-cluster-id, second inherits it's cluster-id from global config.
Each of them introduces 3 prefixes.
Expected result: controller forwards updates towards both peers and each of their
adj-rib-in contains routes. First peer should contain default cluster-id and
second cluster-id from first peers configuration.

For polices see: https://wiki.opendaylight.org/view/BGP_LS_PCEP:BGP</doc>
<status status="PASS" start="2026-05-01T00:46:03.995995" elapsed="71.385763"/>
</suite>
<suite id="s1-s9" name="Ebgp Peers Basic" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.482466" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:15.477625" elapsed="0.004891"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:47:15.477167" elapsed="0.005414"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.487966" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:47:15.483678" elapsed="0.004316"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:47:15.488183" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:15.488075" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.488054" elapsed="0.000197"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.488787" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:15.488415" elapsed="0.000416"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.489307" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:47:15.488998" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:47:15.489913" elapsed="0.000292"/>
</kw>
<msg time="2026-05-01T00:47:15.490303" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:15.490350" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:15.489517" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.490933" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:15.490562" elapsed="0.000397"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.491954" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:15.491676" elapsed="0.000304"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.492393" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:15.492133" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.492883" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.492596" elapsed="0.000313"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.496854" elapsed="0.000216"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.497579" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.497234" elapsed="0.000372"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.497762" elapsed="0.000229"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.498794" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.498499" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:47:15.498866" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:47:15.499026" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:47:15.498187" elapsed="0.000864"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:15.499657" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1bbe5990&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:47:15.499208" elapsed="0.000590"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.499986" elapsed="0.000216"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:47:15.496261" elapsed="0.004003"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:15.496050" elapsed="0.004258"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:47:15.492964" elapsed="0.007376"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.500949" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:15.500536" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.501704" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:15.501163" elapsed="0.000585"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.502294" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:15.501912" elapsed="0.000424"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:47:15.491208" elapsed="0.011184"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:47:15.483313" elapsed="0.019133"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:15.502654" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:15.502538" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.502517" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.506091" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:15.505703" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.506655" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:15.506338" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:15.506726" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:15.506881" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:15.505350" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:15.507924" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.507641" elapsed="0.000316"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.508738" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:47:15.508837" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:47:15.508565" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:15.512529" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:15.511875" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:15.511856" elapsed="0.000800"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.513332" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:47:15.513585" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:47:15.512865" elapsed="0.000774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.514585" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:15.513914" elapsed="0.000776"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.516083" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:15.514964" elapsed="0.001174"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:47:15.517868" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:47:15.518047" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:47:15.517514" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.518434" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:47:15.520103" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:47:16.126200" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:47:15 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:46:05 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:47:15.519732" elapsed="0.606611"/>
</kw>
<msg time="2026-05-01T00:47:16.126427" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.519263" elapsed="0.607334"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:47:15.516618" elapsed="0.610130"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.127632" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:47:16.140599" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:47:16.140970" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:47:16.141199" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:16.127122" elapsed="0.014188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.142084" elapsed="0.001121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.145917" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:16.144591" elapsed="0.001559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.146868" elapsed="0.000078"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.146488" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.146430" elapsed="0.000681"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:47:16.147577" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-05-01T00:47:16.147228" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.147203" elapsed="0.000648"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.147954" elapsed="0.000041"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.153205" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.154380" elapsed="0.000312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.154962" elapsed="0.000226"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:16.148685" elapsed="0.006573"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:47:15.510926" elapsed="0.644513"/>
</kw>
<msg time="2026-05-01T00:47:16.155511" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.510087" elapsed="0.645480"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:47:15.509605" elapsed="0.646043"/>
</kw>
<msg time="2026-05-01T00:47:16.155689" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:15.509057" elapsed="0.646677"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.158767" elapsed="0.000309"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.159247" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.159571" elapsed="0.000099"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:16.156031" elapsed="0.003691"/>
</kw>
<msg time="2026-05-01T00:47:16.159814" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:47:15.508180" elapsed="0.651659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.160276" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:16.160028" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:47:16.160365" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:47:15.507267" elapsed="0.653241"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:15.507087" elapsed="0.653459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:15.506957" elapsed="0.653627"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:47:15.502947" elapsed="0.657692"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:47:16.160798" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.176271" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.176121" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.176102" elapsed="0.000243"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.176659" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:47:16.176762" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.176520" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.177207" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:16.176946" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.177699" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:16.177409" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:16.178514" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:47:16.178274" elapsed="0.000344">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:47:16.178726" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:47:16.178773" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.177908" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.179104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:16.178875" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.178856" elapsed="0.000348"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:16.179979" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.179710" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:47:16.180053" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:16.180205" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:47:16.179416" elapsed="0.000814"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.180388" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.181090" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:47:16.181190" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.180984" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.181372" elapsed="0.002666"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.184493" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:47:16.315642" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.184208" elapsed="0.131541"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.319058" elapsed="0.000335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.319586" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.319892" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:16.316631" elapsed="0.003409"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:16.316045" elapsed="0.004082"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.175843" elapsed="0.144337"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:47:16.161797" elapsed="0.158428"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.161360" elapsed="0.158915"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:16.161216" elapsed="0.159100"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:47:16.161067" elapsed="0.159281"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:47:15.482871" elapsed="0.837534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.323287" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.323174" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.323155" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.329106" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.328993" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.328974" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.330213" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:16.329777" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.330722" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:16.330407" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:16.330793" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:47:16.330956" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:16.329419" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.336874" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.336766" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.336748" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.338194" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:16.338067" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.338049" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:16.338767" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.338414" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.339181" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:16.338956" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.373033" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:16.339884" elapsed="0.033287"/>
</kw>
<msg time="2026-05-01T00:47:16.373306" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:16.373353" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.339367" elapsed="0.034022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.446001" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "e "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "s "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:16.374111" elapsed="0.072075"/>
</kw>
<msg time="2026-05-01T00:47:16.446315" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:16.446425" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.373584" elapsed="0.072906"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.446828" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:16.446572" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.446552" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.447646" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "e "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "s "_ "b "a "s "i "c ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:16.447154" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.448036" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:16.447797" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.447779" elapsed="0.000430"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:16.448244" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.450210" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.451038" elapsed="0.000296"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:47:16.451858" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:16.449407" elapsed="0.002923"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:16.448542" elapsed="0.003937"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:16.337746" elapsed="0.114838"/>
</kw>
<msg time="2026-05-01T00:47:16.452676" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:16.452719" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.337099" elapsed="0.115657"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:16.452941" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:47:16.452833" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.452814" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.453429" elapsed="0.000041"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.453787" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:16.453858" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:16.336475" elapsed="0.117492"/>
</kw>
<msg time="2026-05-01T00:47:16.454058" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:16.454132" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.331362" elapsed="0.122809"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:16.454526" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:16.454248" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:16.454230" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:16.331216" elapsed="0.123412"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:16.331037" elapsed="0.123621"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:16.328679" elapsed="0.126033"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:47:16.321014" elapsed="0.133754"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:16.320584" elapsed="0.134227"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:47:15.476852" elapsed="0.978049"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-01T00:47:16.455057" elapsed="0.000176"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${ODL_SYSTEM_IP}</arg>
<arg>alias=ibgp_peer1_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.455391" elapsed="0.000323"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.457380" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:47:16.457471" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:47:16.457102" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.457656" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.458861" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:47:16.772268" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:47:15 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:47:16 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:47:16.458541" elapsed="0.313880"/>
</kw>
<msg time="2026-05-01T00:47:16.772523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.458155" elapsed="0.314449"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:47:16.456664" elapsed="0.316056"/>
</kw>
<msg time="2026-05-01T00:47:16.772774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.456257" elapsed="0.316563"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:47:16.455921" elapsed="0.316978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${ODL_SYSTEM_IP}</arg>
<arg>alias=ebgp_peer1_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:16.773138" elapsed="0.000345"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:47:16.775660" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:47:16.775741" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:47:16.775354" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.775930" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:47:16.777148" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:47:17.098186" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:47:15 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:47:16 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:47:16.776828" elapsed="0.321490"/>
</kw>
<msg time="2026-05-01T00:47:17.098408" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.776466" elapsed="0.322041"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:47:16.774898" elapsed="0.323716"/>
</kw>
<msg time="2026-05-01T00:47:17.098665" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:16.774097" elapsed="0.324615"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:47:16.773724" elapsed="0.325149"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${ODL_SYSTEM_IP}</arg>
<arg>alias=ebgp_peer2_console</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.099083" elapsed="0.000302"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.101202" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:47:17.101285" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:47:17.100929" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.101488" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.102692" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:47:17.464546" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:47:15 UTC 2026

  System load:  0.13               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:47:17 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:47:17.102357" elapsed="0.362292"/>
</kw>
<msg time="2026-05-01T00:47:17.464717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.101997" elapsed="0.362784"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:47:17.100480" elapsed="0.364398"/>
</kw>
<msg time="2026-05-01T00:47:17.464930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.100026" elapsed="0.364950"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:47:17.099662" elapsed="0.365390"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.466374" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-05-01T00:47:17.479141" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:17.479395" level="INFO">${stdout} = usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_ins...</msg>
<msg time="2026-05-01T00:47:17.479536" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:47:17.479631" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:17.466176" elapsed="0.013504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.481702" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:47:17.481045" elapsed="0.000758"/>
</kw>
<msg time="2026-05-01T00:47:17.482015" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:47:17.482111" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.480091" elapsed="0.002069"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.483541" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:17.482572" elapsed="0.001030"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.484721" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.483782" elapsed="0.001087"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.483734" elapsed="0.001196"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:47:17.485276" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-05-01T00:47:17.485052" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.485018" elapsed="0.000488"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.485709" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.485633" elapsed="0.000167"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:17.485599" elapsed="0.000249"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.486089" elapsed="0.000029"/>
</kw>
<msg time="2026-05-01T00:47:17.486366" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>python3 --help</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:47:17.465819" elapsed="0.020583"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:47:17.486669" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:47:17.486526" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.486500" elapsed="0.000312"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.487024" elapsed="0.000029"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:17.465367" elapsed="0.021764"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.488886" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:47:17.551152" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:17.551426" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:47:17.551567" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:47:17.551660" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:17.488637" elapsed="0.063073"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.553596" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:47:17.552988" elapsed="0.000709"/>
</kw>
<msg time="2026-05-01T00:47:17.553901" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:47:17.553995" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.552141" elapsed="0.001904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.555352" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:17.554416" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.556630" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.555614" elapsed="0.001162"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.555569" elapsed="0.001265"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:47:17.557176" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-05-01T00:47:17.556955" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.556921" elapsed="0.000451"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.557531" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.557476" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:17.557432" elapsed="0.000192"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.557838" elapsed="0.000030"/>
</kw>
<msg time="2026-05-01T00:47:17.558054" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:47:17.488082" elapsed="0.070009"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:47:17.558323" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:47:17.558191" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.558167" elapsed="0.000270"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.558681" elapsed="0.000032"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:47:17.487491" elapsed="0.071309"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.604576" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:47:17.619884" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:47:17.559025" elapsed="0.060943"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:17.620704" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a0eaa10&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:47:17.620206" elapsed="0.000722"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:17.625734" level="INFO">Creating Session using : alias=default, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19ff2c50&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:47:17.625341" elapsed="0.000497"/>
</kw>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="PASS" start="2026-05-01T00:47:17.624914" elapsed="0.001045"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.628405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.628291" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.628272" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:17.628899" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.628670" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.629261" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.629088" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.636353" level="INFO">log:set INFO</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:17.629815" elapsed="0.006594"/>
</kw>
<msg time="2026-05-01T00:47:17.636531" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:17.636613" level="INFO">${message_write} = log:set INFO
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.629465" elapsed="0.007177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.643533" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:17.637162" elapsed="0.006430"/>
</kw>
<msg time="2026-05-01T00:47:17.643694" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:17.643737" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.636819" elapsed="0.006945"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.644069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.643840" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.643821" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.644562" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.644293" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.644926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.644709" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.644690" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:17.645036" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.646848" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:47:17.647033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.646170" elapsed="0.000925"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.647255" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.647422" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:17.645854" elapsed="0.001665"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:17.645326" elapsed="0.002238"/>
</kw>
<arg>log:set ${ODL_LOG_LEVEL}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:17.626320" elapsed="0.021339"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.650521" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.650389" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.650371" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:17.650964" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.650742" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.651317" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.651149" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.700718" level="INFO">log:set DEFAULT org.opendaylight.bgpcep</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:17.651857" elapsed="0.048974"/>
</kw>
<msg time="2026-05-01T00:47:17.700938" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:17.700983" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.bgpcep
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.651521" elapsed="0.049486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.703101" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:17.701558" elapsed="0.001600"/>
</kw>
<msg time="2026-05-01T00:47:17.703254" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:17.703298" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.701187" elapsed="0.002138"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.703643" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.703401" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.703382" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.704115" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.703866" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.704444" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.704228" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.704211" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:17.704571" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.706274" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:47:17.706471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.705705" elapsed="0.000842"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.706708" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.707011" elapsed="0.000029"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:17.705364" elapsed="0.001742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:17.704857" elapsed="0.002296"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.bgpcep</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:17.648001" elapsed="0.059248"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.709743" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.709632" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.709614" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:17.710179" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.709961" elapsed="0.000243"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.710548" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.710363" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.762681" level="INFO">log:set DEFAULT org.opendaylight.protocol</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:17.711072" elapsed="0.051700"/>
</kw>
<msg time="2026-05-01T00:47:17.762882" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:17.762927" level="INFO">${message_write} = log:set DEFAULT org.opendaylight.protocol
</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.710735" elapsed="0.052215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.765108" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:17.763515" elapsed="0.001650"/>
</kw>
<msg time="2026-05-01T00:47:17.765260" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:17.765303" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.763131" elapsed="0.002198"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.765694" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.765463" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.765429" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.766166" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.765917" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.766515" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.766281" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.766264" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:17.766628" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.768289" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:47:17.768492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.767721" elapsed="0.000831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.768730" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.768912" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:17.767386" elapsed="0.001608"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:17.766886" elapsed="0.002287"/>
</kw>
<arg>log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.protocol</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:17.707613" elapsed="0.061685"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
prepare directories for responses, put Python tool to mininet machine, setup imported resources.</doc>
<status status="PASS" start="2026-05-01T00:47:15.476537" elapsed="2.292814"/>
</kw>
<test id="s1-s9-t1" name="Configure_BGP_Peers" line="96">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:17.773017" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:17.772720" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.774268" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.774161" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.774143" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.779869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.779763" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.779745" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.780965" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:17.780556" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.781448" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:17.781154" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:17.781542" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:17.781698" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:17.780164" elapsed="0.001558"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.787786" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.787679" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.787660" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.789066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:17.788959" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.788941" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:17.789607" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.789281" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.790048" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.789832" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.835121" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:17.790594" elapsed="0.044630"/>
</kw>
<msg time="2026-05-01T00:47:17.835385" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:17.835432" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.790238" elapsed="0.045263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:17.883567" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:17.836023" elapsed="0.047648"/>
</kw>
<msg time="2026-05-01T00:47:17.883831" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:17.883877" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "B "G "P "_ "P "e "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.835679" elapsed="0.048235"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.884219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.883992" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.883973" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.884768" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "B "G "P "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.884443" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.885158" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.884901" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.884883" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:17.885272" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:17.888726" elapsed="0.000200"/>
</kw>
<msg time="2026-05-01T00:47:17.889009" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.887240" elapsed="0.001990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.889639" elapsed="0.000108"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.890107" elapsed="0.000106"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:17.886360" elapsed="0.004006"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:17.885628" elapsed="0.004846"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:17.788631" elapsed="0.101983"/>
</kw>
<msg time="2026-05-01T00:47:17.890741" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:17.890802" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "B "G "P "_ "P "e "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.788011" elapsed="0.102844"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:17.891111" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:47:17.890961" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.890935" elapsed="0.000293"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.891807" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.892280" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:17.892432" elapsed="0.000061"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:17.787325" elapsed="0.105307"/>
</kw>
<msg time="2026-05-01T00:47:17.892761" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:17.892821" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "f "i "g "u "r "e "_ "B "G "P "_ "P "e "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.782105" elapsed="0.110769"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.893393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.892980" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.892955" elapsed="0.000540"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:17.781960" elapsed="0.111561"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:17.781780" elapsed="0.111771"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:17.779391" elapsed="0.114215"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:17.773875" elapsed="0.119787"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:17.773433" elapsed="0.120273"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:17.770223" elapsed="0.123535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.894785" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-ibgp-peer1 | IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ibgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPEN...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-ibgp-peer1</arg>
<arg>IP=${iBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ibgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.893928" elapsed="0.000887"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.932219" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:17.931845" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:17.933024" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:17.932772" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:17.933227" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:17.932419" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.933820" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:17.933420" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:17.934147" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:17.934298" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:17.934010" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.934744" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.934498" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.935754" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ibgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:17.935492" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.936264" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.936000" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.936994" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.936687" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.937813" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.937589" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.937890" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:17.938044" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.937248" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.938224" elapsed="0.000252"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:47:17.936546" elapsed="0.001971"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.939063" level="INFO">${value} = example-ibgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.938767" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.939968" level="INFO">${encoded} = example-ibgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.939757" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.940046" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.940197" level="INFO">${encoded_value} = example-ibgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.939275" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.940376" elapsed="0.000240"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ibgp-peer1</var>
<status status="PASS" start="2026-05-01T00:47:17.938632" elapsed="0.002025"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.941228" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.940907" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.941995" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.941785" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.942070" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.942219" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.941466" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.942397" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:47:17.940771" elapsed="0.001904"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.943217" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.942923" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.943972" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.943763" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.944046" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:17.944195" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.943430" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.944371" elapsed="0.000246"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:47:17.942788" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.945234" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.944918" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.946038" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.945822" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.946116" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.946270" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.945479" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.946505" elapsed="0.000251"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:47:17.944778" elapsed="0.002022"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.947355" level="INFO">${value} = ibgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.947054" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.948166" level="INFO">${encoded} = ibgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.947951" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.948245" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.948404" level="INFO">${encoded_value} = ibgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.947626" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.948601" elapsed="0.000227"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-05-01T00:47:17.946915" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.949471" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.949122" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.950225" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.950013" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.950304" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:17.950475" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.949692" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.950658" elapsed="0.000225"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:17.948986" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.951686" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.951178" elapsed="0.000535"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.952441" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.952225" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.952535" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:17.952690" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.951906" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.952869" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:17.951040" elapsed="0.002094"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.953737" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.953419" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.954670" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.954276" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.954747" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.954902" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.953955" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.955082" elapsed="0.000224"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:17.953278" elapsed="0.002070"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.955923" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.955623" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.956690" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.956476" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.956768" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:17.956924" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.956139" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.957105" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:17.955484" elapsed="0.002044"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.958082" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.957783" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.958840" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.958632" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.958916" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:17.959068" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.958298" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.959246" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:17.957644" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.960067" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:17.959773" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:17.960820" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.960613" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:17.960896" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:17.961044" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:17.960281" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:17.961245" elapsed="0.000244"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:17.959637" elapsed="0.001893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:17.936338" elapsed="0.025227"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:17.961608" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:17.961773" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ibgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:17.935154" elapsed="0.026645"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:17.934856" elapsed="0.026976"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.962009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:17.961857" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:17.934838" elapsed="0.027247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:17.963005" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:17.962232" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:17.963083" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:17.931217" elapsed="0.031990"/>
</kw>
<msg time="2026-05-01T00:47:17.963262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:17.916999" elapsed="0.046310"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.977352" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:17.991132" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.004974" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.005181" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.005374" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.005774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.005626" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.005612" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.005996" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.006165" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.006332" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.005583" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.005476" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.006575" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.006652" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:18.006773" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:17.912309" elapsed="0.094492"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.035967" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.035594" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.036714" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.036506" elapsed="0.000272">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.036870" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.036156" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.037462" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.037057" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.037786" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:18.037913" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:18.037653" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.038375" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;$RR_CLIENT&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.038134" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:18.038813" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.038520" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.039339" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ibgp-peer1', 'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ibgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.039042" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.038895" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.038501" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.040399" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.039592" elapsed="0.000837"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.040495" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.034966" elapsed="0.005655"/>
</kw>
<msg time="2026-05-01T00:47:18.040679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.020913" elapsed="0.019812"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.054626" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.068309" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.082062" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.082257" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.082434" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.082856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.082710" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.082696" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.083079" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.083247" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.083415" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.082666" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.082560" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.083661" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.083737" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:18.083869" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:18.018062" elapsed="0.065836"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.085148" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.084913" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.085303" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.084572" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.085674" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.085397" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.086216" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.085926" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.085755" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.085379" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.088847" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.086465" elapsed="0.002408"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:18.088924" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.089077" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:18.084231" elapsed="0.004871"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.090525" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.090258" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.090966" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.090730" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.091488" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.091228" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.091928" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.091689" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:18.092806" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:47:18.092596" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:47:18.093158" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:47:18.092987" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.093334" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.093966" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.093722" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:47:18.094051" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:18.094207" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:47:18.092176" elapsed="0.002056"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:18.119746" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1075', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:47:18.119815" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:47:18 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:18.119923" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:18.096856" elapsed="0.023092"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.094302" elapsed="0.025691"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.120175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.120019" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.094285" elapsed="0.025981"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.123864" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.121221" elapsed="0.002687"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.121001" elapsed="0.002942"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.120983" elapsed="0.002985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.126867" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.124245" elapsed="0.002667"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.124024" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.124007" elapsed="0.002964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.127526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.127137" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.127860" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.127622" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.128461" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.128145" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.127977" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.127605" elapsed="0.000942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.129073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.128711" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.129408" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.129170" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.129985" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.129688" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.129519" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.129152" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.130220" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:18.131036" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.130754" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.131219" elapsed="0.002659"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:18.120648" elapsed="0.013293"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:18.134112" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:47:18.134007" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.133989" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.134349" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.134416" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:18.136954" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:18.089470" elapsed="0.047511"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.137044" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:18.137196" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:17.900210" elapsed="0.237011"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.137583" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.137317" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.137300" elapsed="0.000376"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.137710" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:47:17.895105" elapsed="0.242727"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.138899" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-ebgp-peer1 | IP=127.0.0.3 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ebgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPEN...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-ebgp-peer1</arg>
<arg>IP=${eBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ebgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<arg>AS_NUMBER=${eBGP_PEER1_AS}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.138050" elapsed="0.000878"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.175873" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.175502" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.176654" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.176391" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.176811" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.176062" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.177377" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.176998" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.177737" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:18.177886" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:18.177580" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.178308" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.178069" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.179310" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer1', 'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false', 'AS_NUMBER': '32768'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.179052" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.179797" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.179536" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.180494" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.180186" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.181237" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.181027" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.181312" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:18.181484" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.180708" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.181690" elapsed="0.000225"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:47:18.180051" elapsed="0.001904"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.182515" level="INFO">${value} = example-ebgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.182203" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.183394" level="INFO">${encoded} = example-ebgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.183185" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.183485" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:18.183637" level="INFO">${encoded_value} = example-ebgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.182867" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.183814" elapsed="0.000220"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer1</var>
<status status="PASS" start="2026-05-01T00:47:18.182069" elapsed="0.002005"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.184633" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.184320" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.185423" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.185216" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.185520" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.185684" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.184897" elapsed="0.000813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.185867" elapsed="0.000222"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:47:18.184187" elapsed="0.001942"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.186695" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.186375" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.187431" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.187225" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.187523" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.187673" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.186909" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.187848" elapsed="0.000218"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:47:18.186241" elapsed="0.001865"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.188662" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.188351" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.189392" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.189187" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.189481" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.189656" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.188872" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.189835" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:47:18.188218" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.190647" level="INFO">${value} = ebgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.190337" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.191381" level="INFO">${encoded} = ebgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.191175" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.191471" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:18.191626" level="INFO">${encoded_value} = ebgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.190859" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.191803" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ebgp</var>
<status status="PASS" start="2026-05-01T00:47:18.190204" elapsed="0.001859"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.192621" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.192310" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.194367" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.193151" elapsed="0.001248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.194482" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:47:18.194655" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.192834" elapsed="0.001846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.194835" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:18.192176" elapsed="0.002920"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.195660" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.195345" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.196437" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.196229" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.196530" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.196681" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.195912" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.196858" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.195210" elapsed="0.001907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.197713" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.197363" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.198466" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.198242" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.198544" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.198695" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.197927" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.198871" elapsed="0.000219"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:18.197230" elapsed="0.001900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.199686" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.199376" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.200422" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.200215" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.200513" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.200662" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.199899" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.200838" elapsed="0.000217"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.199243" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.201747" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.201340" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.202548" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.202282" elapsed="0.000292"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.202624" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.202776" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.201964" elapsed="0.000837"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.202952" elapsed="0.000220"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.201206" elapsed="0.002007"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.203772" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.203474" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.204525" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.204302" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.204600" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.204752" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.203986" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.204929" elapsed="0.000219"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:18.203325" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.205774" level="INFO">${value} = 32768</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.205436" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.206768" level="INFO">${encoded} = 32768</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.206555" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.206844" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.206996" level="INFO">${encoded_value} = 32768</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.206214" elapsed="0.000807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.207175" elapsed="0.000221"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">32768</var>
<status status="PASS" start="2026-05-01T00:47:18.205302" elapsed="0.002134"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:18.179869" elapsed="0.027619"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:18.207533" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:18.207696" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer1', 'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:18.178729" elapsed="0.028994"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.178419" elapsed="0.029335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.207928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.207778" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.178401" elapsed="0.029603"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.208918" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.208148" elapsed="0.000799"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.208995" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.174878" elapsed="0.034241"/>
</kw>
<msg time="2026-05-01T00:47:18.209172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.160922" elapsed="0.048297"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.223159" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.236910" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.250717" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.250912" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.251089" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.251473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.251304" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.251290" elapsed="0.000308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.251747" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.251919" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.252088" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.251262" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.251161" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.252314" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.252389" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:18.252527" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:18.156231" elapsed="0.096323"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.281754" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.281360" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.282528" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.282307" elapsed="0.000285">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.282685" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.281973" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.283252" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.282875" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.283590" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:18.283720" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:18.283440" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.284145" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;$AS_NUMBER&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.283905" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:18.284577" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.284269" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.285105" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer1', 'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.284809" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.284661" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.284251" elapsed="0.000973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.286229" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.285375" elapsed="0.000885"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.286309" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.280745" elapsed="0.005691"/>
</kw>
<msg time="2026-05-01T00:47:18.286510" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.266572" elapsed="0.019986"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.300316" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.314159" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.328115" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.328313" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.328505" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.328872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.328726" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.328712" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.329093" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.329262" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.329428" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.328683" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.328580" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.329672" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.329747" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:18.329877" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:18.263702" elapsed="0.066248"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.331241" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.331003" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.331397" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.330665" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.331758" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.331510" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.332298" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.332009" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.331839" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.331491" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.335132" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.332551" elapsed="0.002608"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:18.335213" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.335368" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:18.330286" elapsed="0.005106"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.336777" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.336530" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.337213" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;32768&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.336978" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.337682" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.337424" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.338146" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.337880" elapsed="0.000309"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:18.339035" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:47:18.338849" elapsed="0.000212"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:47:18.339389" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:47:18.339219" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.339584" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.340192" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.339947" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:47:18.340279" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.340433" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:47:18.338397" elapsed="0.002076"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:18.355139" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '961', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;32768&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:47:18.355202" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:18.355300" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:18.342892" elapsed="0.012434"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.340581" elapsed="0.014791"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.355583" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.355401" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.340562" elapsed="0.015110"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.359396" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.356613" elapsed="0.002826"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.356374" elapsed="0.003116"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.356356" elapsed="0.003160"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.362425" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.359797" elapsed="0.002701"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.359572" elapsed="0.002968"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.359556" elapsed="0.003009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.363102" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.362733" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.363436" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.363199" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.363996" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.363699" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.363534" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.363181" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.364617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.364243" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.364949" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.364713" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.365500" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.365192" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.365029" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.364695" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.365736" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:18.366596" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.366306" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.366779" elapsed="0.002617"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:18.356022" elapsed="0.013451"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:18.369649" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:47:18.369543" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.369524" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.369886" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.369954" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:47:18.372508" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:18.335730" elapsed="0.036805"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.372600" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:47:18.372751" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:18.144045" elapsed="0.228730"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.373106" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.372872" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.372855" elapsed="0.000342"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.373229" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ebgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:47:18.139214" elapsed="0.234137"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.374385" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-ebgp-peer2 | IP=127.0.0.4 | HOLDTIME=180 | PEER_PORT=17900 | PEER_ROLE=ebgp | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPEN...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-ebgp-peer2</arg>
<arg>IP=${eBGP_PEER2_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PEER_ROLE=ebgp</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>RR_CLIENT=false</arg>
<arg>AS_NUMBER=${eBGP_PEER2_AS}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.373535" elapsed="0.000879"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.411254" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.410883" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.412011" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.411798" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.412168" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.411460" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.412759" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.412357" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.413079" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:18.413213" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:18.412947" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.413772" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.413462" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.414813" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer2', 'IP': '127.0.0.4', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'RR_CLIENT': 'false', 'AS_NUMBER': '32768'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.414553" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.415279" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.415021" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.415985" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.415693" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.416742" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.416530" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.416818" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.416969" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.416198" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.417145" elapsed="0.000222"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:47:18.415557" elapsed="0.001851"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.417969" level="INFO">${value} = example-ebgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.417673" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.418930" level="INFO">${encoded} = example-ebgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.418717" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.419014" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.419165" level="INFO">${encoded_value} = example-ebgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.418198" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.419343" elapsed="0.000249"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer2</var>
<status status="PASS" start="2026-05-01T00:47:18.417537" elapsed="0.002097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.420177" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.419882" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.420934" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.420726" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.421010" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.421158" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.420390" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.421336" elapsed="0.000423"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:47:18.419746" elapsed="0.002055"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.422377" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.422052" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.423138" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.422929" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.423213" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.423363" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.422609" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.423558" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:47:18.421914" elapsed="0.001948"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.424411" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.424117" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.425168" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.424959" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.425243" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.425392" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.424642" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.425586" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:47:18.423979" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.426405" level="INFO">${value} = ebgp</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.426105" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.427159" level="INFO">${encoded} = ebgp</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.426951" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.427235" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.427384" level="INFO">${encoded_value} = ebgp</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.426634" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.427577" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ebgp</var>
<status status="PASS" start="2026-05-01T00:47:18.425958" elapsed="0.001890"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.428393" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.428097" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.429251" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.428946" elapsed="0.000331"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.429327" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.429497" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.428629" elapsed="0.000893"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.429676" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:18.427960" elapsed="0.001976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.430524" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.430212" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.431259" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.431052" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.431334" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.431498" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.430737" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.431677" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.430047" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.432500" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.432184" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.433415" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.433202" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.433507" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.433656" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.432714" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.433839" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:47:18.432048" elapsed="0.002099"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.434717" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.434400" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.435469" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.435248" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.435547" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.435695" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.434932" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.435873" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.434263" elapsed="0.001869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.436692" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.436379" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.437430" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.437224" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.437522" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.437670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.436908" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.437847" elapsed="0.000219"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:47:18.436244" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.438697" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.438384" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.439431" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.439225" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.439541" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.439691" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.438911" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.439875" elapsed="0.000220"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:47:18.438248" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.440695" level="INFO">${value} = 32768</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:47:18.440384" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:47:18.441439" level="INFO">${encoded} = 32768</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.441223" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:47:18.441531" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.441680" level="INFO">${encoded_value} = 32768</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:47:18.440908" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.441857" elapsed="0.000218"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">32768</var>
<status status="PASS" start="2026-05-01T00:47:18.440249" elapsed="0.001880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:47:18.415352" elapsed="0.026812"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:47:18.442215" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:47:18.442378" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer2', 'IP': '127.0.0.4', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:47:18.414213" elapsed="0.028191"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.413886" elapsed="0.028551"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.442629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.442477" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.413867" elapsed="0.028839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.443631" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.442853" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.443745" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.410256" elapsed="0.033616"/>
</kw>
<msg time="2026-05-01T00:47:18.443925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.396081" elapsed="0.047891"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.458074" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.471796" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.485592" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.485793" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.485971" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.486368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.486220" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.486204" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.486607" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.486777" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.486944" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.486153" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.486051" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.487171" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.487247" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:18.487368" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:18.391437" elapsed="0.095957"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.516567" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.516174" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.517293" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.517091" elapsed="0.000265">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.517462" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.516760" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.518032" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.517654" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.518383" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:47:18.518525" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:47:18.518221" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.518950" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;$AS_NUMBER&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.518711" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:47:18.519363" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.519073" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.519954" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer2', 'IP': '127.0.0.4', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_ROLE': 'ebgp', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.519653" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.519482" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.519055" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.521018" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.520190" elapsed="0.000858"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.521097" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.515558" elapsed="0.005665"/>
</kw>
<msg time="2026-05-01T00:47:18.521279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.501502" elapsed="0.019823"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.535635" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.549470" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.563554" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.563827" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.564013" elapsed="0.000027"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.564493" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.564314" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:47:18.564294" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.564732" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.564899" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.565067" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:47:18.564246" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.564115" elapsed="0.001031"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.565293" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.565369" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:47:18.565545" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:47:18.498648" elapsed="0.066927"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:47:18.566988" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.566706" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:47:18.567153" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.566272" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.567564" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.567248" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.568135" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.567841" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.567656" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.567230" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.570821" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.568371" elapsed="0.002477"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:47:18.570932" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:47:18.571091" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:47:18.565917" elapsed="0.005199"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.572520" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.572257" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.572959" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;32768&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.572723" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.573408" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.573168" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.573861" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.573624" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:18.574747" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:47:18.574548" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:47:18.575097" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:47:18.574927" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.575272" elapsed="0.000222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.575893" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.575650" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:47:18.575976" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.576129" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:47:18.574106" elapsed="0.002048"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:18.595299" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '961', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;32768&lt;/peer-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:47:18.595441" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:18.595689" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:18.578692" elapsed="0.017054"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.576223" elapsed="0.019622"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.596324" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.595968" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.576206" elapsed="0.020353"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.602722" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.598764" elapsed="0.004018"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.598187" elapsed="0.004643"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.598148" elapsed="0.004717"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.606917" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.603250" elapsed="0.003731"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.602942" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.602920" elapsed="0.004143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.607729" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.607294" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.608063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.607826" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.608621" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.608309" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.608145" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.607809" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.609218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.608863" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.609562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.609313" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.610094" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.609804" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:47:18.609642" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.609296" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.610326" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:47:18.611150" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:18.610869" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.611330" elapsed="0.002681"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:47:18.597371" elapsed="0.016702"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:47:18.614245" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:18.614139" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.614121" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.614539" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.614610" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:47:18.617141" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:47:18.571445" elapsed="0.045723"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.617230" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:47:18.617384" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:47:18.379452" elapsed="0.237957"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.617812" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.617534" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.617517" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:47:18.617940" elapsed="0.000033"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ebgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:47:18.374717" elapsed="0.243355"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:18.618707" elapsed="0.000284"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:18.618359" elapsed="0.000707"/>
</kw>
<doc>Configure an iBGP and two eBGP peers</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:17.769426" elapsed="0.849681"/>
</test>
<test id="s1-s9-t2" name="Connect_iBGP_Peer1" line="144">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:18.622638" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:18.622313" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.623900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:18.623792" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.623774" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.629572" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:18.629443" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.629425" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.630664" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:18.630243" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.631142" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:18.630851" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:18.631211" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:47:18.631365" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:18.629869" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.638624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:18.638509" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.638488" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.639870" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:18.639764" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.639746" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:18.640383" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:18.640087" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:18.640807" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:18.640588" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:18.672175" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:18.641329" elapsed="0.030950"/>
</kw>
<msg time="2026-05-01T00:47:18.672445" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:18.672512" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:18.640994" elapsed="0.031556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:18.696003" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:18.673065" elapsed="0.023036"/>
</kw>
<msg time="2026-05-01T00:47:18.696295" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:18.696341" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:18.672723" elapsed="0.023654"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.696710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.696484" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.696435" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.697222" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.696929" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.697587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.697354" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.697336" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:18.697698" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:18.700259" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:47:18.700479" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:18.699142" elapsed="0.001472"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.700890" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.701225" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:18.698515" elapsed="0.002896"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:18.697967" elapsed="0.003529"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:18.639434" elapsed="0.062160"/>
</kw>
<msg time="2026-05-01T00:47:18.701685" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:18.701729" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:18.638848" elapsed="0.062918"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:18.701946" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:18.701841" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.701823" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.702431" elapsed="0.000052"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.702824" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:18.702897" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:18.638126" elapsed="0.064878"/>
</kw>
<msg time="2026-05-01T00:47:18.703095" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:18.703139" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:18.631783" elapsed="0.071392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:18.703523" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:18.703248" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:18.703231" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:18.631639" elapsed="0.071985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:18.631441" elapsed="0.072213"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:18.628986" elapsed="0.074722"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:18.623504" elapsed="0.080294"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:18.623052" elapsed="0.080793"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:18.619845" elapsed="0.084051"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:18.704055" elapsed="0.000106"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.755195" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 0 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:18.754758" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.755685" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 0 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.755408" elapsed="0.000325"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:18.760112" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 0 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-05-01T00:47:18.760206" level="INFO">${output} =  python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 0 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:18.755895" elapsed="0.004338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:18.760662" level="INFO"> python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 0 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:18.760398" elapsed="0.000311"/>
</kw>
<arg>${iBGP_PEER1_COMMAND}</arg>
<arg>${iBGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:47:18.754198" elapsed="0.006571"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:47:28.762863" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.762489" elapsed="10.001090">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.763878" elapsed="0.000035"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:47:18.762199" elapsed="10.001839">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:47:18.761762" elapsed="10.002419"/>
</kw>
<msg time="2026-05-01T00:47:28.764293" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:18.761346" elapsed="10.002973"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:47:28.764534" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:47:28.764417" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.764391" elapsed="0.000236"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.764869" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.765048" elapsed="0.000021"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:47:18.761061" elapsed="10.004067"/>
</kw>
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:28.773871" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:28.774021" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:47:28 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:28.774140" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:28.765764" elapsed="0.008403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.777336" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:28.774335" elapsed="0.003138"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.780350" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:28.777638" elapsed="0.002761"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:47:28.780574" elapsed="0.002825"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:47:28.765351" elapsed="0.018126"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:28.784204" elapsed="0.000275"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:28.783884" elapsed="0.000663"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:18.619348" elapsed="10.165240"/>
</test>
<test id="s1-s9-t3" name="Connect_eBGP_Peer1" line="152">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:28.788079" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:28.787810" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:28.789370" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:28.789256" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.789237" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:28.795012" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:28.794904" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.794887" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.796094" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:28.795709" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.796597" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:28.796286" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:28.796668" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:28.796825" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:28.795313" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:28.802993" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:28.802883" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.802864" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:28.804277" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:28.804170" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.804152" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:28.804825" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:28.804519" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:28.805229" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:28.805014" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:28.829691" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:28.805797" elapsed="0.023992"/>
</kw>
<msg time="2026-05-01T00:47:28.829949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:28.829995" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:28.805416" elapsed="0.024616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:28.849372" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:28.830568" elapsed="0.018922"/>
</kw>
<msg time="2026-05-01T00:47:28.849698" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:28.849745" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:28.830203" elapsed="0.019580"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.850087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:28.849861" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.849842" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.850628" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:28.850310" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.850995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:28.850762" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.850744" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:28.851107" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:28.853633" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:47:28.853839" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:28.852565" elapsed="0.001404"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.854251" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.854615" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:28.851935" elapsed="0.002865"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:28.851387" elapsed="0.003476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:28.803868" elapsed="0.051119"/>
</kw>
<msg time="2026-05-01T00:47:28.855077" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:28.855121" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:28.803218" elapsed="0.051940"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:28.855341" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:47:28.855234" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.855216" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.855849" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.856186" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:28.856257" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:28.802524" elapsed="0.053841"/>
</kw>
<msg time="2026-05-01T00:47:28.856471" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:28.856517" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:28.797234" elapsed="0.059320"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:28.856879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:28.856629" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:28.856612" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:28.797087" elapsed="0.059891"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:28.796907" elapsed="0.060100"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:28.794533" elapsed="0.062528"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:28.788967" elapsed="0.068148"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:28.788525" elapsed="0.068671"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:28.785387" elapsed="0.071863"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:28.857408" elapsed="0.000122"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.867196" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1.l...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:47:28.866853" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.867646" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1.log &amp;&gt;ebgp_peer1.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:28.867385" elapsed="0.000307"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:28.871601" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1.log &amp;&gt;ebgp_peer1.log</msg>
<msg time="2026-05-01T00:47:28.871695" level="INFO">${output} =  python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1....</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:28.867845" elapsed="0.003876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:28.872132" level="INFO"> python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1.log &amp;&gt;ebgp_peer1.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:28.871887" elapsed="0.000291"/>
</kw>
<arg>${eBGP_PEER1_COMMAND}</arg>
<arg>${eBGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:47:28.866463" elapsed="0.005771"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:47:38.874320" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:47:28.873828" elapsed="10.001247">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.875410" elapsed="0.000056"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:47:28.873559" elapsed="10.002035">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:47:28.873142" elapsed="10.002595"/>
</kw>
<msg time="2026-05-01T00:47:38.875859" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:47:28.872788" elapsed="10.003098"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:47:38.876090" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:47:38.875993" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.875965" elapsed="0.000222"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.876429" elapsed="0.000041"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.876625" elapsed="0.000035"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:47:28.872508" elapsed="10.004215"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:38.877412" elapsed="0.000346"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:38.877035" elapsed="0.000792"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:47:28.784940" elapsed="10.092928"/>
</test>
<test id="s1-s9-t4" name="Check_IPv4_Topology_For_First_Path" line="159">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:38.882390" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:38.882113" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:38.883724" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:38.883597" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.883578" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:38.889488" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:38.889362" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.889343" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.890589" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:38.890177" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.891080" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:38.890782" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:38.891152" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:47:38.891310" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:38.889795" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:38.897332" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:38.897222" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.897203" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:38.898621" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:38.898512" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.898493" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:38.899152" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:38.898845" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:38.899585" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:38.899345" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:38.933041" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:38.900119" elapsed="0.033024"/>
</kw>
<msg time="2026-05-01T00:47:38.933325" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:38.933372" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:38.899778" elapsed="0.033631"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:38.959688" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "_ "F "o "r "_ "F "i "r "s "t "_ "P "a "t "h "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:38.933952" elapsed="0.025843"/>
</kw>
<msg time="2026-05-01T00:47:38.959968" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:38.960015" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:38.933606" elapsed="0.026445"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.960363" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:38.960130" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.960110" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.960920" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "_ "F "o "r "_ "F "i "r "s "t "_ "P "a "t "h "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:38.960616" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.961280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:38.961059" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.961040" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:38.961393" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:38.964066" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:47:38.964280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:38.962876" elapsed="0.001607"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.964770" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.965260" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:38.962233" elapsed="0.003216"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:38.961696" elapsed="0.003840"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:38.898183" elapsed="0.067451"/>
</kw>
<msg time="2026-05-01T00:47:38.965726" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:38.965771" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:38.897575" elapsed="0.068232"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:38.965993" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:47:38.965884" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.965865" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.966500" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.966838" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:38.966909" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:38.896879" elapsed="0.070138"/>
</kw>
<msg time="2026-05-01T00:47:38.967111" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:38.967156" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:38.891737" elapsed="0.075455"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:38.967535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:38.967267" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:38.967250" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:38.891590" elapsed="0.076048"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:38.891392" elapsed="0.076277"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:38.888929" elapsed="0.078795"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:38.883284" elapsed="0.084496"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:38.882839" elapsed="0.084985"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:38.879034" elapsed="0.088861"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:38.974252" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:38.974398" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:38.974514" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:38.969135" elapsed="0.005406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.977568" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:38.974711" elapsed="0.002905"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.980461" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:38.977778" elapsed="0.002769"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:38.983522" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:38.980710" elapsed="0.002883">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:38.968731" elapsed="0.014970">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:39.994301" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:39.994512" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:39.994660" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:39.985758" elapsed="0.008939"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:39.998775" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:39.994949" elapsed="0.003892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:40.002813" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:39.999067" elapsed="0.003812"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:40.006225" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:40.003101" elapsed="0.003194">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:39.984615" elapsed="0.021792">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:41.015621" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:41.015845" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:41.016038" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:41.007971" elapsed="0.008111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:41.021414" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:41.016406" elapsed="0.005118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:41.026242" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:41.021819" elapsed="0.004472"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:41.029958" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:41.026486" elapsed="0.003554">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:41.007115" elapsed="0.023061">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:42.040986" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:42.041183" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:42.041336" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:42.032275" elapsed="0.009099"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:42.045500" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:42.041659" elapsed="0.003910"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:42.049563" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:42.045796" elapsed="0.003835"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:42.053808" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:42.049854" elapsed="0.004056">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:42.031130" elapsed="0.022945">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:43.064783" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:43.064969" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:43.065116" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:43.056204" elapsed="0.008950"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:43.069252" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:43.065406" elapsed="0.003918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:43.073380" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:43.069576" elapsed="0.003854"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:43.076613" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:43.073608" elapsed="0.003080">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:43.055057" elapsed="0.021742">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:44.087250" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:44.087551" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:44.087794" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:44.078570" elapsed="0.009370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:44.093652" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:44.088331" elapsed="0.005388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:44.097715" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:44.093945" elapsed="0.003836"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:44.103135" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:44.097998" elapsed="0.005286">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:44.077537" elapsed="0.026016">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:45.114703" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:45.114889" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:45.115036" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:45.105974" elapsed="0.009100"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:45.119136" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:45.115323" elapsed="0.003879"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:45.123319" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:45.119446" elapsed="0.003976"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:45.126706" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:45.123671" elapsed="0.003107">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:45.104820" elapsed="0.022068">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:46.137631" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:46.137821" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:46.137964" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:46.129038" elapsed="0.008963"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:46.142566" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:46.138246" elapsed="0.004388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:46.146650" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:46.142862" elapsed="0.003854"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:46.150213" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:46.146934" elapsed="0.003352">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:46.127884" elapsed="0.022619">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:47.159149" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:47.159383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:47.159627" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:47.152026" elapsed="0.007635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:47.162627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:47.159851" elapsed="0.002823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:47.165567" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:47.162835" elapsed="0.002781"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:47.168602" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:47.165774" elapsed="0.002903">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:47.151314" elapsed="0.017475">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:48.178754" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:48.178938" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:48.179082" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:48.170896" elapsed="0.008223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:48.183276" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:48.179388" elapsed="0.003954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:48.187448" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:48.183588" elapsed="0.003951"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:48.191994" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:48.187763" elapsed="0.004331">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:48.169752" elapsed="0.022496">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:47:49.204141" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:47:49.204584" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:47:49.204791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:47:49.194382" elapsed="0.010446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.208918" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:49.205194" elapsed="0.003786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.213472" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:49.209187" elapsed="0.004357"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.217487" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:47:49.213740" elapsed="0.003846">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:47:49.193608" elapsed="0.024137">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<msg time="2026-05-01T00:47:49.217881" level="FAIL">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</msg>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER1_NEXT_HOP}"</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:47:38.968068" elapsed="10.249933">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<arg>${CONFIG_SESSION}</arg>
<arg>"prefix":"${eBGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.218504" elapsed="0.000040"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.220264" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:47:49.219886" elapsed="0.000429"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:47:49.219376" elapsed="0.003494"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:47:49.218939" elapsed="0.004040"/>
</kw>
<doc>The IPv4 topology shall contain the route announced by the first eBGP</doc>
<status status="FAIL" start="2026-05-01T00:47:38.878386" elapsed="10.344662">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"1.1.1.1"'</status>
</test>
<test id="s1-s9-t5" name="iBGP_Check_Log_For_Introduced_Prefixes" line="171">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:47:49.227976" elapsed="0.000281"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:47:49.227692" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:49.229494" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:49.229319" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.229288" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:49.237002" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:49.236858" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.236831" elapsed="0.000261"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.238428" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:47:49.237919" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.239043" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:47:49.238687" elapsed="0.000388"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:47:49.239128" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:47:49.239321" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:47:49.237416" elapsed="0.001936"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:49.246826" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:49.246704" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.246683" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:47:49.248319" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:47:49.248192" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.248171" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:47:49.248963" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:47:49.248607" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:47:49.249444" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:49.249186" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:47:49.282033" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:47:49.250086" elapsed="0.032140"/>
</kw>
<msg time="2026-05-01T00:47:49.282475" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:47:49.282537" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:49.249686" elapsed="0.032896"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:47:49.308313" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:47:49.283191" elapsed="0.025313"/>
</kw>
<msg time="2026-05-01T00:47:49.308704" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:47:49.308750" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:49.282802" elapsed="0.025985"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.309228" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:49.308909" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.308868" elapsed="0.000450"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.309897" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "I "n "t "r "o "d "u "c "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:49.309504" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.310312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:49.310041" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.310022" elapsed="0.000370"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:47:49.310432" elapsed="0.000069"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:49.314143" elapsed="0.002463"/>
</kw>
<msg time="2026-05-01T00:47:49.316699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:47:49.312662" elapsed="0.004225"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.317280" elapsed="0.000107"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.317799" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:47:49.311732" elapsed="0.006336"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:47:49.310904" elapsed="0.007286"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:47:49.247846" elapsed="0.070484"/>
</kw>
<msg time="2026-05-01T00:47:49.318515" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:49.318582" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:49.247086" elapsed="0.071686"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:47:49.319043" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:47:49.318888" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.318861" elapsed="0.000301"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.319764" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.320241" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:47:49.320341" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:47:49.246304" elapsed="0.074209"/>
</kw>
<msg time="2026-05-01T00:47:49.320644" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:47:49.320705" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:49.239917" elapsed="0.080837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:47:49.321213" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:47:49.320859" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-05-01T00:47:49.320835" elapsed="0.000485"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:47:49.239739" elapsed="0.081615"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:47:49.239520" elapsed="0.081879"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:47:49.236359" elapsed="0.085158"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:47:49.228994" elapsed="0.092602"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:47:49.228499" elapsed="0.093156"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:47:49.224750" elapsed="0.096975"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:47:49.321956" elapsed="0.000180"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.322808" level="INFO">${total_prefix_count} = 2</msg>
<var>${total_prefix_count}</var>
<arg>${eBGP_PEER1_PREFIX_COUNT}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:47:49.322355" elapsed="0.000480"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:49.337097" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:49.350418" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:49.350577" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:49.336928" elapsed="0.013685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.351196" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:49.350843" elapsed="0.000415"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:49.351886" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:49.352016" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:49.351490" elapsed="0.000624">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:49.336519" elapsed="0.015744">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:50.373099" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:50.386603" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:50.386861" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:50.372901" elapsed="0.014021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:50.388102" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:50.387358" elapsed="0.000852"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:50.389281" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:50.389535" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:50.388614" elapsed="0.001078">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:50.372337" elapsed="0.017608">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:51.413344" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:51.426881" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:51.427102" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:51.413152" elapsed="0.014005"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:51.428193" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:51.427571" elapsed="0.000721"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:51.429286" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:51.429540" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:51.428667" elapsed="0.001034">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:51.412626" elapsed="0.017334">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:52.450639" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:52.464912" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:52.465232" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:52.450406" elapsed="0.014888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:52.466605" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:52.465826" elapsed="0.000890"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:52.467897" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:52.468121" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:52.467104" elapsed="0.001190">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:52.449807" elapsed="0.018797">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:53.490000" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:53.503958" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:53.504189" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:53.489793" elapsed="0.014452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:53.505314" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:53.504675" elapsed="0.000738"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:53.507532" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:53.507746" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:53.506862" elapsed="0.001031">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:53.489182" elapsed="0.018943">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:54.528291" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:54.541089" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:54.541234" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:54.528026" elapsed="0.013247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:54.541927" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:54.541543" elapsed="0.000454"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:54.542629" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:54.542759" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:54.542222" elapsed="0.000624">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:54.527308" elapsed="0.015695">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:55.564174" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:55.577376" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:55.577641" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:55.563975" elapsed="0.013726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:55.578776" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:55.578086" elapsed="0.000815"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:55.579977" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:55.580185" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:55.579295" elapsed="0.001036">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:55.563417" elapsed="0.017181">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:56.600233" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:56.612950" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:56.613180" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:56.600036" elapsed="0.013201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:56.614373" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:56.613740" elapsed="0.000767"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:56.615516" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:56.615727" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:56.614861" elapsed="0.001007">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:56.599434" elapsed="0.016665">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:57.635327" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:57.648500" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:57.648723" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:57.635131" elapsed="0.013649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:57.649875" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:57.649184" elapsed="0.000790"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:57.650969" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:57.651171" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:57.650313" elapsed="0.001001">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:57.634585" elapsed="0.016993">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:58.672333" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:58.684995" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:58.685228" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:58.672130" elapsed="0.013153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:58.686358" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:58.685727" elapsed="0.000773"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:58.687595" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:58.687811" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:58.686869" elapsed="0.001087">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:58.671544" elapsed="0.016646">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:47:59.712235" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:47:59.726476" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:47:59.726733" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:47:59.712028" elapsed="0.014746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:47:59.727634" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:47:59.727102" elapsed="0.000604"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:47:59.728371" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:47:59.728541" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:47:59.727944" elapsed="0.000699">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:47:59.711435" elapsed="0.017376">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:00.748615" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:00.761446" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:00.761584" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:00.748376" elapsed="0.013235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:00.762303" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:00.761796" elapsed="0.000607"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:00.763408" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:00.763648" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:00.762782" elapsed="0.001009">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:00.747664" elapsed="0.016360">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:01.784424" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:01.797767" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:01.797940" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:01.784218" elapsed="0.013765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:01.798818" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:01.798296" elapsed="0.000598"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:01.799675" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:01.799841" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:01.799166" elapsed="0.000773">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:01.783633" elapsed="0.016496">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:02.821224" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:02.834548" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:02.834813" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:02.821014" elapsed="0.013861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:02.836158" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:02.835393" elapsed="0.000877"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:02.837367" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:02.837630" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:02.836680" elapsed="0.001109">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:02.820406" elapsed="0.017640">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:03.861721" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:03.875076" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:03.875308" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:03.861427" elapsed="0.013938"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:03.876499" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:03.875793" elapsed="0.000817"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:03.877629" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:03.877839" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:03.876962" elapsed="0.001024">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:03.860693" elapsed="0.017533">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:04.901817" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:04.914470" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:04.914641" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:04.901605" elapsed="0.013068"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:04.915603" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:04.914928" elapsed="0.000802"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:04.916987" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:04.917246" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:04.916160" elapsed="0.001261">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:04.901013" elapsed="0.016740">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:05.940106" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:06.535362" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:06.535673" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:05.939905" elapsed="0.595811"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:06.536547" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:06.536056" elapsed="0.000561"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:06.537271" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:06.537415" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:06.536838" elapsed="0.000735">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:05.939325" elapsed="0.598504">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:07.559904" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:07.573085" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:07.573238" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:07.559690" elapsed="0.013584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:07.573966" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:07.573548" elapsed="0.000480"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:07.574653" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:07.574794" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:07.574240" elapsed="0.000651">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:07.559084" elapsed="0.015962">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:08.595779" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:09.071756" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:09.072136" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:08.595582" elapsed="0.476619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:09.073521" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:09.072762" elapsed="0.000871"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:09.074715" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:09.074943" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:09.074007" elapsed="0.001090">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:08.595041" elapsed="0.480318">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:10.094653" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:10.107682" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:10.107928" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:10.094437" elapsed="0.013547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.109093" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:10.108379" elapsed="0.000821"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.110270" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:10.110526" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:10.109602" elapsed="0.001082">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:10.093839" elapsed="0.017097">0 != 2</status>
</kw>
<msg time="2026-05-01T00:48:10.111151" level="FAIL">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</msg>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:47:49.323000" elapsed="20.788366">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</status>
</kw>
<kw name="Count_Key_Value_Pairs" owner="BGPcliKeywords">
<var>${count}</var>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>Network Address of Next Hop</arg>
<arg>${eBGP_PEER1_NEXT_HOP}</arg>
<doc>Check file for ${keyword} or ${keyword} ${value} pair and returns number of occurences</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.128109" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${eBGP_PEER1_PREFIX_COUNT}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.128308" elapsed="0.000022"/>
</kw>
<kw name="Count_Key_Value_Pairs" owner="BGPcliKeywords">
<var>${count}</var>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>Network Address of Next Hop</arg>
<arg>${eBGP_PEER2_NEXT_HOP}</arg>
<doc>Check file for ${keyword} or ${keyword} ${value} pair and returns number of occurences</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.140650" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.140843" elapsed="0.000021"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.142212" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:48:10.141896" elapsed="0.000359"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:48:10.141511" elapsed="0.000794"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:48:10.141172" elapsed="0.001194"/>
</kw>
<doc>Check incomming updates for introduced routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:47:49.223904" elapsed="20.918501">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</status>
</test>
<test id="s1-s9-t6" name="Connect_eBGP_Peer2" line="194">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:10.146170" elapsed="0.000249"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:10.145897" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:10.147563" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:10.147404" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.147380" elapsed="0.000262"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:10.153252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:10.153143" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.153125" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.154343" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:10.153952" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.154841" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:10.154546" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:10.154912" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:48:10.155074" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:10.153571" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:10.161282" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:10.161172" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.161152" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:10.162595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:10.162486" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.162445" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:10.163121" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:10.162815" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:10.163566" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:10.163309" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:10.191250" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:10.164116" elapsed="0.027403"/>
</kw>
<msg time="2026-05-01T00:48:10.191812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:10.191864" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:10.163753" elapsed="0.028150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:10.210814" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:10.192726" elapsed="0.018198"/>
</kw>
<msg time="2026-05-01T00:48:10.211090" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:10.211136" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:10.192199" elapsed="0.018973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.211576" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:10.211277" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.211245" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.212154" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:10.211835" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.212527" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:10.212291" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.212272" elapsed="0.000415"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:10.212729" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:10.215609" elapsed="0.000169"/>
</kw>
<msg time="2026-05-01T00:48:10.215841" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:10.214374" elapsed="0.001604"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.216254" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.216719" elapsed="0.000088"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:10.213689" elapsed="0.003244"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:10.213080" elapsed="0.003918"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:10.162160" elapsed="0.054937"/>
</kw>
<msg time="2026-05-01T00:48:10.217193" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:10.217238" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:10.161547" elapsed="0.055731"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:10.217484" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:48:10.217357" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.217337" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.217995" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.218347" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:10.218420" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:10.160831" elapsed="0.057718"/>
</kw>
<msg time="2026-05-01T00:48:10.218646" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:10.218690" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:10.155502" elapsed="0.063228"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:10.219062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:10.218809" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:10.218791" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:10.155339" elapsed="0.063825"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:10.155155" elapsed="0.064044"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:10.152779" elapsed="0.066481"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:10.147094" elapsed="0.072225"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:10.146646" elapsed="0.072722"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:10.143208" elapsed="0.076217"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:10.219611" elapsed="0.000107"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.229570" level="INFO">${start_cmd} = python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2.l...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:48:10.229218" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.230001" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2.log &amp;&gt;ebgp_peer2.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:10.229758" elapsed="0.000326"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:10.234092" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2.log &amp;&gt;ebgp_peer2.log</msg>
<msg time="2026-05-01T00:48:10.234187" level="INFO">${output} =  python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2....</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:10.230242" elapsed="0.003971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:10.234639" level="INFO"> python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 2 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2.log &amp;&gt;ebgp_peer2.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:10.234377" elapsed="0.000310"/>
</kw>
<arg>${eBGP_PEER2_COMMAND}</arg>
<arg>${eBGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:48:10.228831" elapsed="0.005912"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:48:20.236901" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:48:10.236367" elapsed="10.001300">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.238013" elapsed="0.000039"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:48:10.236094" elapsed="10.002084">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:48:10.235659" elapsed="10.002661"/>
</kw>
<msg time="2026-05-01T00:48:20.238442" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:48:10.235284" elapsed="10.003200"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:48:20.238690" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:48:20.238588" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.238562" elapsed="0.000217"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.239033" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.239216" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:48:10.235003" elapsed="10.004296"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:48:20.239956" elapsed="0.000314"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:48:20.239601" elapsed="0.000735"/>
</kw>
<doc>Connect BGP peer and check empty topology</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:48:10.142734" elapsed="10.097641"/>
</test>
<test id="s1-s9-t7" name="Disconnect_eBGP_Peer1" line="201">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:20.244877" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:20.244602" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:20.246183" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:20.246060" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.246042" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:20.251853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:20.251746" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.251728" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:20.252932" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:20.252548" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:20.253413" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:20.253123" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:20.253499" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:48:20.253658" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:20.252154" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:20.259762" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:20.259653" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.259634" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:20.261027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:20.260919" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.260901" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:20.261576" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:20.261246" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:20.262004" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:20.261768" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:20.293615" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:20.262656" elapsed="0.031056"/>
</kw>
<msg time="2026-05-01T00:48:20.293892" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:20.293940" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:20.262194" elapsed="0.031782"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:20.333491" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:20.294515" elapsed="0.039086"/>
</kw>
<msg time="2026-05-01T00:48:20.333773" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:20.333820" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:20.294149" elapsed="0.039708"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.334173" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:20.333939" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.333919" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:20.334735" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:20.334403" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.335106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:20.334871" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.334852" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:20.335220" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:20.337822" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:48:20.338031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:20.336708" elapsed="0.001455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.338447" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.338811" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:20.336061" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:20.335519" elapsed="0.003665"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:20.260615" elapsed="0.078668"/>
</kw>
<msg time="2026-05-01T00:48:20.339376" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:20.339421" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:20.259989" elapsed="0.079489"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:20.339705" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:48:20.339595" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.339575" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.340198" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.340554" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:20.340626" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:20.259299" elapsed="0.081435"/>
</kw>
<msg time="2026-05-01T00:48:20.340827" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:20.340871" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:20.254140" elapsed="0.086768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:20.341236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:20.340983" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:20.340966" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:20.253992" elapsed="0.087345"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:20.253809" elapsed="0.087557"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:20.251373" elapsed="0.090047"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:20.245768" elapsed="0.095722"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:20.245312" elapsed="0.096226"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:20.241622" elapsed="0.099968"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:20.341749" elapsed="0.000106"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:20.342944" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:20.342638" elapsed="0.000367"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:20.343164" elapsed="0.000211"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:48:20.342351" elapsed="0.001090"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:48:22.344447" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:48:22.344851" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:48:20.343624" elapsed="2.001291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.346108" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:22.345387" elapsed="0.000833"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:48:20.342037" elapsed="2.004318"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:22.362144" level="INFO">Executing command 'cat ebgp_peer1.log'.</msg>
<msg time="2026-05-01T00:48:22.375301" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:22.375548" level="INFO">${output_log} = 2026-05-01 00:47:28,942 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:28,942 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:47:28,942 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:22.361985" elapsed="0.013625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.376588" level="INFO">2026-05-01 00:47:28,942 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:28,942 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:47:28,942 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:47:28,943 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:47:28,943 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:47:28,944 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 2
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-05-01 00:47:28,945 INFO BGP-Thread-1 (job):   My Autonomous System number: 32768
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Next Hop: 1.1.1.1
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 2
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 1]
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:47:28,946 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:47:28,946 DEBUG BGP-Thread-1 (job):   My Autonomous System=32768 (0x8000)
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206410400008000
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104800000b47f0000031002060104000100010206410400008000'
2026-05-01 00:47:28,947 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104800000b47f0000031002060104000100010206410400008000
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:28,948 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:28,949 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 2
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:28,949 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030401010101)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304010101011c08000000
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:47:28,950 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:47:28,951 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.16')]
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,953 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030401010101)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.16')]/28 (0x1c08000010)
2026-05-01 00:47:28,954 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304010101011c08000010
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): Number of iterations: 2
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 2
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.005101919174194336s
2026-05-01 00:47:28,954 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job):   
2026-05-01 00:47:28,955 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000800040050400000064)
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:47:28,955 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000800040050400000064
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:28,956 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:28,957 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:38,967 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:38,967 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-05-01 00:47:38,967 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:38,967 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:38,967 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:48,978 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:48,978 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-05-01 00:47:48,978 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:48,978 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:48,978 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:58,988 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:58,988 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.030s
2026-05-01 00:47:58,988 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:58,988 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:58,989 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:08,999 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:08,999 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.040s
2026-05-01 00:48:08,999 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:08,999 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:08,999 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:19,010 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:19,010 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.050s
2026-05-01 00:48:19,011 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:19,011 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:19,011 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:22.375980" elapsed="0.001128"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:48:22.378383" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/ebgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/ebgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:48:22.377575" elapsed="0.000965"/>
</kw>
<arg>${eBGP_PEER1_LOG_FILE}</arg>
<arg>${eBGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:48:22.361570" elapsed="0.017110"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:48:22.380019" elapsed="0.000581"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:48:22.379296" elapsed="0.001448"/>
</kw>
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:48:20.240988" elapsed="2.139843"/>
</test>
<test id="s1-s9-t8" name="Check_IPv4_Topology_For_Second_Path" line="208">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:22.388153" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:22.387887" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:22.389463" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:22.389314" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.389293" elapsed="0.000248"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:22.395211" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:22.395096" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.395078" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.396299" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:22.395908" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.396802" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:22.396505" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:22.396874" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:48:22.397036" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:22.395532" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:22.403207" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:22.403099" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.403081" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:22.404509" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:22.404378" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.404360" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:22.405040" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:22.404727" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:22.405443" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:22.405229" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:22.438637" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:22.405983" elapsed="0.032752"/>
</kw>
<msg time="2026-05-01T00:48:22.438896" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:22.438941" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:22.405648" elapsed="0.033329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:22.463101" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "_ "F "o "r "_ "S "e "c "o "n "d "_ "P "a "t "h "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:22.439508" elapsed="0.023697"/>
</kw>
<msg time="2026-05-01T00:48:22.463364" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:22.463479" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:22.439148" elapsed="0.024372"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.463834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:22.463601" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.463580" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.464358" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "_ "F "o "r "_ "S "e "c "o "n "d "_ "P "a "t "h "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:22.464059" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.464734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:22.464515" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.464496" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:22.464845" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:22.467505" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:48:22.467714" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:22.466298" elapsed="0.001551"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.468146" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.468516" elapsed="0.000198"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:22.465658" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:22.465112" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:22.404075" elapsed="0.064924"/>
</kw>
<msg time="2026-05-01T00:48:22.469091" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:22.469135" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:22.403430" elapsed="0.065743"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:22.469356" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:48:22.469248" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.469230" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.469880" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.470232" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:22.470303" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:22.402746" elapsed="0.067665"/>
</kw>
<msg time="2026-05-01T00:48:22.470664" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:22.470710" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "I "P "v "4 "_ "T "o "p "o "l "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:22.397435" elapsed="0.073313"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:22.471117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:22.470827" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:22.470809" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:22.397290" elapsed="0.073931"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:22.397117" elapsed="0.074136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:22.394732" elapsed="0.076580"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:22.389019" elapsed="0.082349"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:22.388583" elapsed="0.082929"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:22.383445" elapsed="0.088125"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:22.480289" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:22.480437" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:22.480574" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:22.472806" elapsed="0.007794"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.483464" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:22.480770" elapsed="0.002744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.486367" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:22.483676" elapsed="0.002740"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:22.490566" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:22.486591" elapsed="0.004076">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:22.472371" elapsed="0.018450">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:23.501359" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:23.501611" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:23.501763" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:23.492963" elapsed="0.008838"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:23.505892" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:23.502059" elapsed="0.003900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:23.509939" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:23.506188" elapsed="0.003801"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:23.513138" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:23.510152" elapsed="0.003062">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:23.491797" elapsed="0.021533">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:24.524113" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:24.524390" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:24.524572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:24.515445" elapsed="0.009166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:24.528701" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:24.524862" elapsed="0.003906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:24.533147" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:24.529015" elapsed="0.004201"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:24.536373" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:24.533439" elapsed="0.003005">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:24.514263" elapsed="0.022308">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:25.547009" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:25.547285" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:25.547542" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:25.538606" elapsed="0.008999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:25.552216" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:25.548024" elapsed="0.004261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:25.556365" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:25.552563" elapsed="0.003870"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:25.560738" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:25.556700" elapsed="0.004136">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:25.537423" elapsed="0.023588">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:26.571372" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:26.571630" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:26.571775" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:26.563053" elapsed="0.008760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:26.575893" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:26.572109" elapsed="0.003850"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:26.580155" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:26.576225" elapsed="0.004076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:26.583505" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:26.580551" elapsed="0.003029">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:26.561961" elapsed="0.021730">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:27.593402" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:27.593627" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:27.593774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:27.585901" elapsed="0.007911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:27.598355" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:27.594069" elapsed="0.004353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:27.602490" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:27.598674" elapsed="0.003886"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:27.606792" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:27.602785" elapsed="0.004115">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:27.584739" elapsed="0.022325">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:28.617352" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:28.617671" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:28.617900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:28.609107" elapsed="0.008852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:28.622799" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:28.618352" elapsed="0.004513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:28.626841" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:28.623112" elapsed="0.003795"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:28.631108" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:28.627146" elapsed="0.004070">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:28.608006" elapsed="0.023366">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:29.640901" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:29.641087" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:29.641231" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:29.633595" elapsed="0.007673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:29.645351" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:29.641543" elapsed="0.003874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:29.649425" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:29.645662" elapsed="0.003850"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:29.653914" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:29.649732" elapsed="0.004279">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:29.632379" elapsed="0.021785">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:30.664246" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:30.664436" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:30.664616" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:30.656262" elapsed="0.008390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:30.668936" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:30.664905" elapsed="0.004098"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:30.673051" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:30.669236" elapsed="0.003882"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:30.677412" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:30.673341" elapsed="0.004194">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:30.655088" elapsed="0.022605">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:31.688597" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:31.688891" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:31.689120" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:31.679758" elapsed="0.009520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:31.693789" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:31.689771" elapsed="0.004087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:31.698050" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:31.694090" elapsed="0.004029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:31.701272" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:31.698296" elapsed="0.003050">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:31.678645" elapsed="0.022830">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:32.711873" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:32.712093" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:32.712288" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:32.703592" elapsed="0.008747"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.717333" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:32.712698" elapsed="0.004707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.721754" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:32.717671" elapsed="0.004151"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.726283" level="FAIL">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:32.722044" elapsed="0.004319">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="FAIL" start="2026-05-01T00:48:32.702403" elapsed="0.024092">'{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<msg time="2026-05-01T00:48:32.726590" level="FAIL">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</msg>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Content</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>"node-id":"${eBGP_PEER2_NEXT_HOP}"</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:48:22.471745" elapsed="10.254942">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</kw>
<kw name="Check_Example_IPv4_Topology_Content" owner="BgpOperations">
<arg>${CONFIG_SESSION}</arg>
<arg>"prefix":"${eBGP_PEER2_FIRST_PREFIX_IP}/${PREFIX_LEN}"</arg>
<doc>Check the example-ipv4-topology content for string</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.726944" elapsed="0.000027"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.728329" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:48:32.728003" elapsed="0.000372"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:48:32.727621" elapsed="0.000805"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:48:32.727281" elapsed="0.001220"/>
</kw>
<doc>The IPv4 topology shall contain the route announced by the second eBGP now</doc>
<status status="FAIL" start="2026-05-01T00:48:22.381752" elapsed="10.346810">Keyword 'BgpOperations.Check_Example_IPv4_Topology_Content' failed after retrying for 10 seconds. The last error was: '{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}' does not contain '"node-id":"2.2.2.2"'</status>
</test>
<test id="s1-s9-t9" name="iBGP_Check_Log_For_Updated_Prefixes" line="220">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:32.732741" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:32.732446" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:32.734127" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:32.733998" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.733973" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:32.739889" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:32.739778" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.739759" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.741004" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:32.740615" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.741559" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:32.741239" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:32.741631" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:48:32.741795" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:32.740199" elapsed="0.001620"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:32.748273" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:32.748158" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.748138" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:32.749673" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:32.749536" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.749509" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:32.750289" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:32.749952" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:32.750763" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:32.750524" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:32.783487" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:32.751298" elapsed="0.032421"/>
</kw>
<msg time="2026-05-01T00:48:32.784088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:32.784195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:32.750954" elapsed="0.033321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:32.812030" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "U "p "d "a "t "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:32.785587" elapsed="0.026612"/>
</kw>
<msg time="2026-05-01T00:48:32.812438" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:32.812538" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:32.784712" elapsed="0.027881"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.813051" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:32.812710" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.812680" elapsed="0.000530"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.813902" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "U "p "d "a "t "e "d "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:32.813431" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.814520" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:32.814171" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.814143" elapsed="0.000495"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:32.814689" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:32.818622" elapsed="0.000217"/>
</kw>
<msg time="2026-05-01T00:48:32.818931" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:32.816887" elapsed="0.002239"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.819568" elapsed="0.000304"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.820286" elapsed="0.000116"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:32.815929" elapsed="0.004667"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:32.815106" elapsed="0.005589"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:32.749175" elapsed="0.071670"/>
</kw>
<msg time="2026-05-01T00:48:32.820989" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:32.821057" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:32.748519" elapsed="0.072675"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:32.821511" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:48:32.821316" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.821287" elapsed="0.000357"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.822226" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.822596" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:32.822672" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:32.747808" elapsed="0.074975"/>
</kw>
<msg time="2026-05-01T00:48:32.822877" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:32.822921" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:32.742217" elapsed="0.080742"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:32.823292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:32.823036" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:32.823019" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:32.742066" elapsed="0.081327"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:32.741878" elapsed="0.081546"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:32.739391" elapsed="0.084107"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:32.733685" elapsed="0.089870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:32.733203" elapsed="0.090398"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:32.729705" elapsed="0.093951"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:32.823822" elapsed="0.000107"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.824478" level="INFO">${total_prefix_count} = 4</msg>
<var>${total_prefix_count}</var>
<arg>${eBGP_PEER1_PREFIX_COUNT} + ${eBGP_PEER2_PREFIX_COUNT}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:32.824088" elapsed="0.000418"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:32.838933" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:32.851901" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:32.852113" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:32.838765" elapsed="0.013402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.853172" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:32.852570" elapsed="0.000699"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:32.854255" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:32.854449" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:32.853639" elapsed="0.000983">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:32.838340" elapsed="0.016511">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:33.874422" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:33.887593" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:33.887821" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:33.874222" elapsed="0.013660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:33.888977" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:33.888264" elapsed="0.000817"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:33.890093" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:33.890298" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:33.889426" elapsed="0.001013">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:33.873669" elapsed="0.017033">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:34.910827" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:34.923778" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:34.924007" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:34.910632" elapsed="0.013432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:34.925137" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:34.924522" elapsed="0.000717"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:34.926245" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:34.926444" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:34.925617" elapsed="0.001001">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:34.910091" elapsed="0.016760">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:35.947358" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:35.963841" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:35.964077" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:35.947156" elapsed="0.016980"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:35.965194" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:35.964563" elapsed="0.000734"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:35.966316" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:35.966559" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:35.965675" elapsed="0.001035">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:35.946612" elapsed="0.020336">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:36.989449" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:37.002544" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:37.002697" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:36.989220" elapsed="0.013514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:37.003569" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:37.002983" elapsed="0.000691"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:37.004706" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:37.004921" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:37.004021" elapsed="0.001045">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:36.988655" elapsed="0.016648">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:38.027626" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:38.040431" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:38.040700" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:38.027399" elapsed="0.013358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:38.041794" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:38.041139" elapsed="0.000757"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:38.042929" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:38.043136" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:38.042238" elapsed="0.001043">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:38.026825" elapsed="0.016723">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:39.064010" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:39.076603" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:39.076833" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:39.063812" elapsed="0.013080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:39.077945" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:39.077273" elapsed="0.000775"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:39.079137" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:39.079351" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:39.078497" elapsed="0.001044">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:39.063258" elapsed="0.016524">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:40.099524" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:40.113010" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:40.113255" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:40.099092" elapsed="0.014223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:40.114422" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:40.113790" elapsed="0.000771"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:40.115574" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:40.115780" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:40.114907" elapsed="0.001017">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:40.098009" elapsed="0.018217">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:41.138146" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:41.151239" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:41.151347" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:41.137949" elapsed="0.013424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:41.151865" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:41.151563" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:41.152341" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:41.152447" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:41.152064" elapsed="0.000477">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:41.137387" elapsed="0.015265">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:42.175655" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:42.188550" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:42.188724" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:42.175423" elapsed="0.013339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:42.189439" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:42.189007" elapsed="0.000529"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:42.190154" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:42.190301" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:42.189755" elapsed="0.000647">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:42.174769" elapsed="0.015821">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:43.204737" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:43.217810" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:43.217920" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:43.204542" elapsed="0.013404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:43.218424" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:43.218122" elapsed="0.000369"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:43.218942" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:43.219047" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:43.218658" elapsed="0.000459">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:43.203988" elapsed="0.015238">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:44.242040" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:44.254751" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:44.254860" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:44.241704" elapsed="0.013183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:44.255365" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:44.255065" elapsed="0.000346"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:44.255885" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:44.255986" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:44.255584" elapsed="0.000472">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:44.241116" elapsed="0.015046">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:45.278361" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:45.291070" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:45.291228" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:45.278162" elapsed="0.013101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:45.291934" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:45.291529" elapsed="0.000468"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:45.292631" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:45.292763" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:45.292213" elapsed="0.000643">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:45.277584" elapsed="0.015422">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:46.315018" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:46.328315" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:46.328670" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:46.314818" elapsed="0.013918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:46.329951" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:46.329214" elapsed="0.000846"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:46.331176" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:46.331393" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:46.330438" elapsed="0.001139">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:46.314247" elapsed="0.017587">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:47.353503" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:47.366613" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:47.366765" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:47.353154" elapsed="0.013649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:47.367506" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:47.367053" elapsed="0.000525"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:47.368206" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:47.368349" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:47.367800" elapsed="0.000677">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:47.352580" elapsed="0.016064">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:48.392420" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:48.405839" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:48.406059" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:48.392224" elapsed="0.013891"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:48.407149" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:48.406530" elapsed="0.000718"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:48.408234" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:48.408432" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:48.407617" elapsed="0.000988">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:48.391696" elapsed="0.017139">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:49.427660" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:49.440525" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:49.440755" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:49.427466" elapsed="0.013351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:49.441892" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:49.441199" elapsed="0.000795"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:49.442992" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:49.443206" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:49.442337" elapsed="0.001012">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:49.426920" elapsed="0.016693">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:50.463512" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:50.476478" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:50.476594" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:50.463298" elapsed="0.013324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:50.477526" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:50.476842" elapsed="0.000790"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:50.478655" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:50.478867" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:50.477980" elapsed="0.001035">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:50.462752" elapsed="0.016501">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:51.500919" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:51.514018" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:51.514246" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:51.500721" elapsed="0.013584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:51.515354" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:51.514734" elapsed="0.000753"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:51.516531" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:51.516735" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:51.515836" elapsed="0.001043">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:51.500117" elapsed="0.016993">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:52.537863" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:52.550449" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:52.550732" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:52.537669" elapsed="0.013123"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:52.551935" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:52.551208" elapsed="0.000835"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:52.553111" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:52.553331" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:52.552411" elapsed="0.001104">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:52.537126" elapsed="0.016644">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:53.573502" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:53.586093" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:53.586213" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:53.573289" elapsed="0.012951"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.586756" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:53.586421" elapsed="0.000381"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.587721" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:53.587955" level="FAIL">0 != 4</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:53.586966" elapsed="0.001141">0 != 4</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:53.572754" elapsed="0.015604">0 != 4</status>
</kw>
<msg time="2026-05-01T00:48:53.588607" level="FAIL">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 4</msg>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>nlri_prefix_received:</arg>
<arg>${total_prefix_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:48:32.824676" elapsed="20.764143">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 4</status>
</kw>
<kw name="Count_Key_Value_Pairs" owner="BGPcliKeywords">
<var>${count}</var>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>Network Address of Next Hop</arg>
<arg>${eBGP_PEER1_NEXT_HOP}</arg>
<doc>Check file for ${keyword} or ${keyword} ${value} pair and returns number of occurences</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.605867" elapsed="0.000039"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${eBGP_PEER1_PREFIX_COUNT}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.606106" elapsed="0.000021"/>
</kw>
<kw name="Count_Key_Value_Pairs" owner="BGPcliKeywords">
<var>${count}</var>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>Network Address of Next Hop</arg>
<arg>${eBGP_PEER2_NEXT_HOP}</arg>
<doc>Check file for ${keyword} or ${keyword} ${value} pair and returns number of occurences</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.618424" elapsed="0.000038"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${eBGP_PEER2_PREFIX_COUNT}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.618633" elapsed="0.000021"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.620101" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:53.619576" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-05-01T00:48:53.620376" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:53.620220" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.620195" elapsed="0.000271"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:48:53.620663" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.621789" level="FAIL">'4834' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:48:53.621415" elapsed="0.000441">'4834' does not contain '-'</status>
</kw>
<msg time="2026-05-01T00:48:53.621949" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:48:53.621049" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.622505" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4834</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:53.622151" elapsed="0.000382"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.623083" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4834</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:48:53.622768" elapsed="0.000341"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.623599" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:53.623290" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.624149" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4834

Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 4</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-05-01T00:48:53.623782" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.624617" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4834</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:53.624352" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.625325" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4834'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-05-01T00:48:53.624979" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-05-01T00:48:53.624727" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.624709" elapsed="0.000722"/>
</if>
<arg>4834</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:48:53.619102" elapsed="0.006394"/>
</kw>
<doc>Check incomming updates for updated routes</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4834</tag>
<status status="FAIL" start="2026-05-01T00:48:32.729054" elapsed="20.896554">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4834

Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 4</status>
</test>
<test id="s1-s9-t10" name="Disconnect_eBGP_Peer2" line="244">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:53.629962" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:53.629694" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:53.631381" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:53.631269" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.631250" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:53.637160" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:53.637052" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.637035" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.638238" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:53.637861" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.638743" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:53.638429" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:53.638814" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:48:53.638974" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:53.637482" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:53.645000" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:53.644890" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.644871" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:53.646245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:53.646139" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.646122" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:53.646798" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:53.646486" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:53.647256" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:53.646998" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:53.675178" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:53.647806" elapsed="0.027570"/>
</kw>
<msg time="2026-05-01T00:48:53.675618" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:53.675667" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:53.647448" elapsed="0.028257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:53.696385" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:53.676352" elapsed="0.020279"/>
</kw>
<msg time="2026-05-01T00:48:53.696872" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:53.696924" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:53.675938" elapsed="0.021024"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.697474" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:53.697093" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.697051" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.698143" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "e "e "r "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:53.697723" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.698651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:53.698395" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.698376" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:53.698770" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:53.701603" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:48:53.701822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:53.700438" elapsed="0.001531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.702250" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.702620" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:53.699769" elapsed="0.003041"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:53.699126" elapsed="0.003750"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:53.645839" elapsed="0.057136"/>
</kw>
<msg time="2026-05-01T00:48:53.703070" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:53.703115" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:53.645225" elapsed="0.057931"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:53.703646" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:48:53.703531" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.703235" elapsed="0.000497"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.704154" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.704520" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:53.704591" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:53.644554" elapsed="0.060149"/>
</kw>
<msg time="2026-05-01T00:48:53.704797" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:53.704840" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "e "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:53.639420" elapsed="0.065457"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:53.705358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:53.704954" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:53.704937" elapsed="0.000498"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:53.639271" elapsed="0.066204"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:53.639055" elapsed="0.066457"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:53.636685" elapsed="0.068888"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:53.630962" elapsed="0.074669"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:53.630395" elapsed="0.075284"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:53.626909" elapsed="0.078827"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer2_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:53.705909" elapsed="0.000108"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:53.707144" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:53.706826" elapsed="0.000345"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:53.707363" elapsed="0.000321"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:48:53.706552" elapsed="0.001235"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.708528" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:48:55.708760" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:48:53.707945" elapsed="2.000846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.709485" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.709093" elapsed="0.000443"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:48:53.706203" elapsed="2.003402"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.720205" level="INFO">Executing command 'cat ebgp_peer2.log'.</msg>
<msg time="2026-05-01T00:48:55.733539" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:55.733682" level="INFO">${output_log} = 2026-05-01 00:48:10,310 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:48:10,311 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-05-01 00:48:10,311 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:55.720060" elapsed="0.013662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.734612" level="INFO">2026-05-01 00:48:10,310 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:48:10,311 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-05-01 00:48:10,311 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:48:10,311 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:48:10,311 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:48:10,312 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:48:10,312 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:48:10,312 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 2
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   My Autonomous System number: 32768
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706436
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Next Hop: 2.2.2.2
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 2
2026-05-01 00:48:10,313 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 1]
2026-05-01 00:48:10,313 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:48:10,314 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   My Autonomous System=32768 (0x8000)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706436 (0x7f000004)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206410400008000
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104800000b47f0000041002060104000100010206410400008000'
2026-05-01 00:48:10,314 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104800000b47f0000041002060104000100010206410400008000
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:48:10,315 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:48:10,316 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 2
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:48:10,316 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:48:10,319 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:48:10,319 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,320 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030402020202)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304020202021c08000000
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:48:10,321 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:48:10,322 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:48:10,323 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-05-01 00:48:10,323 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:48:10,323 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:48:10,323 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.16')]
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:48:10,324 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030402020202)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.16')]/28 (0x1c08000010)
2026-05-01 00:48:10,325 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304020202021c08000010
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): Number of iterations: 2
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 2
2026-05-01 00:48:10,325 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.008870363235473633s
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job):   
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job):   
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job):   
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job):   
2026-05-01 00:48:10,326 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:48:10,326 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:48:10,326 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:10,326 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:48:10,326 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:48:10,326 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000800040050400000064)
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:48:10,327 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000800040050400000064
2026-05-01 00:48:20,335 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-05-01 00:48:20,335 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.008s
2026-05-01 00:48:20,335 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:20,335 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:20,335 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:30,344 INFO BGP-Thread-1 (job): ... idle for 10.009s
2026-05-01 00:48:30,345 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.017s
2026-05-01 00:48:30,345 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:30,345 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:30,345 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:40,346 INFO BGP-Thread-1 (job): ... idle for 10.001s
2026-05-01 00:48:40,347 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.018s
2026-05-01 00:48:40,347 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:40,347 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:40,347 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:50,357 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:50,358 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.028s
2026-05-01 00:48:50,358 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:50,358 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:50,358 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.733968" elapsed="0.001129"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:48:55.736304" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/ebgp_peer2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/ebgp_peer2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:48:55.735554" elapsed="0.000876"/>
</kw>
<arg>${eBGP_PEER2_LOG_FILE}</arg>
<arg>${eBGP_PEER2_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:48:55.719637" elapsed="0.017009"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:48:55.738019" elapsed="0.000622"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:48:55.737302" elapsed="0.001483"/>
</kw>
<doc>Stop BGP peer, store logs and wait for empty topology</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:48:53.626267" elapsed="2.112602"/>
</test>
<test id="s1-s9-t11" name="Check_For_Empty_IPv4_Topology" line="251">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:55.744910" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:55.744641" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.746277" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.746105" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.746081" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.752234" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.752115" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.752095" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.753350" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:55.752950" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.753862" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:55.753562" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:55.753934" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:48:55.754105" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:55.752563" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.760644" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.760524" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.760504" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.761968" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.761852" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.761833" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:55.762559" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:55.762196" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.762990" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:55.762753" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.794760" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:55.763572" elapsed="0.031293"/>
</kw>
<msg time="2026-05-01T00:48:55.795067" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:55.795125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.763196" elapsed="0.031975"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.820910" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:55.795744" elapsed="0.025276"/>
</kw>
<msg time="2026-05-01T00:48:55.821189" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:55.821303" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "I "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.795357" elapsed="0.025988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.821695" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.821428" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.821407" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.822266" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "I "P "v "4 "_ "T "o "p "o "l "o "g "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.821929" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.822656" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.822412" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.822392" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:55.822773" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:55.825421" elapsed="0.000190"/>
</kw>
<msg time="2026-05-01T00:48:55.825677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:55.824291" elapsed="0.001525"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.826103" elapsed="0.000117"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.826521" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:55.823655" elapsed="0.003071"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:55.823068" elapsed="0.003723"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:55.761544" elapsed="0.065346"/>
</kw>
<msg time="2026-05-01T00:48:55.826982" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:55.827027" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "I "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.760894" elapsed="0.066172"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:55.827255" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:48:55.827144" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.827125" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.827786" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.828132" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.828206" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:55.760107" elapsed="0.068211"/>
</kw>
<msg time="2026-05-01T00:48:55.828412" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:55.828473" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "I "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.754611" elapsed="0.073903"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.828850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.828592" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.828575" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:55.754442" elapsed="0.074512"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:55.754188" elapsed="0.074798"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:55.751743" elapsed="0.077306"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:55.745790" elapsed="0.083316"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.745330" elapsed="0.083872"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:55.740585" elapsed="0.088675"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:48:55.836318" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010zqjl6t4wrdwhgme8npk9c7v18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:48:55.836560" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '172'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:48:55.836727" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_TOPOLOGY_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:48:55.830556" elapsed="0.006212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.841355" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.837020" elapsed="0.004408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.845825" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.841695" elapsed="0.004204"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:48:55.846137" elapsed="0.003146"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Check the example-ipv4-topology does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:48:55.830106" elapsed="0.019242"/>
</kw>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_IPv4_Topology_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>prefix</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:48:55.829440" elapsed="0.019964"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.850695" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:55.850244" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:48:55.850949" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:48:55.850801" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.850782" elapsed="0.000254"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.851211" elapsed="0.000023"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.851393" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.851598" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.851778" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.851948" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.852147" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.852322" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.852589" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.852405" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:48:55.852389" elapsed="0.000280"/>
</if>
<arg>4835</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:48:55.849852" elapsed="0.002877"/>
</kw>
<doc>The IPv4 topology shall be empty</doc>
<status status="PASS" start="2026-05-01T00:48:55.739317" elapsed="0.113458"/>
</test>
<test id="s1-s9-t12" name="iBGP_Check_Log_For_Withdrawn_Prefixes" line="261">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:48:55.856355" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:48:55.856080" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.857752" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.857641" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.857622" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.863424" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.863302" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.863284" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.864545" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:48:55.864133" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.865038" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:48:55.864737" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:48:55.865112" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:48:55.865272" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:48:55.863748" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.871560" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.871436" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.871417" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.872817" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:48:55.872707" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.872687" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:48:55.873361" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:48:55.873039" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.873806" level="INFO">${current_connection_index} = 9</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:55.873584" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.902878" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:48:55.874391" elapsed="0.028612"/>
</kw>
<msg time="2026-05-01T00:48:55.903177" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:48:55.903224" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.874015" elapsed="0.029248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.928586" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:48:55.903838" elapsed="0.024895"/>
</kw>
<msg time="2026-05-01T00:48:55.928923" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:48:55.928970" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.903444" elapsed="0.025563"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.929390" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.929110" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.929079" elapsed="0.000429"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.930007" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "r "_ "W "i "t "h "d "r "a "w "n "_ "P "r "e "f "i "x "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.929665" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.930401" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.930176" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.930156" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:48:55.930542" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:55.933324" elapsed="0.000183"/>
</kw>
<msg time="2026-05-01T00:48:55.933571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:48:55.932181" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.934000" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.934390" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:48:55.931529" elapsed="0.003078"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:48:55.930934" elapsed="0.003740"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:48:55.872377" elapsed="0.062400"/>
</kw>
<msg time="2026-05-01T00:48:55.934875" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:55.934922" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.871784" elapsed="0.063178"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:48:55.935161" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:48:55.935045" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.935026" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.935689" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.936039" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:48:55.936114" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:48:55.871089" elapsed="0.065138"/>
</kw>
<msg time="2026-05-01T00:48:55.936325" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:48:55.936369" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "i "B "G "P "_ "C "h "e "c "k "_ "L "o "g "_ "F "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.865706" elapsed="0.070704"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:48:55.936759" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:48:55.936505" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:48:55.936486" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:48:55.865548" elapsed="0.071315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:48:55.865354" elapsed="0.071544"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:48:55.862935" elapsed="0.074021"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:48:55.857330" elapsed="0.079684"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:48:55.856796" elapsed="0.080267"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:48:55.853645" elapsed="0.083478"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:48:55.937293" elapsed="0.000110"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.937982" level="INFO">${prefixes_to_be_removed} = 2</msg>
<var>${prefixes_to_be_removed}</var>
<arg>max(${eBGP_PEER1_PREFIX_COUNT}, ${eBGP_PEER2_PREFIX_COUNT})</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:48:55.937589" elapsed="0.000421"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:55.952428" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:55.964773" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:55.964870" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:55.952261" elapsed="0.012633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.965624" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:55.965060" elapsed="0.000662"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:55.966829" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:55.967025" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:55.966173" elapsed="0.000994">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:55.951854" elapsed="0.015544">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:56.987324" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:57.000403" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:57.000680" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:56.987134" elapsed="0.013606"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:57.001835" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:57.001141" elapsed="0.000801"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:57.003044" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:57.003253" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:57.002360" elapsed="0.001034">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:56.986611" elapsed="0.017057">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:58.025756" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:58.038837" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:58.039062" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:58.025561" elapsed="0.013557"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:58.040163" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:58.039541" elapsed="0.000723"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:58.041315" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:58.041555" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:58.040638" elapsed="0.001063">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:58.024989" elapsed="0.016944">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:48:59.062171" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:48:59.075235" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:48:59.075340" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:48:59.061983" elapsed="0.013383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:48:59.075851" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:48:59.075560" elapsed="0.000337"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:48:59.076574" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:48:59.076803" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:48:59.076050" elapsed="0.000896">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:48:59.061473" elapsed="0.015701">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:00.097994" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:00.110779" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:00.111024" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:00.097792" elapsed="0.013293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:00.112243" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:00.111539" elapsed="0.000807"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:00.113335" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:00.113572" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:00.112715" elapsed="0.001003">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:00.097173" elapsed="0.016778">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:01.134866" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:01.147745" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:01.147899" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:01.134667" elapsed="0.013269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:01.149249" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:01.148184" elapsed="0.001190"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:01.150605" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:01.150832" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:01.149930" elapsed="0.001050">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:01.134102" elapsed="0.017116">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:02.173373" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:02.186145" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:02.186370" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:02.173173" elapsed="0.013253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:02.187532" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:02.186844" elapsed="0.000793"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:02.188646" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:02.188853" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:02.187980" elapsed="0.001019">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:02.172651" elapsed="0.016584">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:03.209374" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:03.222767" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:03.223072" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:03.209163" elapsed="0.013972"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:03.224401" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:03.223635" elapsed="0.000911"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:03.225617" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:03.225836" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:03.224914" elapsed="0.001087">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:03.208597" elapsed="0.017653">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:04.249054" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:04.262739" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:04.262894" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:04.248832" elapsed="0.014099"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:04.263688" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:04.263184" elapsed="0.000570"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:04.264375" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:04.264541" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:04.263972" elapsed="0.000669">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:04.248142" elapsed="0.016654">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:05.285166" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:05.297877" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:05.297988" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:05.284968" elapsed="0.013045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:05.298701" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:05.298194" elapsed="0.000607"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:05.299890" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:05.300100" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:05.299140" elapsed="0.001104">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:05.284411" elapsed="0.016100">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:06.320384" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:06.333317" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:06.333600" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:06.320179" elapsed="0.013481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:06.334706" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:06.334044" elapsed="0.000893"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:06.335970" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:06.336178" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:06.335289" elapsed="0.001033">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:06.319611" elapsed="0.016980">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:07.359948" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:07.372946" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:07.373186" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:07.359654" elapsed="0.013574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:07.374052" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:07.373591" elapsed="0.000535"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:07.374784" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:07.374931" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:07.374352" elapsed="0.000678">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:07.359032" elapsed="0.016177">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:08.394821" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:08.407675" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:08.407791" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:08.394614" elapsed="0.013203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:08.408339" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:08.408000" elapsed="0.000387"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:08.409281" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:08.409529" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:08.408630" elapsed="0.001072">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:08.394011" elapsed="0.015938">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:09.429791" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:09.442397" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:09.442700" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:09.429591" elapsed="0.013171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:09.443938" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:09.443195" elapsed="0.000852"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:09.445119" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:09.445343" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:09.444417" elapsed="0.001121">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:09.429038" elapsed="0.016758">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:10.465120" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:10.477751" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:10.477973" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:10.464921" elapsed="0.013108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:10.479094" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:10.478414" elapsed="0.000788"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:10.480282" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:10.480515" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:10.479624" elapsed="0.001034">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:10.464366" elapsed="0.016522">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:11.503536" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:11.516738" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:11.516894" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:11.503250" elapsed="0.013679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:11.517794" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:11.517333" elapsed="0.000525"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:11.518491" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:11.518636" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:11.518075" elapsed="0.000658">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:11.502489" elapsed="0.016433">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:12.541417" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:12.554703" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:12.554930" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:12.541224" elapsed="0.013761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:12.556032" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:12.555365" elapsed="0.000769"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:12.557147" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:12.557351" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:12.556506" elapsed="0.001021">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:12.540711" elapsed="0.017052">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:13.582492" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:13.595792" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:13.595915" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:13.582220" elapsed="0.013721"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:13.596479" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:13.596141" elapsed="0.000387"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:13.596985" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:13.597095" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:13.596695" elapsed="0.000471">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:13.581474" elapsed="0.015807">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:14.617218" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:14.629995" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:14.630142" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:14.617026" elapsed="0.013151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:14.630917" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:14.630418" elapsed="0.000603"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:14.632031" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:14.632236" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:14.631359" elapsed="0.001020">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:14.616509" elapsed="0.016137">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:15.655195" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:15.668201" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:15.668436" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:15.654994" elapsed="0.013537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:15.669580" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:15.668942" elapsed="0.000740"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:15.670673" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:15.670877" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:15.670024" elapsed="0.000992">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:15.654430" elapsed="0.016815">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:16.692758" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-05-01T00:49:16.706189" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:16.706441" level="INFO">${output_log} = 0</msg>
<var>${output_log}</var>
<arg>grep -o '${word}' ${file_name} | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:16.692496" elapsed="0.014046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.707817" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:16.707115" elapsed="0.000812"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.709073" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-05-01T00:49:16.709290" level="FAIL">0 != 2</msg>
<arg>${output_log}</arg>
<arg>${expected_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:49:16.708300" elapsed="0.001141">0 != 2</status>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="FAIL" start="2026-05-01T00:49:16.691771" elapsed="0.017951">0 != 2</status>
</kw>
<msg time="2026-05-01T00:49:16.709932" level="FAIL">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</msg>
<arg>${DEFAULT_LOG_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_LOG_CHECK_PERIOD}</arg>
<arg>Check_File_For_Word_Count</arg>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>withdrawn_prefix_received:</arg>
<arg>${prefixes_to_be_removed}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:48:55.938219" elapsed="20.771927">Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.713122" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:16.712077" elapsed="0.001105"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-05-01T00:49:16.713725" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:16.713355" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.713311" elapsed="0.000567"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:49:16.714273" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.716965" level="FAIL">'4835' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-05-01T00:49:16.716079" elapsed="0.001023">'4835' does not contain '-'</status>
</kw>
<msg time="2026-05-01T00:49:16.717319" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:16.715176" elapsed="0.002187"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.717885" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4835</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:16.717551" elapsed="0.000360"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.718359" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4835</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:16.718074" elapsed="0.000310"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.719096" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:16.718556" elapsed="0.000567"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.719670" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4835

Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-05-01T00:49:16.719282" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.720130" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4835</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:16.719886" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.720878" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4835'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-05-01T00:49:16.720527" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:16.720243" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.720224" elapsed="0.000763"/>
</if>
<arg>4835</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:49:16.711200" elapsed="0.009834"/>
</kw>
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4835</tag>
<status status="FAIL" start="2026-05-01T00:48:55.853071" elapsed="20.868009">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4835

Keyword 'Check_File_For_Word_Count' failed after retrying for 20 seconds. The last error was: 0 != 2</status>
</test>
<test id="s1-s9-t13" name="Disconnect_iBGP_Peer1" line="275">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:16.724572" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:16.724271" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:16.725848" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:16.725737" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.725719" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:16.731546" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:16.731371" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.731353" elapsed="0.000268"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.732656" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:16.732241" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.733135" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:16.732845" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:16.733205" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:16.733366" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:16.731859" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:16.739488" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:16.739364" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.739345" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:16.740784" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:16.740677" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.740659" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:16.741311" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:16.741005" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:16.741732" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:16.741513" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:16.772328" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:16.742265" elapsed="0.030236"/>
</kw>
<msg time="2026-05-01T00:49:16.772688" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:16.772735" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:16.741925" elapsed="0.030847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:16.794927" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:16.773350" elapsed="0.021676"/>
</kw>
<msg time="2026-05-01T00:49:16.795184" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:16.795230" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "i "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:16.772970" elapsed="0.022295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.795617" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:16.795354" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.795329" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.796142" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "i "B "G "P "_ "P "e "e "r "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:16.795846" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.796541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:16.796306" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.796257" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:16.796656" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:16.799199" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:49:16.799407" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:16.798160" elapsed="0.001501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.799998" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.800370" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:16.797519" elapsed="0.003062"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:16.796956" elapsed="0.003689"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:16.740351" elapsed="0.060393"/>
</kw>
<msg time="2026-05-01T00:49:16.800844" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:16.800890" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:16.739717" elapsed="0.061210"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:16.801262" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:16.801154" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.801135" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.801790" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.802138" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:16.802210" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:16.739024" elapsed="0.063296"/>
</kw>
<msg time="2026-05-01T00:49:16.802416" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:16.802477" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "i "s "c "o "n "n "e "c "t "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:16.733787" elapsed="0.068729"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:16.802851" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:16.802594" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:16.802576" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:16.733641" elapsed="0.069312"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:16.733447" elapsed="0.069538"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:16.731007" elapsed="0.072034"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:16.725429" elapsed="0.077671"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:16.724999" elapsed="0.078149"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:16.721903" elapsed="0.081301"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:16.803370" elapsed="0.000138"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:16.804911" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:16.804305" elapsed="0.000635"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:16.805101" elapsed="0.000247"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:49:16.804020" elapsed="0.001396"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:49:18.806266" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:49:18.806649" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:49:16.805589" elapsed="2.001128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.807957" level="INFO">^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:18.807196" elapsed="0.000873"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:49:16.803695" elapsed="2.004510"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:18.822580" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-05-01T00:49:18.836026" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:18.836304" level="INFO">${output_log} = 2026-05-01 00:47:18,831 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:18,831 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:47:18,831 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:18.822416" elapsed="0.013954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.837423" level="INFO">2026-05-01 00:47:18,831 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:47:18,831 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-05-01 00:47:18,831 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:47:18,831 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:47:18,831 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:47:18,832 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:47:18,833 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:47:18,833 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:47:18,834 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-05-01 00:47:18,834 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-05-01 00:47:18,835 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:18,835 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:18,835 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:18,835 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:18,835 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:18,836 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:47:18,836 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:47:18,836 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:18,836 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:18,843 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-05-01 00:47:18,843 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-05-01 00:47:18,843 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:47:18,843 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:47:18,843 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:47:18,843 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:47:18,843 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:47:18,844 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:47:18,845 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:47:18,845 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:47:18,845 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:47:28,849 INFO BGP-Thread-1 (job): ... idle for 10.004s
2026-05-01 00:47:28,850 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-05-01 00:47:28,850 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:28,850 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:28,850 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:38,855 INFO BGP-Thread-1 (job): ... idle for 10.005s
2026-05-01 00:47:38,855 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.015s
2026-05-01 00:47:38,856 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:38,856 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:38,856 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:48,866 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:48,866 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.025s
2026-05-01 00:47:48,866 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:48,866 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:48,866 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:47:58,876 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:47:58,877 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.035s
2026-05-01 00:47:58,877 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:47:58,877 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:47:58,877 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:08,882 INFO BGP-Thread-1 (job): ... idle for 10.005s
2026-05-01 00:48:08,882 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.040s
2026-05-01 00:48:08,883 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:08,883 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:08,883 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:18,846 INFO BGP-Thread-1 (job): ... idle for 9.963s
2026-05-01 00:48:18,846 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.003s
2026-05-01 00:48:18,846 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:48:18,846 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:48:18,846 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:48:18,847 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:48:18,847 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:48:18,847 INFO BGP-Thread-1 (job): KEEP ALIVE is sent.
2026-05-01 00:48:18,847 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:18,847 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:18,847 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:18,849 INFO BGP-Thread-1 (job): KEEP ALIVE message received: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:48:28,859 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:28,859 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.015s
2026-05-01 00:48:28,859 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:28,859 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:28,860 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:38,870 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:38,870 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.025s
2026-05-01 00:48:38,870 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:38,870 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:38,870 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:48,880 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:48,881 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.035s
2026-05-01 00:48:48,881 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:48,881 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:48,881 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:48:58,891 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:48:58,891 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.045s
2026-05-01 00:48:58,892 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:48:58,892 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:48:58,892 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:49:08,902 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:49:08,902 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.055s
2026-05-01 00:49:08,902 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:08,902 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:08,903 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:18.836819" elapsed="0.001041"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:18.839095" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bgp_peer1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:49:18.838300" elapsed="0.000991"/>
</kw>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<arg>${iBGP_PEER1_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:18.822007" elapsed="0.017537"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:18.840973" elapsed="0.000586"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:18.840222" elapsed="0.001481"/>
</kw>
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:16.721407" elapsed="2.120384"/>
</test>
<test id="s1-s9-t14" name="Delete_BGP_Peers_Configuration" line="282">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:18.846494" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:18.846214" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:18.847841" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:18.847704" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.847680" elapsed="0.000239"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:18.853478" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:18.853357" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.853338" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.854567" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:18.854161" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.855054" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:18.854759" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:18.855126" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:18.855323" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:18.853782" elapsed="0.001576"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:18.861573" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:18.861449" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.861430" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:18.862851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:18.862744" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.862727" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:18.863406" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.863072" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:18.863976" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:18.863626" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:18.893266" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:18.864529" elapsed="0.028849"/>
</kw>
<msg time="2026-05-01T00:49:18.893581" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:18.893628" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:18.864170" elapsed="0.029494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:18.920144" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:18.894184" elapsed="0.026063"/>
</kw>
<msg time="2026-05-01T00:49:18.920412" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:18.920539" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:18.893840" elapsed="0.026739"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.920885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:18.920658" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.920639" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.921402" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:18.921107" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.921775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:18.921557" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.921538" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:18.921886" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:18.924423" elapsed="0.000173"/>
</kw>
<msg time="2026-05-01T00:49:18.924659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:18.923350" elapsed="0.001443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.925225" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.925585" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:18.922712" elapsed="0.003060"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:18.922169" elapsed="0.003666"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:18.862420" elapsed="0.063513"/>
</kw>
<msg time="2026-05-01T00:49:18.926024" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:18.926069" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:18.861799" elapsed="0.064307"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:18.926290" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:18.926182" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.926164" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.926798" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.927142" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:18.927216" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:18.861108" elapsed="0.066234"/>
</kw>
<msg time="2026-05-01T00:49:18.927437" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:18.927497" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "D "e "l "e "t "e "_ "B "G "P "_ "P "e "e "r "s "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:18.855758" elapsed="0.071778"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.927868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:18.927614" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.927596" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:18.855609" elapsed="0.072362"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:18.855414" elapsed="0.072587"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:18.852997" elapsed="0.075058"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:18.847374" elapsed="0.080736"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:18.846913" elapsed="0.081280"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:18.843750" elapsed="0.084497"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.928966" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-ibgp-peer1 | IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>NAME=example-ibgp-peer1</arg>
<arg>IP=${iBGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.928418" elapsed="0.000577"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.976473" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:18.976083" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:18.977260" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:18.977007" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:18.977430" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:18.976670" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.978022" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:18.977640" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:18.978347" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ibgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:18.978520" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:18.978212" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.978949" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:18.978706" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.979979" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ibgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:18.979715" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.980463" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.980187" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.981158" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:18.980854" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:18.981934" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.981714" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:18.982011" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:18.982162" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:18.981375" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.982341" elapsed="0.000258"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:49:18.980714" elapsed="0.001926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.983185" level="INFO">${value} = example-ibgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:18.982887" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:18.984114" level="INFO">${encoded} = example-ibgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.983758" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:18.984190" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:18.984382" level="INFO">${encoded_value} = example-ibgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:18.983423" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.984580" elapsed="0.000223"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ibgp-peer1</var>
<status status="PASS" start="2026-05-01T00:49:18.982752" elapsed="0.002092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.985390" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:18.985094" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:18.986147" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.985939" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:18.986222" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:18.986373" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:18.985620" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.986567" elapsed="0.000222"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:18.984958" elapsed="0.001872"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.987406" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:18.987078" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:18.988160" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.987953" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:18.988236" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:18.988386" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:18.987635" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:18.988582" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:18.986943" elapsed="0.001899"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:18.980539" elapsed="0.008338"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:18.988919" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:18.989075" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ibgp-peer1', 'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:18.979374" elapsed="0.009727"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:18.979060" elapsed="0.010072"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:18.989307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:18.989157" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:18.979042" elapsed="0.010341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:18.990161" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:18.989544" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:18.990238" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:18.975465" elapsed="0.014899"/>
</kw>
<msg time="2026-05-01T00:49:18.990417" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:18.961358" elapsed="0.029120"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.004371" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.018267" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ibgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.032467" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.032670" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.032853" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.033249" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.033079" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.033066" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.033491" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.033665" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.033833" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.033036" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.032931" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.034058" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.034133" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.034254" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:18.956645" elapsed="0.077636"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.035400" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.035137" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:19.047483" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.047561" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.047721" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:19.037800" elapsed="0.009961"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.035531" elapsed="0.012291"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.048102" elapsed="0.000099"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.047861" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.035512" elapsed="0.012781"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.053543" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.049783" elapsed="0.003823"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.049442" elapsed="0.004214"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.049417" elapsed="0.004274"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.057882" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.054089" elapsed="0.003860"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.053771" elapsed="0.004228"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.053747" elapsed="0.004288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.058841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.058278" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.059343" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.058980" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.060132" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.059717" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.059481" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.058955" elapsed="0.001296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.061004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.060496" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.061487" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.061139" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.062274" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.061832" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.061602" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.061115" elapsed="0.001278"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.062630" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:19.063829" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.063404" elapsed="0.000461"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.064083" elapsed="0.004748"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:19.048842" elapsed="0.020056"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:19.068948" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:19.071523" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:49:19.034563" elapsed="0.036988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.071606" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ibgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:49:18.929227" elapsed="0.142505"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${mapping}</arg>
<arg>NAME=example-ebgp-peer1</arg>
<arg>IP=${eBGP_PEER1_IP}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.071893" elapsed="0.000238"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.119225" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.118821" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.120027" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.119785" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.120242" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.119434" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.120837" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.120434" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.121170" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.121320" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.121034" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.121762" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.121521" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.122770" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer1', 'IP': '127.0.0.3', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.122513" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.123274" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.122976" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.123994" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.123693" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.124767" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.124551" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.124843" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:19.124996" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.124214" elapsed="0.000807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.125176" elapsed="0.000224"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:49:19.123553" elapsed="0.001887"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.126008" level="INFO">${value} = example-ebgp-peer1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.125712" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.126936" level="INFO">${encoded} = example-ebgp-peer1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.126725" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.127014" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.127183" level="INFO">${encoded_value} = example-ebgp-peer1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.126223" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.127367" elapsed="0.000239"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer1</var>
<status status="PASS" start="2026-05-01T00:49:19.125576" elapsed="0.002070"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.128197" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.127897" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.128957" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.128748" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.129032" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.129182" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.128412" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.129361" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:19.127760" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.130238" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.129935" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.131005" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.130796" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.131080" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.131266" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.130472" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.131465" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:19.129798" elapsed="0.001935"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.123356" elapsed="0.008413"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.131812" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:19.131972" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer1', 'IP': '127.0.0.3', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:19.122176" elapsed="0.009822"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.121875" elapsed="0.010155"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.132208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.132055" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.121856" elapsed="0.010430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.133051" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.132432" elapsed="0.000648"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.133130" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.118187" elapsed="0.015078"/>
</kw>
<msg time="2026-05-01T00:49:19.133319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.104052" elapsed="0.029313"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.147332" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.161295" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.175100" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.175322" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.175515" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.175939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.175792" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.175778" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.176162" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.176332" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.176515" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.175748" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.175642" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.176745" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.176821" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.176943" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.099342" elapsed="0.077627"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.178076" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.177819" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:19.188984" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.189049" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.189176" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:19.180476" elapsed="0.008735"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.178189" elapsed="0.011077"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.189546" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.189302" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.178171" elapsed="0.011494"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.194771" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.191064" elapsed="0.003768"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.190756" elapsed="0.004125"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.190731" elapsed="0.004184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.199005" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.195329" elapsed="0.003739"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.194992" elapsed="0.004124"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.194969" elapsed="0.004222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.199959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.199429" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.200301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.200062" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.200865" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.200565" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.200383" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.200044" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.201531" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.201152" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.201867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.201627" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.202414" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.202118" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.201949" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.201610" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.202668" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:19.203497" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.203203" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.203687" elapsed="0.002740"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:19.190168" elapsed="0.016337"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:19.206551" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:19.209109" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:49:19.177232" elapsed="0.031904"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.209191" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ebgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:49:19.072371" elapsed="0.136945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${mapping}</arg>
<arg>NAME=example-ebgp-peer2</arg>
<arg>IP=${eBGP_PEER2_IP}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.209491" elapsed="0.000238"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.256941" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.256558" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.257730" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.257498" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.257896" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.257142" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.258497" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.258096" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.258827" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/ebgp_peers/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.258974" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.258690" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.259439" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.259193" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.260541" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer2', 'IP': '127.0.0.4', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.260265" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.261026" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.260751" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.261742" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.261425" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.262520" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.262288" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.262597" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:19.262754" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.261964" elapsed="0.000815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.262936" elapsed="0.000247"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:49:19.261286" elapsed="0.001942"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.263983" level="INFO">${value} = example-ebgp-peer2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.263500" elapsed="0.000510"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.264895" level="INFO">${encoded} = example-ebgp-peer2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.264682" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.264973" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.265126" level="INFO">${encoded_value} = example-ebgp-peer2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.264343" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.265308" elapsed="0.000239"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer2</var>
<status status="PASS" start="2026-05-01T00:49:19.263348" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.266139" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.265842" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.266900" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.266691" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.266975" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.267145" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.266354" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.267323" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:49:19.265705" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.268146" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.267850" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.268909" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.268696" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.268985" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.269137" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.268360" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.269315" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:19.267715" elapsed="0.001878"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.261110" elapsed="0.008519"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.269674" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.269836" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-ebgp-peer2', 'IP': '127.0.0.4', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:19.259939" elapsed="0.009923"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.259624" elapsed="0.010271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.270114" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.269955" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.259601" elapsed="0.010592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.270971" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.270343" elapsed="0.000657"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.271050" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.255902" elapsed="0.015309"/>
</kw>
<msg time="2026-05-01T00:49:19.271268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.241781" elapsed="0.029535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.285279" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.299114" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//ebgp_peers/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.312861" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.313059" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.313237" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.313622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.313472" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.313444" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.313844" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.314011" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.314178" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.313415" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.313313" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.314402" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.314492" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:19.314617" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.237006" elapsed="0.077677"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.315831" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.315582" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:19.327490" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.327539" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.327631" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:19.318181" elapsed="0.009475"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.315945" elapsed="0.011751"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.327875" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.327722" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.315927" elapsed="0.012035"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.331613" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.328964" elapsed="0.002692"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.328744" elapsed="0.002948"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.328726" elapsed="0.002990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.335885" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.332040" elapsed="0.003911"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.331771" elapsed="0.004229"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.331754" elapsed="0.004281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.336823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.336277" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.337301" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.336966" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.338089" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.337671" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.337415" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.336941" elapsed="0.001262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.338947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.338429" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.339432" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.339099" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.340208" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.339796" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.339566" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.339055" elapsed="0.001267"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.340553" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:19.341668" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.341261" elapsed="0.000496"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.341984" elapsed="0.003187"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:19.328324" elapsed="0.016910"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:19.345279" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:19.347961" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:49:19.314956" elapsed="0.033033"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.348044" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}ebgp_peers</arg>
<arg>mapping=${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:49:19.209959" elapsed="0.138210"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:19.348772" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:19.348464" elapsed="0.000615"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:18.842443" elapsed="0.506676"/>
</test>
<test id="s1-s9-t15" name="TC_LAS_Reconfigure_Odl_To_Accept_Connection" line="296">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:19.352722" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:19.352436" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.353980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.353865" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.353847" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.359793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.359686" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.359668" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.360869" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.360486" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.361356" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:19.361060" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:19.361426" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:49:19.361600" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.360094" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.367574" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.367464" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.367432" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.368829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.368722" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.368704" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:19.369349" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.369047" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.369775" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:19.369557" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.400988" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:19.370303" elapsed="0.030788"/>
</kw>
<msg time="2026-05-01T00:49:19.401253" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:19.401299" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.369965" elapsed="0.031416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.430041" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:19.401930" elapsed="0.028227"/>
</kw>
<msg time="2026-05-01T00:49:19.430319" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:19.430365" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "R "e "c "o "n "f "i "g "u "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.401582" elapsed="0.028820"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.430735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.430505" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.430483" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.431276" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "d "l "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.430959" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.431654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.431418" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.431399" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:19.431767" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:19.434264" elapsed="0.000294"/>
</kw>
<msg time="2026-05-01T00:49:19.434623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.433191" elapsed="0.001564"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.435058" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.435400" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:19.432576" elapsed="0.003031"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:19.432032" elapsed="0.003640"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:19.368395" elapsed="0.067373"/>
</kw>
<msg time="2026-05-01T00:49:19.435860" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:19.435906" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "R "e "c "o "n "f "i "g "u "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.367799" elapsed="0.068146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:19.436128" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:49:19.436021" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.436003" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.436632" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.436967" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.437038" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:19.367114" elapsed="0.070030"/>
</kw>
<msg time="2026-05-01T00:49:19.437236" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:19.437280" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "R "e "c "o "n "f "i "g "u "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.362002" elapsed="0.075314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.437657" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.437391" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.437374" elapsed="0.000397"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:19.361850" elapsed="0.075945"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:19.361679" elapsed="0.076146"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:19.359307" elapsed="0.078571"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:19.353576" elapsed="0.084358"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.353135" elapsed="0.084844"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:19.350084" elapsed="0.087948"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.438808" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${iBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.438221" elapsed="0.000616"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.475775" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.475375" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.476566" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.476311" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.476739" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.475973" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.477316" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.476935" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.477663" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.477817" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.477525" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.478242" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.478001" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.479280" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.479022" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.479989" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.479500" elapsed="0.000516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.480704" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.480386" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.481486" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.481252" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.481564" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:19.481720" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.480926" elapsed="0.000819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.481904" elapsed="0.000236"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:19.480245" elapsed="0.001977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.482800" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.482496" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.483585" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.483358" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.483661" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.483815" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.483032" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.483995" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:19.482341" elapsed="0.001918"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.484823" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.484525" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.485587" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.485356" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.485663" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.485814" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.485038" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.485993" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:19.484374" elapsed="0.001883"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.486831" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.486531" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.487632" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.487399" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.487709" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.487861" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.487078" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.488040" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:19.486371" elapsed="0.001930"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.488882" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.488583" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.489642" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.489417" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.489716" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.489867" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.489098" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.490048" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:19.488416" elapsed="0.001894"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.480066" elapsed="0.010280"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.490388" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:19.490564" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:19.478684" elapsed="0.011907"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.478357" elapsed="0.012266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.490800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.490649" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.478337" elapsed="0.012539"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.491873" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.491038" elapsed="0.000928"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.492019" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.474709" elapsed="0.017437"/>
</kw>
<msg time="2026-05-01T00:49:19.492200" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.460678" elapsed="0.031569"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.506003" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.519745" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.533557" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.533754" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.533930" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.534392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.534240" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.534132" elapsed="0.000364"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.534642" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.534813" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.535009" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.534104" elapsed="0.000960"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.534004" elapsed="0.001086"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.535240" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.535316" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.535438" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.455948" elapsed="0.079533"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.565002" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.564631" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.565793" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.565586" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.565950" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.565193" elapsed="0.000782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.566538" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.566138" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.566861" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.567012" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.566728" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.567441" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.567200" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:19.567888" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.567587" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.568407" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.568117" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.567970" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.567569" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.569347" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.568654" elapsed="0.000722"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.569425" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.564003" elapsed="0.005567"/>
</kw>
<msg time="2026-05-01T00:49:19.569627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.549846" elapsed="0.019828"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.583583" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.597336" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.611062" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.611259" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.611434" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.611813" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.611668" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.611654" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.612038" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.612207" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.612375" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.611625" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.611524" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.612617" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.612693" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.612825" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.547013" elapsed="0.065841"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.614099" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.613866" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.614252" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.613527" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.614608" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.614347" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.615179" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.614863" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.614689" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.614329" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.617796" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.615416" elapsed="0.002407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:19.617874" elapsed="0.000069"/>
</return>
<msg time="2026-05-01T00:49:19.618094" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:19.613189" elapsed="0.004933"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.619560" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.619299" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.619995" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.619761" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.620445" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.620206" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.620894" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.620658" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:19.621752" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:49:19.621556" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:49:19.622128" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:49:19.621955" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.622303" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.622916" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.622672" elapsed="0.000303"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:49:19.623017" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.623176" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:49:19.621139" elapsed="0.002062"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:19.638753" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '1075', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:49:19.638902" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.639175" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:19.627059" elapsed="0.012175"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.623271" elapsed="0.016126"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.639845" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.639487" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.623253" elapsed="0.016798"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.646564" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.642210" elapsed="0.004415"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.641709" elapsed="0.004967"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.641670" elapsed="0.005041"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.650763" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.647126" elapsed="0.003701"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.646788" elapsed="0.004088"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.646765" elapsed="0.004170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.651724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.651171" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.652198" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.651861" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.652987" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.652564" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.652312" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.651836" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.653861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.653332" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.654326" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.653995" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.655154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.654691" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.654438" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.653970" elapsed="0.001301"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.655503" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:19.656415" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.656139" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.656624" elapsed="0.002642"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:19.640881" elapsed="0.018447"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:19.659516" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:49:19.659395" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.659376" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.659754" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.659822" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.662383" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:19.618481" elapsed="0.043929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.662487" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:19.662639" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:19.443931" elapsed="0.218732"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.663063" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.662802" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.662784" elapsed="0.000371"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.663188" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:49:19.439134" elapsed="0.224177"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.664189" level="INFO">&amp;{mapping} = { IP=127.0.0.3 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | AS_NUMBER=65432 | PEER_AS=64497 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${eBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>AS_NUMBER=${LOCAL_AS}</arg>
<arg>PEER_AS=${eBGP_AS}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.663514" elapsed="0.000704"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.701281" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.700900" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.702133" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.701839" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.702307" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.701499" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.702942" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.702514" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.703289" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.703467" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.703142" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.703895" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.703654" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.704905" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.704647" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.705380" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.705116" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.706092" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.705797" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.706856" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.706641" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.706944" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:19.707104" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.706306" elapsed="0.000822"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.707283" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:19.705658" elapsed="0.001912"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.708165" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.707867" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.709072" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.708861" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.709148" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.709301" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.708380" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.709496" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:19.707729" elapsed="0.002031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.710303" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.710009" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.711110" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.710899" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.711185" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.711334" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.710560" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.711526" elapsed="0.000222"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:19.709872" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.712329" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.712038" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.713083" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.712875" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.713156" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.713306" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.712557" elapsed="0.000773"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.713497" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:19.711902" elapsed="0.001855"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.714300" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.714006" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.715095" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.714850" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.715171" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.715322" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.714527" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.715517" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:19.713870" elapsed="0.001911"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.716330" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.716031" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.717093" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.716884" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.717169" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.717322" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.716561" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.717517" elapsed="0.000224"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:19.715895" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.718380" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:19.718082" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:19.719182" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.718968" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:19.719259" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.719412" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:19.718613" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.719608" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:19.717944" elapsed="0.001929"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.705472" elapsed="0.014436"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:19.719952" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:19.720112" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:19.704307" elapsed="0.015831"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.704013" elapsed="0.016158"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.720348" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.720196" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.703992" elapsed="0.016433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.721622" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.720588" elapsed="0.001064"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.721702" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.700267" elapsed="0.021560"/>
</kw>
<msg time="2026-05-01T00:49:19.721881" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.686191" elapsed="0.035736"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.735857" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.749743" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.763523" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.763722" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.763900" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.764302" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.764156" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.764142" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.764542" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.764716" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.764885" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.764113" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.764009" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.765112" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.765188" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.765310" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.681506" elapsed="0.083831"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.794553" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.794164" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.795322" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.795114" elapsed="0.000271">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.795494" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.794747" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.796067" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.795687" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.796390" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:19.796537" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.796256" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.796967" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;$PEER_AS&lt;/peer-as&gt;
        &lt;local-as&gt;$AS_NUMBER&lt;/local-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.796726" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:19.797385" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.797094" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.797965" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.797670" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.797518" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.797075" elapsed="0.000974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.798964" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.798198" elapsed="0.000797"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.799045" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.793547" elapsed="0.005626"/>
</kw>
<msg time="2026-05-01T00:49:19.799231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.779488" elapsed="0.019790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.813337" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.827313" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.841229" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.841446" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.841646" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.842037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.841887" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:19.841872" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.842264" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.842436" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.842623" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:19.841840" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.841725" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.842877" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.843004" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:19.843152" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:19.776629" elapsed="0.066553"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:19.844533" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.844252" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:19.844702" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:19.843884" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.845057" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.844798" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.845630" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.845321" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.845136" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.844779" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.848301" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.845868" elapsed="0.002460"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:19.848379" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.848551" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:19.843547" elapsed="0.005029"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.850095" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.849838" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.850563" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;64497&lt;/peer-as&gt;
        &lt;local-as&gt;65432&lt;/local-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.850298" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.851051" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.850776" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.851503" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.851249" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:19.852356" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:49:19.852158" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:49:19.852727" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:49:19.852553" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.852905" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.853523" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.853265" elapsed="0.000338"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:49:19.853647" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:19.853806" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:49:19.851752" elapsed="0.002078"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:19.869934" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '996', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
        &lt;peer-as&gt;64497&lt;/peer-as&gt;
        &lt;local-as&gt;65432&lt;/local-as&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:49:19.870089" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:19.870299" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:19.856381" elapsed="0.013978"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.853901" elapsed="0.016595"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.870992" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.870561" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.853883" elapsed="0.017318"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.879585" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.873395" elapsed="0.006295"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.872885" elapsed="0.006886"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.872845" elapsed="0.006983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.882900" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.880186" elapsed="0.002761"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.879950" elapsed="0.003032"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.879919" elapsed="0.003089"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.883608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.883193" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.883950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.883707" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.884513" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.884199" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.884033" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.883689" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.885126" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.884762" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.885473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.885221" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.886013" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.885721" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.885555" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.885203" elapsed="0.000943"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.886306" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:19.887175" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.886875" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.887359" elapsed="0.002636"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:19.872051" elapsed="0.018010"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:19.890239" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:49:19.890129" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.890110" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.890503" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.890573" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:19.893149" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:19.848912" elapsed="0.044265"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.893243" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:19.893402" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:19.669363" elapsed="0.224064"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.893795" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.893545" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.893527" elapsed="0.000360"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:19.893921" elapsed="0.000025"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/ebgp_peer</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:49:19.664509" elapsed="0.229536"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.895350" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.894961" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.894943" elapsed="0.000493"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.895603" elapsed="0.000311"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.901654" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:19.901154" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:49:19.901925" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:49:19.901769" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.901748" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.902200" elapsed="0.000025"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.902416" elapsed="0.000023"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.902642" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.902899" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.903160" elapsed="0.000038"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.903381" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.903603" elapsed="0.000023"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:49:19.900840" elapsed="0.002851"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:19.894741" elapsed="0.009007"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:49:19.894353" elapsed="0.009443"/>
</kw>
<doc>Configure neighbors. One ibgp and one ebgp neighbor with local-as configured.</doc>
<status status="PASS" start="2026-05-01T00:49:19.349466" elapsed="0.554393"/>
</test>
<test id="s1-s9-t16" name="TC_LAS_Start_iBgp_Speaker_And_Verify_Connected" line="316">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:19.908264" elapsed="0.000263"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:19.907948" elapsed="0.000643"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.909710" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.909599" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.909580" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.915519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.915392" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.915374" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.916609" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.916209" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.917093" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:19.916799" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:19.917163" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:19.917318" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:19.915822" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.923672" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.923562" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.923543" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.924947" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:19.924839" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.924821" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:19.925483" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:19.925162" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.925891" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:19.925672" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.955257" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:19.926418" elapsed="0.029136"/>
</kw>
<msg time="2026-05-01T00:49:19.955937" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:19.956043" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.926079" elapsed="0.030046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.981524" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "i "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:19.957415" elapsed="0.024297"/>
</kw>
<msg time="2026-05-01T00:49:19.981891" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:19.981939" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "i "B "g "p "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.956586" elapsed="0.025392"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.982301" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.982060" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.982039" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.982909" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "i "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.982556" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.983284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.983058" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.983039" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:19.983398" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:19.986009" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:49:19.986218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:19.984944" elapsed="0.001411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.986746" elapsed="0.000117"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.987182" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:19.984278" elapsed="0.003096"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:19.983701" elapsed="0.003739"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:19.924533" elapsed="0.063034"/>
</kw>
<msg time="2026-05-01T00:49:19.987662" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:19.987707" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "i "B "g "p "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.923901" elapsed="0.063844"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:19.987949" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:49:19.987822" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.987803" elapsed="0.000252"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.988490" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.988835" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:19.988914" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:19.923200" elapsed="0.065827"/>
</kw>
<msg time="2026-05-01T00:49:19.989123" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:19.989168" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "i "B "g "p "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.917747" elapsed="0.071458"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:19.989552" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:19.989281" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:19.989263" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:19.917598" elapsed="0.072057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:19.917400" elapsed="0.072288"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:19.915027" elapsed="0.074717"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:19.909282" elapsed="0.080558"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:19.908777" elapsed="0.081108"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:19.904986" elapsed="0.084964"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:19.990112" elapsed="0.000110"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.990991" level="INFO">${speaker_args} = --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug</msg>
<var>${speaker_args}</var>
<arg>--firstprefix ${iBGP_PEER1_FIRST_PREFIX_IP} --prefixlen ${PREFIX_LEN} --amount 1 --myip=${iBGP_PEER1_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.990379" elapsed="0.000641"/>
</kw>
<kw name="Start_BGP_Speaker_And_Verify_Connected" owner="BGPSpeaker">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.992709" level="INFO">${command} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.992143" elapsed="0.000596"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.993160" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:19.992903" elapsed="0.000305"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:19.996658" level="INFO">python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:49:19.996751" level="INFO">${output} = python3 play.py --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:19.993363" elapsed="0.003416"/>
</kw>
<arg>${arguments}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:49:19.991796" elapsed="0.005044"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.998298" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:19.997983" elapsed="0.000341"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:19.998937" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:19.998505" elapsed="0.000465"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:20.005260" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:20.005403" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:20.005528" level="FAIL">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig Expected status: 409 != 200</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.999168" elapsed="0.006878">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-05-01T00:49:20.006123" elapsed="0.000023"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:49:19.997549" elapsed="0.008705">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig Expected status: 409 != 200</status>
</kw>
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.009134" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:22.008335" elapsed="0.000867"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.010578" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:22.009613" elapsed="0.001026"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:22.017350" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:22.018693" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1119'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:49:22.018856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:22.010989" elapsed="0.007906"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-05-01T00:49:22.018979" elapsed="0.000063"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:49:22.007116" elapsed="0.015962"/>
</kw>
<msg time="2026-05-01T00:49:22.023218" level="INFO">${message} = {"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bg...</msg>
<var>${message}</var>
<arg>5x</arg>
<arg>2s</arg>
<arg>Verify_BGP_Speaker_Connection</arg>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:19.997013" elapsed="2.026245"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:22.023344" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:49:22.023597" level="INFO">${output} = {"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bg...</msg>
<var>${output}</var>
<arg>${speaker_args}</arg>
<arg>session=default</arg>
<arg>speaker_ip=${iBGP_PEER1_IP}</arg>
<doc>Start the BGP speaker python utility, and verifies it's connection.
We can change connected variable to false to verify Speaker did not connect.</doc>
<status status="PASS" start="2026-05-01T00:49:19.991250" elapsed="2.032387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.024274" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.1","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.1.0.0/28","prefix":"8.1.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64496]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ibgp"}]}</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:22.023896" elapsed="0.000456"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:22.025241" elapsed="0.000371"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:22.024782" elapsed="0.000924"/>
</kw>
<doc>Verify that peer is present in odl's rib. Peer is configured with local-as.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:19.904266" elapsed="2.121498"/>
</test>
<test id="s1-s9-t17" name="TC_LAS_Start_eBgp_Speaker_And_Verify_Connected" line="328">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:22.031581" elapsed="0.000305"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:22.031165" elapsed="0.000802"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.033499" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:22.033303" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.033271" elapsed="0.000335"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.039322" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:22.039214" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.039196" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.040405" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:22.040022" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.040906" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:22.040613" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:22.040976" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:22.041131" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:22.039641" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.047198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:22.047088" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.047070" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.048487" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:22.048353" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.048336" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:22.049018" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:22.048710" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:22.049434" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:22.049213" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:22.078098" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:22.050097" elapsed="0.028174"/>
</kw>
<msg time="2026-05-01T00:49:22.078545" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:22.078615" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:22.049728" elapsed="0.028942"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:22.108659" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "e "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:22.079436" elapsed="0.029339"/>
</kw>
<msg time="2026-05-01T00:49:22.108939" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:22.108985" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "e "B "g "p "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:22.078928" elapsed="0.030094"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.109333" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:22.109102" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.109081" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.109903" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "e "B "g "p "_ "S "p "e "a "k "e "r "_ "A "n "d "_ "V "e "r "i "f "y "_ "C "o "n "n "e "c "t "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:22.109586" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.110274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:22.110053" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.110035" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:22.110387" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:22.112984" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:49:22.113197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:22.111886" elapsed="0.001446"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.113631" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.113991" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:22.111240" elapsed="0.002936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:22.110699" elapsed="0.003541"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:22.048052" elapsed="0.066284"/>
</kw>
<msg time="2026-05-01T00:49:22.114427" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:22.114495" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "e "B "g "p "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:22.047424" elapsed="0.067145"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:22.114758" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:49:22.114649" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.114630" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.115250" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.115610" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.115683" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:22.046746" elapsed="0.069046"/>
</kw>
<msg time="2026-05-01T00:49:22.115885" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:22.115929" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "S "t "a "r "t "_ "e "B "g "p "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:22.041602" elapsed="0.074364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:22.116307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:22.116042" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:22.116024" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:22.041436" elapsed="0.074975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:22.041250" elapsed="0.075193"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:22.038852" elapsed="0.077667"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:22.032869" elapsed="0.083706"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:22.032198" elapsed="0.084421"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:22.027218" elapsed="0.089453"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:22.116845" elapsed="0.000106"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.117716" level="INFO">${speaker_args} = --firstprefix 8.0.0.0 --prefixlen 28 --amount 1 --asnumber=64497 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug</msg>
<var>${speaker_args}</var>
<arg>--firstprefix ${eBGP_PEER1_FIRST_PREFIX_IP} --prefixlen ${PREFIX_LEN} --amount 1 --asnumber=${eBGP_AS} --myip=${eBGP_PEER1_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:22.117105" elapsed="0.000678"/>
</kw>
<kw name="Start_BGP_Speaker_And_Verify_Connected" owner="BGPSpeaker">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.119208" level="INFO">${command} = python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 1 --asnumber=64497 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:22.118887" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.119652" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 1 --asnumber=64497 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:22.119398" elapsed="0.000301"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:22.123443" level="INFO">python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 1 --asnumber=64497 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:49:22.123545" level="INFO">${output} = python3 play.py --firstprefix 8.0.0.0 --prefixlen 28 --amount 1 --asnumber=64497 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:22.119852" elapsed="0.003720"/>
</kw>
<arg>${arguments}</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:49:22.118571" elapsed="0.005060"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.125048" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:22.124749" elapsed="0.000325"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:22.125620" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:22.125234" elapsed="0.000448"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:22.130848" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:22.130972" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:22.131094" level="FAIL">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig Expected status: 409 != 200</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:22.125854" elapsed="0.005725">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-05-01T00:49:22.131651" elapsed="0.000020"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:49:22.124300" elapsed="0.007472">Url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig Expected status: 409 != 200</status>
</kw>
<kw name="Verify_BGP_Speaker_Connection" owner="BGPSpeaker">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.135636" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>200</arg>
<arg>404</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:24.134835" elapsed="0.000870"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.137049" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig</msg>
<var>${url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F${ip}?content=nonconfig</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:24.136087" elapsed="0.001014"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:24.144900" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:24.145801" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.3?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '864'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.3","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.0.0/28","prefix":"8.0.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64497]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ebgp"}]} 
 </msg>
<msg time="2026-05-01T00:49:24.145965" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${url}</arg>
<arg>expected_status=${exp_status_code}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:24.137326" elapsed="0.008678"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-05-01T00:49:24.146086" elapsed="0.000059"/>
</return>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Verifies peer's presence in bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:49:24.132724" elapsed="0.017149"/>
</kw>
<msg time="2026-05-01T00:49:24.150006" level="INFO">${message} = {"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.3","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bg...</msg>
<var>${message}</var>
<arg>5x</arg>
<arg>2s</arg>
<arg>Verify_BGP_Speaker_Connection</arg>
<arg>${session}</arg>
<arg>${speaker_ip}</arg>
<arg>${connected}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:22.123795" elapsed="2.026248"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:24.150130" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:49:24.150343" level="INFO">${output} = {"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.3","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bg...</msg>
<var>${output}</var>
<arg>${speaker_args}</arg>
<arg>session=default</arg>
<arg>speaker_ip=${eBGP_PEER1_IP}</arg>
<doc>Start the BGP speaker python utility, and verifies it's connection.
We can change connected variable to false to verify Speaker did not connect.</doc>
<status status="PASS" start="2026-05-01T00:49:22.118028" elapsed="2.032352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.150997" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://127.0.0.3","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"8.0.0.0/28","prefix":"8.0.0.0/28","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"as-path":{"segments":[{"as-sequence":[64497]}]},"ipv4-next-hop":{"global":"192.0.2.1"}}}]}}]},"peer-role":"ebgp"}]}</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.150643" elapsed="0.000497"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:24.152159" elapsed="0.000354"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:24.151720" elapsed="0.000884"/>
</kw>
<doc>Verify that peer is present in odl's rib. Peer is configured with local-as.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:22.026273" elapsed="2.126386"/>
</test>
<test id="s1-s9-t18" name="TC_LAS_Verify_iBGP_Rib_Out" line="340">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:24.157581" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:24.157293" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.158869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:24.158750" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.158729" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.164683" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:24.164576" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.164558" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.165814" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:24.165411" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.166297" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:24.166005" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:24.166367" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:24.166541" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:24.165028" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.174445" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:24.174334" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.174315" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.175754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:24.175645" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.175627" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:24.176297" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.175976" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:24.176721" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:24.176502" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:24.208498" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:24.177282" elapsed="0.031322"/>
</kw>
<msg time="2026-05-01T00:49:24.208783" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:24.208830" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:24.176947" elapsed="0.031920"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:24.230543" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "i "B "G "P "_ "R "i "b "_ "O "u "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:24.209393" elapsed="0.021253"/>
</kw>
<msg time="2026-05-01T00:49:24.230807" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:24.230852" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "i "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:24.209046" elapsed="0.021842"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.231196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.230968" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.230947" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.231823" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "i "B "G "P "_ "R "i "b "_ "O "u "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.231524" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.232175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.231958" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.231941" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:24.232286" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:24.234908" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:49:24.235113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:24.233795" elapsed="0.001449"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.235538" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.235974" elapsed="0.000087"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:24.233153" elapsed="0.003035"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:24.232589" elapsed="0.003670"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:24.175312" elapsed="0.061055"/>
</kw>
<msg time="2026-05-01T00:49:24.236501" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:24.236554" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "i "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:24.174689" elapsed="0.061904"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:24.236802" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:24.236674" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.236655" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.237401" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.237788" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.237862" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:24.173985" elapsed="0.063987"/>
</kw>
<msg time="2026-05-01T00:49:24.238069" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:24.238113" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "i "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:24.166944" elapsed="0.071207"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.238500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.238228" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.238211" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:24.166798" elapsed="0.071805"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:24.166622" elapsed="0.072012"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:24.164063" elapsed="0.074627"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:24.158439" elapsed="0.080306"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:24.158001" elapsed="0.080789"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:24.153979" elapsed="0.084863"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.239824" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | AS_NUMBER=65432 | PEER_AS=64497 | PREFIXLEN=8.0.0.0/28 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${iBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>AS_NUMBER=${LOCAL_AS}</arg>
<arg>PEER_AS=${eBGP_AS}</arg>
<arg>PREFIXLEN=${eBGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.239036" elapsed="0.000851"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.299887" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:24.299465" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:24.300787" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.300466" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:24.300971" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:24.300103" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.301576" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:24.301171" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:24.301915" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:24.302138" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:24.301769" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.302591" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.302329" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.303689" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.303406" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.304195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.303921" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.305151" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.304776" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.306109" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.305754" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.306192" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:24.306363" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.305374" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.306565" elapsed="0.000302"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:24.304565" elapsed="0.002345"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.307509" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.307169" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.308611" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.308258" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.308689" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:49:24.308868" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.307911" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.309048" elapsed="0.000375"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:24.307027" elapsed="0.002453"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.310072" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.309736" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.311066" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.310713" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.311144" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:24.311300" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.310295" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.311500" elapsed="0.000279"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:24.309598" elapsed="0.002232"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.312412" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.312091" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.313368" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.313027" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.313445" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:49:24.313614" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.312647" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.313794" elapsed="0.000270"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:24.311953" elapsed="0.002157"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.314716" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.314363" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.315624" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.315275" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.315703" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:24.315857" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.314932" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.316036" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:24.314226" elapsed="0.002120"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.316974" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.316614" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.317915" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.317553" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.317991" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:24.318146" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.317189" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.318325" elapsed="0.000339"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:24.316476" elapsed="0.002240"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.319306" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.318975" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.320229" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.319892" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.320308" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:24.320478" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.319545" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.320662" elapsed="0.000490"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:24.318837" elapsed="0.002400"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.321834" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:24.321508" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:24.322759" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.322393" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:24.322837" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:24.322990" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:24.322049" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:24.323168" elapsed="0.000269"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:24.321355" elapsed="0.002142"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:24.304295" elapsed="0.019239"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:24.323582" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:24.323747" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:24.303075" elapsed="0.020699"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:24.302726" elapsed="0.021080"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.323995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.323836" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.302697" elapsed="0.021375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.325051" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:24.324222" elapsed="0.000858"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:24.325131" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:24.298714" elapsed="0.026545"/>
</kw>
<msg time="2026-05-01T00:49:24.325318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:24.283629" elapsed="0.041743"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.339909" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.353761" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.367520" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.367842" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.368035" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.368479" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.368310" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:24.368290" elapsed="0.000275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.368742" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.368923" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.369092" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:24.368249" elapsed="0.000903"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.368123" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.369329" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.369410" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:49:24.369591" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:24.278724" elapsed="0.090897"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:24.371142" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.370766" elapsed="0.000456">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:24.371317" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:24.370336" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.371703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.371413" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.372265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:24.371971" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:24.371784" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.371395" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.375192" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:24.372517" elapsed="0.002703"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:24.375272" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:24.375432" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:24.369966" elapsed="0.005504"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:24.376875" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.376618" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:24.377033" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:24.376115" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:24.377265" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:49:24.377128" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:24.377109" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.377554" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.377731" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.377797" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:24.379922" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:24.375786" elapsed="0.004162"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.381517" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.381241" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:24.381965" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:24.381721" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:24.390912" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:24.391081" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:24.391214" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.384374" elapsed="0.007259">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:24.382076" elapsed="0.009643">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.391915" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.391754" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:24.382058" elapsed="0.009945">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.392400" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.392553" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:24.392514" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:24.392496" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.392806" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.392879" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.380269" elapsed="0.012717">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.393062" elapsed="0.000019"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.250020" elapsed="0.143179">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:24.393693" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:24.393400" elapsed="0.000403"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:24.393374" elapsed="0.000463"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:24.393887" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.245294" elapsed="0.148736">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.455958" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:25.455538" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:25.456861" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.456564" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:25.457034" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:25.456197" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.457654" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:25.457240" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:25.457993" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:25.458174" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:25.457850" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.458632" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:25.458365" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.459689" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:25.459404" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.460195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.459908" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.461009" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.460622" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.461962" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.461608" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.462044" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:49:25.462208" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.461233" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.462394" elapsed="0.000335"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:25.460481" elapsed="0.002364"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.463445" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.463113" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.464603" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.464243" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.464682" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:25.464841" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.463853" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.465025" elapsed="0.000278"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:25.462971" elapsed="0.002375"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.465947" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.465621" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.466877" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.466535" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.466956" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:25.467111" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.466169" elapsed="0.000968"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.467293" elapsed="0.000291"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:25.465479" elapsed="0.002148"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.468223" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.467880" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.469144" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.468805" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.469222" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:25.469375" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.468443" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.469571" elapsed="0.000274"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:25.467743" elapsed="0.002144"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.470493" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.470141" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.471394" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.471059" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.471488" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:25.471643" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.470713" elapsed="0.000955"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.471824" elapsed="0.000273"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:25.470004" elapsed="0.002135"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.472757" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.472414" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.473681" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.473323" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.473789" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:25.473945" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.472976" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.474129" elapsed="0.000275"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:25.472275" elapsed="0.002173"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.475109" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.474782" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.476026" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.475690" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.476104" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:25.476294" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.475328" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.476490" elapsed="0.000477"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:25.474643" elapsed="0.002367"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.477607" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:25.477266" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:25.478552" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.478173" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:25.478632" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:25.478787" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:25.477827" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:25.478968" elapsed="0.000274"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:25.477126" elapsed="0.002159"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:25.460278" elapsed="0.019042"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:25.479365" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:25.479550" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:25.459068" elapsed="0.020510"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:25.458756" elapsed="0.020855"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.479793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:25.479637" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:25.458733" elapsed="0.021139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.480742" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:25.480020" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:25.480821" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:25.454890" elapsed="0.026059"/>
</kw>
<msg time="2026-05-01T00:49:25.481004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:25.440684" elapsed="0.040368"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.494982" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.508764" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.522614" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.522815" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.522998" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.523377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:25.523222" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:25.523207" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.523623" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.523798" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.523968" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:25.523177" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.523074" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.524230" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.524308" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:25.524434" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:25.435850" elapsed="0.088626"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:25.525749" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.525501" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:25.525908" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:25.525139" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.526261" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:25.526005" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.526830" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:25.526537" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:25.526342" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:25.525987" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.529644" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:25.527068" elapsed="0.002604"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:25.529724" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:25.529879" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:25.524810" elapsed="0.005095"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:25.531138" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.530908" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:25.531329" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:25.530563" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:25.531578" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:25.531425" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:25.531407" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.531813" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.531986" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.532052" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:25.534181" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:25.530217" elapsed="0.003992"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.535611" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:25.535344" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:25.536059" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:25.535815" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:25.545361" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:25.545524" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:25.545624" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.538495" elapsed="0.007558">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:25.536204" elapsed="0.009932">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.546411" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:25.546185" elapsed="0.000344"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:25.536182" elapsed="0.010381">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.547083" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.547272" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:25.547219" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:25.547195" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.547588" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.547690" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.534532" elapsed="0.013304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.547988" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.410545" elapsed="0.137609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:25.548566" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:25.548290" elapsed="0.000380"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:25.548266" elapsed="0.000437"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:25.548751" elapsed="0.000020"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:25.405629" elapsed="0.143258">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.610770" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:26.610278" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:26.611672" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.611351" elapsed="0.000408">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:26.611857" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:26.610998" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.612441" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:26.612054" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:26.612807" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:26.612979" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:26.612658" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.613422" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:26.613173" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.614537" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:26.614258" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.615023" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.614746" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.615832" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.615436" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.616852" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.616409" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.616935" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:26.617106" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.616060" elapsed="0.001072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.617299" elapsed="0.000314"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:26.615296" elapsed="0.002360"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.618437" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.617911" elapsed="0.000569"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.619368" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.619017" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.619446" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:49:26.619637" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.618673" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.619819" elapsed="0.000273"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:26.617774" elapsed="0.002361"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.620749" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.620397" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.621672" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.621311" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.621750" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:26.621903" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.620963" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.622084" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:26.620253" elapsed="0.002143"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.622996" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.622677" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.623974" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.623591" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.624051" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:26.624203" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.623213" elapsed="0.001015"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.624384" elapsed="0.000316"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:26.622538" elapsed="0.002205"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.625313" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.624993" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.626215" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.625883" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.626296" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:26.626446" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.625542" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.626642" elapsed="0.000283"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:26.624856" elapsed="0.002110"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.627551" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.627214" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.628512" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.628142" elapsed="0.000443"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.628640" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:26.628798" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.627787" elapsed="0.001036"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.628994" elapsed="0.000302"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:26.627078" elapsed="0.002261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.629944" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.629618" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.631106" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.630586" elapsed="0.000550"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.631196" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:26.631356" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.630181" elapsed="0.001201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.631557" elapsed="0.000313"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:26.629476" elapsed="0.002436"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.632532" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:26.632165" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:26.633432" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.633092" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:26.633525" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:26.633680" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:26.632749" elapsed="0.001063"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:26.633975" elapsed="0.000272"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:26.632027" elapsed="0.002261"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:26.615103" elapsed="0.019220"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:26.634366" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:26.634553" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:26.613925" elapsed="0.020655"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:26.613573" elapsed="0.021040"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.634794" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:26.634640" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:26.613546" elapsed="0.021325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.635767" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:26.635020" elapsed="0.000776"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:26.635846" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:26.609489" elapsed="0.026482"/>
</kw>
<msg time="2026-05-01T00:49:26.636026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:26.595165" elapsed="0.040908"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.650284" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.664161" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.678013" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.678221" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.678411" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.678827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:26.678675" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:26.678660" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.679055" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.679232" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.679400" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:26.678624" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.678513" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.679682" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.679760" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:26.679898" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:26.590238" elapsed="0.089687"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:26.681291" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.681022" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:26.681474" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:26.680648" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.681828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:26.681573" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.682385" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:26.682093" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:26.681908" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:26.681554" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.686428" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:26.682640" elapsed="0.003829"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:26.686524" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:26.686726" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:26.680258" elapsed="0.006494"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:26.688012" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.687776" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:26.688171" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:26.687399" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:26.688405" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:26.688268" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:26.688250" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.688659" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.688834" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.688900" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:26.691025" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:26.687067" elapsed="0.003984"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.692508" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:26.692241" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:26.692961" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:26.692713" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:26.702031" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:26.702175" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:26.702329" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.695357" elapsed="0.007508">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:26.693073" elapsed="0.009908">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.703250" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:26.703029" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:26.693055" elapsed="0.010321">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.703959" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.704194" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:26.704095" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:26.704071" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.704521" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.704623" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.691369" elapsed="0.013405">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.704879" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.564880" elapsed="0.140133">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:26.705404" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:26.705145" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:26.705121" elapsed="0.000440"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:26.705608" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:26.559875" elapsed="0.145870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.767933" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:27.767532" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:27.768753" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.768500" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:27.768925" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:27.768143" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.769526" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:27.769119" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:27.769860" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:27.770027" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:27.769718" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.770476" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:27.770216" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.771636" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:27.771301" elapsed="0.000476"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.772263" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.771947" elapsed="0.000344"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.773052" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.772696" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.774024" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.773654" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.774106" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:27.774270" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.773272" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.774486" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:27.772553" elapsed="0.002271"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.775422" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.775101" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.776538" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.776179" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.776618" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:27.776773" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.775833" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.776955" elapsed="0.000273"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:27.774940" elapsed="0.002331"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.777855" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.777538" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.778772" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.778407" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.778849" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:27.778999" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.778068" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.779214" elapsed="0.000304"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:27.777385" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.780131" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.779810" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.781039" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.780705" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.781115" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:27.781270" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.780345" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.781469" elapsed="0.000275"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:27.779673" elapsed="0.002112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.782355" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.782036" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.783535" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.783143" elapsed="0.000418"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.783615" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:27.783771" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.782764" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.784020" elapsed="0.000281"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:27.781899" elapsed="0.002444"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.784943" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.784615" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.785857" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.785526" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.785935" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:27.786087" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.785163" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.786268" elapsed="0.000307"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:27.784476" elapsed="0.002144"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.787219" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.786873" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.788370" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.787824" elapsed="0.000572"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.788462" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:27.788618" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.787436" elapsed="0.001206"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.788796" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:27.786737" elapsed="0.002370"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.789699" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:27.789363" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:27.790621" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.790257" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:27.790698" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:27.790850" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:27.789913" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:27.791029" elapsed="0.000307"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:27.789220" elapsed="0.002157"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:27.772345" elapsed="0.019067"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:27.791496" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:27.791662" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:27.770917" elapsed="0.020771"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:27.770603" elapsed="0.021118"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.791908" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:27.791751" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:27.770579" elapsed="0.021408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.792875" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:27.792136" elapsed="0.000769"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:27.792954" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:27.766820" elapsed="0.026262"/>
</kw>
<msg time="2026-05-01T00:49:27.793180" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:27.752442" elapsed="0.040797"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.807407" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.821285" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.835133" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.835365" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.835572" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.835994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:27.835839" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:27.835821" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.836226" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.836403" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.836591" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:27.835780" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.835657" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.836827" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.836907" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:27.837062" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:27.747206" elapsed="0.089884"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:27.838565" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.838212" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:27.838742" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:27.837812" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.839231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:27.838915" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.839820" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:27.839518" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:27.839315" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:27.838894" elapsed="0.001011"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.842765" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:27.840060" elapsed="0.002733"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:27.842846" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:49:27.843009" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:27.837437" elapsed="0.005617"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:27.844358" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.844079" elapsed="0.000346">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:27.844536" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:27.843734" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:27.844777" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:27.844638" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:27.844620" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.845013" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.845190" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.845256" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:27.847416" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:27.843383" elapsed="0.004059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.848894" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:27.848638" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:27.849339" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:27.849096" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:27.858084" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:27.858230" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:27.858333" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.851788" elapsed="0.006954">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:27.849463" elapsed="0.009363">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.859121" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:27.858914" elapsed="0.000282"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:27.849431" elapsed="0.009792">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.859641" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.859778" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:27.859740" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:27.859723" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.859994" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.860065" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.847781" elapsed="0.012393">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.860278" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.721800" elapsed="0.138620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:27.860847" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:27.860582" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:27.860556" elapsed="0.000433"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:27.861039" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:27.716922" elapsed="0.144257">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.922495" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:28.922089" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:28.923320" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:28.923063" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:28.923502" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:28.922723" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.924087" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:28.923700" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:28.924419" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:28.924669" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:28.924279" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.925108" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:28.924861" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.926145" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:28.925885" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.926666" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.926364" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.927423" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.927072" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.928359" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.928009" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.928440" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:49:28.928636" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.927664" elapsed="0.000997"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.928818" elapsed="0.000289"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:28.926932" elapsed="0.002216"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.929903" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.929403" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.930856" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.930480" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.930935" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:28.931090" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.930120" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.931271" elapsed="0.000288"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:28.929265" elapsed="0.002337"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.932172" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.931853" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.933094" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.932756" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.933172" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:28.933325" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.932386" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.933532" elapsed="0.000272"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:28.931716" elapsed="0.002130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.934421" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.934098" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.935338" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.935007" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.935415" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:28.935586" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.934664" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.935766" elapsed="0.000270"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:28.933960" elapsed="0.002118"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.936730" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.936370" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.937663" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.937291" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.937741" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:28.937894" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.936948" elapsed="0.000971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.938074" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:28.936230" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.938999" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.938678" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.939908" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.939572" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.939987" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:28.940140" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.939216" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.940324" elapsed="0.000303"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:28.938536" elapsed="0.002134"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.941238" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.940921" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.942348" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.941832" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.942426" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:49:28.942627" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.941489" elapsed="0.001163"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.942807" elapsed="0.000271"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:28.940785" elapsed="0.002334"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.943707" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:28.943371" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:28.944624" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.944261" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:28.944702" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:28.944854" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:28.943922" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:28.945034" elapsed="0.000270"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:28.943233" elapsed="0.002112"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:28.926746" elapsed="0.018635"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:28.945424" elapsed="0.000062"/>
</return>
<msg time="2026-05-01T00:49:28.945623" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:28.925551" elapsed="0.020100"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:28.925232" elapsed="0.020451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.945862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:28.945709" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:28.925210" elapsed="0.020729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.946841" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:28.946087" elapsed="0.000821"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:28.946961" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:28.921461" elapsed="0.025629"/>
</kw>
<msg time="2026-05-01T00:49:28.947148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:28.907310" elapsed="0.039886"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.967181" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.980923" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.994593" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.994794" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.994971" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.995342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:28.995194" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:28.995179" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.995583" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.995755" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.995921" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:28.995150" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:28.995047" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.996146" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:28.996221" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:28.996346" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:28.902621" elapsed="0.093752"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:28.997686" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:28.997431" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:28.997844" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:28.997083" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:28.998187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:28.997939" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:28.998836" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:28.998466" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:28.998268" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:28.997921" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:29.001671" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:28.999074" elapsed="0.002625"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:29.001752" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:29.001908" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:28.996752" elapsed="0.005181"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:29.003169" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:29.002939" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:29.003330" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:29.002602" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:29.003579" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:29.003426" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:29.003408" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.003813" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.003984" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:29.004050" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:49:29.006190" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:29.002242" elapsed="0.003975"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:29.007662" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:29.007396" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:29.008103" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:29.007863" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:29.017484" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:29.017622" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:29.017720" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:29.010559" elapsed="0.007565">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:29.008212" elapsed="0.009994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.018531" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:29.018241" elapsed="0.000390"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:29.008195" elapsed="0.010472">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.019242" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:29.019443" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:29.019387" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:29.019362" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.019780" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:29.019885" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:29.006577" elapsed="0.013465">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:29.020154" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:28.876547" elapsed="0.143753">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:29.020727" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:29.020439" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:29.020414" elapsed="0.000457"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:29.020920" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:28.871709" elapsed="0.149353">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.084622" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:30.084111" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:30.085525" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.085230" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:30.085703" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:30.084848" elapsed="0.000880"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.086437" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:30.086029" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:30.086836" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:30.087005" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:30.086664" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.087469" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:30.087199" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.088621" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:30.088339" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.089101" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.088832" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.089893" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.089539" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.090945" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.090568" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.091029" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:30.091216" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.090138" elapsed="0.001111"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.091464" elapsed="0.000315"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:30.089371" elapsed="0.002450"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.092596" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.092076" elapsed="0.000548"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.093533" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.093181" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.093625" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:30.093783" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.092817" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.093963" elapsed="0.000439"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:30.091938" elapsed="0.002507"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.095053" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.094731" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.095963" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.095629" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.096040" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:30.096192" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.095266" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.096370" elapsed="0.000284"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:30.094591" elapsed="0.002105"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.097281" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.096946" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.098416" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.097858" elapsed="0.000664"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.098591" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:30.098765" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.097518" elapsed="0.001272"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.098949" elapsed="0.000276"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:30.096811" elapsed="0.002456"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.099885" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.099554" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.100799" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.100468" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.100875" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:30.101025" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.100101" elapsed="0.000948"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.101203" elapsed="0.000282"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:30.099381" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.102117" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.101778" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.103033" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.102702" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.103110" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:30.103262" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.102331" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.103439" elapsed="0.000303"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:30.101642" elapsed="0.002142"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.104348" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.104033" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.105426" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.105095" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.105518" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:30.105672" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.104576" elapsed="0.001120"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.105849" elapsed="0.000311"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:30.103898" elapsed="0.002303"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.106795" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:30.106475" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:30.107712" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.107352" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:30.107788" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:30.107939" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:30.107010" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:30.108117" elapsed="0.000267"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:30.106313" elapsed="0.002112"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:30.089180" elapsed="0.019295"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:30.108520" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:30.108682" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:30.087998" elapsed="0.020743"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:30.087623" elapsed="0.021152"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.108956" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:30.108802" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:30.087593" elapsed="0.021443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.109892" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:30.109183" elapsed="0.000738"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:30.109988" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:30.083361" elapsed="0.026756"/>
</kw>
<msg time="2026-05-01T00:49:30.110172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:30.068122" elapsed="0.042098"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.124193" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.137939" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.151676" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.151873" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.152050" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.152416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:30.152270" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:30.152255" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.152656" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.152827" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.152994" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:30.152226" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.152124" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.153219" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.153294" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:30.153466" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:30.063344" elapsed="0.090151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:30.154807" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.154546" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:30.154967" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:30.154184" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.155309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:30.155062" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.155886" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:30.155595" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:30.155389" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:30.155044" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.159821" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:30.156122" elapsed="0.003727"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:30.159901" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:30.160057" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:30.153824" elapsed="0.006258"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:30.161326" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.161084" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:30.161500" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:30.160742" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:30.161734" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:30.161598" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:30.161579" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.161996" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.162177" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.162244" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:30.164381" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:30.160394" elapsed="0.004014"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.165819" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:30.165568" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:30.166281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:30.166039" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:30.174992" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:30.175161" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:30.175267" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.168782" elapsed="0.006872">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:30.166489" elapsed="0.009247">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.175933" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:30.175771" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:30.166467" elapsed="0.009555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.176406" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.176558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:30.176520" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:30.176503" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.176767" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.176839" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.164735" elapsed="0.012207">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.177018" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.038153" elapsed="0.138960">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:30.177390" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:30.177206" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:30.177189" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:30.177538" elapsed="0.000015"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:30.032104" elapsed="0.145532">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.239523" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:31.239098" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:31.240414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.240156" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:31.240602" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:31.239812" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.241209" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:31.240800" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:31.241599" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:31.241771" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:31.241406" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.242210" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:31.241964" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.243242" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:31.242983" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.243738" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.243467" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.244509" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.244138" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.245416" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.245072" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.245549" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:31.245711" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.244728" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.245893" elapsed="0.000291"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:31.244000" elapsed="0.002227"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.246821" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.246498" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.247896" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.247557" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.247974" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:31.248128" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.247195" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.248311" elapsed="0.000294"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:31.246344" elapsed="0.002302"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.249222" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.248901" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.250175" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.249841" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.250259" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:49:31.250441" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.249489" elapsed="0.001006"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.250695" elapsed="0.000280"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:31.248763" elapsed="0.002255"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.251661" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.251302" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.252591" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.252233" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.252670" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:31.252825" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.251884" elapsed="0.000968"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.253009" elapsed="0.000274"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:31.251135" elapsed="0.002190"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.253958" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.253636" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.254882" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.254553" elapsed="0.000355"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.254958" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:31.255109" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.254176" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.255287" elapsed="0.000287"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:31.253494" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.256182" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.255865" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.257086" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.256753" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.257163" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:31.257315" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.256396" elapsed="0.000945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.257560" elapsed="0.000278"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:31.255730" elapsed="0.002151"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.258487" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.258133" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.259584" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.259046" elapsed="0.000565"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.259661" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:31.259816" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.258704" elapsed="0.001137"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.259995" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:31.257997" elapsed="0.002308"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.260893" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:31.260573" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:31.261874" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.261535" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:31.261950" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:31.262104" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:31.261107" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:31.262322" elapsed="0.000312"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:31.260419" elapsed="0.002257"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:31.243816" elapsed="0.018896"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:31.262755" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:31.262917" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:31.242654" elapsed="0.020290"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:31.242332" elapsed="0.020645"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.263153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:31.263002" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:31.242310" elapsed="0.020919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.264079" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:31.263373" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:31.264158" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:31.238474" elapsed="0.025809"/>
</kw>
<msg time="2026-05-01T00:49:31.264338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:31.224153" elapsed="0.040234"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.278640" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.292475" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.306472" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.306694" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.306874" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.307254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:31.307105" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:31.307091" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.307491" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.307663" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.307879" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:31.307060" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.306950" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.308113" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.308191" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:31.308315" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:31.219402" elapsed="0.088941"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:31.309843" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.309593" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:31.310002" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:31.309178" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.310346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:31.310098" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.310919" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:31.310627" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:31.310427" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:31.310079" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.313815" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:31.311156" elapsed="0.002686"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:31.313895" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:31.314052" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:31.308850" elapsed="0.005226"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:31.315299" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.315068" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:31.315469" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:31.314731" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:31.315705" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:31.315568" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:31.315549" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.315938" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.316110" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.316176" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:31.318338" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:31.314389" elapsed="0.003977"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.319824" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:31.319567" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:31.320320" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:31.320074" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:31.330285" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:31.330494" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:31.330639" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.323029" elapsed="0.008128">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:31.320433" elapsed="0.010838">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.331562" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:31.331320" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:31.320414" elapsed="0.011274">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.332262" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.332474" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:31.332401" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:31.332376" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.332776" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.332876" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.318718" elapsed="0.014307">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.333130" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.193106" elapsed="0.140159">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:31.333701" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:31.333423" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:31.333377" elapsed="0.000461"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:31.333884" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:31.186304" elapsed="0.147716">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.397607" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:32.397198" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:32.398404" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.398157" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:32.398595" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:32.397815" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.399180" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:32.398792" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:32.399535" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:32.399699" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:32.399373" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.400129" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:32.399886" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.401199" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:32.400929" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.401694" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.401410" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.402480" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.402097" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.403390" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.403045" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.403501" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:32.403666" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.402699" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.403850" elapsed="0.000291"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:32.401958" elapsed="0.002225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.405241" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.404435" elapsed="0.000844"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.406234" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.405891" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.406312" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:32.406481" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.405526" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.406664" elapsed="0.000271"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:32.404298" elapsed="0.002679"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.407652" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.407297" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.408573" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.408209" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.408651" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:32.408804" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.407869" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.408995" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:32.407158" elapsed="0.002150"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.409895" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.409573" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.410800" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.410466" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.410878" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:32.411028" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.410111" elapsed="0.000941"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.411205" elapsed="0.000296"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:32.409422" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.412119" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.411796" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.413051" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.412706" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.413128" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:32.413281" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.412334" elapsed="0.000972"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.413476" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:32.411659" elapsed="0.002128"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.414353" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.414037" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.415256" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.414926" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.415335" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:32.415522" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.414584" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.415704" elapsed="0.000271"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:32.413901" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.416619" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.416267" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.417752" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.417220" elapsed="0.000559"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.417831" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:32.417983" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.416834" elapsed="0.001174"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.418162" elapsed="0.000269"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:32.416131" elapsed="0.002356"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.419102" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:32.418743" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:32.420027" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.419692" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:32.420104" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:32.420256" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:32.419321" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:32.420436" elapsed="0.000307"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:32.418604" elapsed="0.002181"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:32.401772" elapsed="0.019049"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:32.420865" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:32.421037" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:32.400575" elapsed="0.020489"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:32.400253" elapsed="0.020844"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.421276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:32.421123" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:32.400229" elapsed="0.021125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.422217" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:32.421523" elapsed="0.000722"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:32.422295" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:32.396547" elapsed="0.025872"/>
</kw>
<msg time="2026-05-01T00:49:32.422490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:32.382385" elapsed="0.040154"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.436420" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.450160" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.463852" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.464057" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.464235" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.464677" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:32.464527" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:32.464511" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.464932" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.465110" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.465278" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:32.464477" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.464353" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.465526" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.465604" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:32.465736" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:32.377516" elapsed="0.088247"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:32.467059" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.466799" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:32.467224" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:32.466427" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.467593" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:32.467320" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.468147" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:32.467858" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:32.467675" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:32.467301" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.470994" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:32.468380" elapsed="0.002641"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:32.471072" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:32.471229" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:32.466094" elapsed="0.005159"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:32.472494" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.472248" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:32.472651" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:32.471913" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:32.472915" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:32.472746" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:32.472727" elapsed="0.000273"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.473150" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.473322" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.473438" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:32.475585" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:32.471587" elapsed="0.004024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.477023" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:32.476757" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:32.477475" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:32.477221" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:32.811359" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:32.811704" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:32.811953" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.479857" elapsed="0.332965">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:32.477586" elapsed="0.335429">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.813539" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:32.813100" elapsed="0.000590"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:32.477568" elapsed="0.336174">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.814664" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.814965" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:32.814879" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:32.814841" elapsed="0.000274"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.815442" elapsed="0.000075"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.815627" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.475931" elapsed="0.339933">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.816031" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.352309" elapsed="0.463935">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:32.817072" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:32.816581" elapsed="0.000658"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:32.816541" elapsed="0.000751"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:32.817367" elapsed="0.000030"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:32.345135" elapsed="0.472410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.880088" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:33.879700" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:33.880956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.880669" elapsed="0.000367">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:33.881132" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:33.880316" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.881736" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:33.881332" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:33.882067" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:33.882234" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:33.881925" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.882676" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:33.882417" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.883718" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:33.883434" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.884209" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.883925" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.884997" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.884641" elapsed="0.000383"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.885938" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.885587" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.886017" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:33.886180" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.885215" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.886362" elapsed="0.000315"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:33.884500" elapsed="0.002218"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.887443" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.886970" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.888614" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.888258" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.888692" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:33.888844" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.887892" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.889024" elapsed="0.000269"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:33.886833" elapsed="0.002502"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.889941" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.889616" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.890858" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.890521" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.890935" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:33.891086" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.890157" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.891264" elapsed="0.000287"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:33.889476" elapsed="0.002117"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.892158" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.891840" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.893085" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.892752" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.893162" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:33.893312" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.892396" elapsed="0.000941"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.893519" elapsed="0.000272"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:33.891706" elapsed="0.002127"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.894400" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.894082" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.895321" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.894993" elapsed="0.000355"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.895397" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:33.895566" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.894651" elapsed="0.000940"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.895744" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:33.893946" elapsed="0.002106"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.896669" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.896330" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.897588" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.897224" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.897666" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:33.897819" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.896884" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.897997" elapsed="0.000272"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:33.896166" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.898917" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.898597" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.900040" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.899706" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.900116" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:33.900288" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.899133" elapsed="0.001179"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.900483" elapsed="0.000275"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:33.898425" elapsed="0.002375"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.901368" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:33.901051" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:33.902281" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.901950" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:33.902357" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:33.902544" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:33.901612" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:33.902723" elapsed="0.000268"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:33.900915" elapsed="0.002117"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:33.884289" elapsed="0.018777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:33.903109" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:33.903269" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:33.883112" elapsed="0.020182"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:33.882803" elapsed="0.020523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.903525" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:33.903353" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:33.882778" elapsed="0.020826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.904484" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:33.903754" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:33.904564" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:33.879066" elapsed="0.025622"/>
</kw>
<msg time="2026-05-01T00:49:33.904742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:33.864980" elapsed="0.039810"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.918606" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.932532" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.946317" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.946539" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.946722" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.947108" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:33.946950" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:33.946935" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.947334" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.947518" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.947688" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:33.946904" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.946800" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.947915" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.947990" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:33.948116" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:33.860267" elapsed="0.087877"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:33.949584" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.949314" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:33.949748" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:33.948953" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.950095" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:33.949843" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.950673" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:33.950358" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:33.950175" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:33.949825" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.954754" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:33.950909" elapsed="0.003873"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:33.954835" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:33.954994" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:33.948622" elapsed="0.006396"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:33.956271" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.956022" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:33.956487" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:33.955676" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:33.956724" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:33.956586" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:33.956567" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.956960" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.957134" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.957202" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:33.959333" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:33.955329" elapsed="0.004031"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.960799" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:33.960544" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:33.961246" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:33.961003" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:33.970432" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:33.970603" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:33.970715" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.963645" elapsed="0.007458">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:33.961356" elapsed="0.009832">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.971381" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:33.971223" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:33.961338" elapsed="0.010153">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.971871" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.972002" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:33.971966" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:33.971949" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.972253" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.972326" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.959693" elapsed="0.012738">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.972608" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.835030" elapsed="0.137714">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:33.973130" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:33.972873" elapsed="0.000362"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:33.972849" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:33.973314" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:33.829976" elapsed="0.143497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.035873" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:35.035464" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.036708" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.036428" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.036881" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.036087" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.037480" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:35.037078" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.037815" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:35.037984" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:35.037675" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.038420" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.038174" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.039484" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.039206" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.040051" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.039776" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.040838" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.040470" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.041773" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.041399" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.041920" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:35.042084" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.041056" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.042268" elapsed="0.000312"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:35.040315" elapsed="0.002308"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.043203" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.042878" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.044314" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.043975" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.044393" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.044566" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.043606" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.044749" elapsed="0.000277"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:35.042741" elapsed="0.002326"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.045660" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.045320" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.046579" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.046225" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.046656" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.046807" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.045879" elapsed="0.000953"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.046986" elapsed="0.000272"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:35.045183" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.047913" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.047577" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.048821" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.048486" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.048898" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:35.049050" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.048128" elapsed="0.000948"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.049231" elapsed="0.000286"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:35.047412" elapsed="0.002147"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.050131" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.049810" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.051043" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.050709" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.051120" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.051272" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.050349" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.051476" elapsed="0.000302"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:35.049673" elapsed="0.002146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.052390" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.052070" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.053297" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.052967" elapsed="0.000356"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.053428" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:49:35.053604" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.052625" elapsed="0.001004"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.053786" elapsed="0.000277"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:35.051933" elapsed="0.002172"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.054702" level="INFO">${value} = 64497</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.054359" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.055850" level="INFO">${encoded} = 64497</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.055265" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.055929" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.056083" level="INFO">${encoded_value} = 64497</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.054924" elapsed="0.001183"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.056263" elapsed="0.000292"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-05-01T00:49:35.054222" elapsed="0.002375"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.057174" level="INFO">${value} = 8.0.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.056850" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.058089" level="INFO">${encoded} = 8.0.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.057750" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.058165" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.058317" level="INFO">${encoded_value} = 8.0.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.057389" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.058510" elapsed="0.000333"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:35.056713" elapsed="0.002172"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:35.040130" elapsed="0.018790"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:35.058964" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:35.059125" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64497', 'PREFIXLEN': '8.0.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:35.038875" elapsed="0.020276"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:35.038563" elapsed="0.020621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.059365" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.059210" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.038539" elapsed="0.020903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.060390" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:35.059676" elapsed="0.000743"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:35.060487" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:35.034829" elapsed="0.025787"/>
</kw>
<msg time="2026-05-01T00:49:35.060672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:35.020654" elapsed="0.040069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.074870" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.088829" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.102857" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.103062" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.103244" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.103669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.103498" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.103481" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.103897" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.104067" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.104235" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:35.103433" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.103325" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.104481" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.104560" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:35.104691" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:35.015905" elapsed="0.088813"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.106115" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.105764" elapsed="0.000430">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.106288" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.105388" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.106660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.106383" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.107219" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:35.106925" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:35.106741" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.106365" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.110082" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:35.107472" elapsed="0.002637"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:35.110160" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.110357" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:35.105050" elapsed="0.005332"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.111669" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.111377" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.111827" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.111041" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:35.112061" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:35.111922" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.111904" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.112293" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.112480" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.112548" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:35.114694" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:35.110715" elapsed="0.004006"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.116162" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.115907" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.116623" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.116362" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:35.126132" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:35.126271" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:35.126382" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.119015" elapsed="0.007777">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:35.116734" elapsed="0.010144">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.127089" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.126916" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:35.116716" elapsed="0.010463">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.127641" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.127856" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.127755" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.127736" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.128079" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.128150" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.115045" elapsed="0.013216">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.128338" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:34.989746" elapsed="0.138689">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.128738" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.128552" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.128533" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.128868" elapsed="0.000015"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:34.982965" elapsed="0.146002">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<msg time="2026-05-01T00:49:35.129070" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:49:24.240076" elapsed="10.889090">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.130612" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:49:35.130271" elapsed="0.000385"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:35.129871" elapsed="0.000836"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:35.129533" elapsed="0.001231"/>
</kw>
<doc>Verifies iBGP's adj-rib-out output. Expects local-as, and ebgp peer-as presence.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:49:24.153141" elapsed="10.977663">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</test>
<test id="s1-s9-t19" name="TC_LAS_Verify_eBGP_Rib_Out" line="360">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:35.136931" elapsed="0.000309"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:35.136551" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.138780" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.138611" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.138583" elapsed="0.000297"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.146276" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.146167" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.146148" elapsed="0.000265"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.147480" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:35.147065" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.147998" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:35.147699" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:35.148070" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:35.148234" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:35.146681" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.154442" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.154333" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.154314" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.155794" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.155671" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.155653" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:35.156324" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.156014" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:35.156754" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:35.156531" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:35.189261" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:35.157277" elapsed="0.032090"/>
</kw>
<msg time="2026-05-01T00:49:35.189554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:35.189601" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:35.156938" elapsed="0.032700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:35.236955" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "e "B "G "P "_ "R "i "b "_ "O "u "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:35.190159" elapsed="0.046903"/>
</kw>
<msg time="2026-05-01T00:49:35.237223" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:35.237269" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "e "B "G "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:35.189813" elapsed="0.047494"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.237662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.237385" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.237365" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.238191" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "e "B "G "P "_ "R "i "b "_ "O "u "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.237890" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.238562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.238326" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.238308" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:35.238675" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:35.241410" elapsed="0.000250"/>
</kw>
<msg time="2026-05-01T00:49:35.241725" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:35.240170" elapsed="0.001691"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.242165" elapsed="0.000119"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.242749" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:35.239518" elapsed="0.003427"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:35.238967" elapsed="0.004045"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:35.155308" elapsed="0.087803"/>
</kw>
<msg time="2026-05-01T00:49:35.243204" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:35.243250" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "e "B "G "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:35.154685" elapsed="0.088604"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:35.243494" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:49:35.243367" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.243348" elapsed="0.000255"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.244011" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.244355" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.244427" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:35.153992" elapsed="0.090561"/>
</kw>
<msg time="2026-05-01T00:49:35.244646" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:35.244690" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "V "e "r "i "f "y "_ "e "B "G "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:35.148669" elapsed="0.096059"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.245056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.244803" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.244786" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:35.148518" elapsed="0.096639"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:35.148316" elapsed="0.096872"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:35.145793" elapsed="0.099450"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:35.138169" elapsed="0.107130"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:35.137558" elapsed="0.107786"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:35.132170" elapsed="0.113230"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.246396" level="INFO">&amp;{mapping} = { IP=127.0.0.3 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | AS_NUMBER=65432 | PEER_AS=64496 | PREFIXLEN=8.1.0.0/28 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${eBGP_PEER1_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>AS_NUMBER=${LOCAL_AS}</arg>
<arg>PEER_AS=${DEFAULT_AS}</arg>
<arg>PREFIXLEN=${iBGP_PEER1_FIRST_PREFIX_IP}/${PREFIX_LEN}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.245620" elapsed="0.000805"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.301196" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:35.300807" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.302006" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.301746" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.302176" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.301392" elapsed="0.000928"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.302910" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:35.302517" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.303241" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:35.303399" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:35.303103" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.303870" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.303624" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.304884" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.304628" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.305349" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.305090" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.306078" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.305754" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.307005" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.306660" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.307081" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.307233" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.306293" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.307413" elapsed="0.000339"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:35.305617" elapsed="0.002176"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.308360" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.308044" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.309266" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.308931" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.309343" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:35.309512" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.308590" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.309691" elapsed="0.000271"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:35.307907" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.310752" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.310252" elapsed="0.000526"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.311796" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.311310" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.311873" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.312025" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.310970" elapsed="0.001079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.312204" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:35.310114" elapsed="0.002428"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.313115" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.312791" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.314079" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.313743" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.314155" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.314307" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.313365" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.314503" elapsed="0.000273"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:35.312656" elapsed="0.002162"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.315383" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.315067" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.316303" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.315967" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.316380" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.316549" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.315627" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.316727" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:35.314932" elapsed="0.002106"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.317644" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.317285" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.318545" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.318197" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.318622" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.318781" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.317857" elapsed="0.000948"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.318959" elapsed="0.000270"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:35.317152" elapsed="0.002118"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.319880" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.319559" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.320784" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.320433" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.320860" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.321013" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.320094" elapsed="0.000943"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.321190" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:35.319383" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.322096" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:35.321778" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:35.323179" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.322669" elapsed="0.000536"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:35.323255" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:35.323408" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:35.322311" elapsed="0.001121"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:35.323618" elapsed="0.000270"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:35.321643" elapsed="0.002285"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:35.305423" elapsed="0.018539"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:35.324006" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:35.324165" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:35.304283" elapsed="0.019940"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:35.303984" elapsed="0.020274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.324438" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.324283" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.303965" elapsed="0.020587"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.325400" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:35.324716" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:35.325521" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:35.300172" elapsed="0.025477"/>
</kw>
<msg time="2026-05-01T00:49:35.325703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:35.286175" elapsed="0.039576"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.339620" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.353475" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.367222" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.367418" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.367641" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.368014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.367865" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.367851" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.368239" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.368409" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.368594" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:35.367821" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.367719" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.368822" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.368941" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:35.369069" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:35.281509" elapsed="0.087588"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.370365" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.370118" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.370541" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.369774" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.370890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.370642" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.371434" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:35.371143" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:35.370971" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.370624" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.374236" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:35.371703" elapsed="0.002560"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:35.374315" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:35.374484" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:35.369427" elapsed="0.005084"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:35.375824" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.375508" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:35.375980" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:35.375142" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:35.376210" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:35.376076" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:35.376056" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.376442" elapsed="0.000043"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.376637" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.376702" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:35.378825" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:35.374817" elapsed="0.004034"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.380265" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.380019" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:35.380721" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:35.380480" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:35.393317" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:35.393580" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:35.393717" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.383100" elapsed="0.011109">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:35.380829" elapsed="0.013493">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.394609" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.394369" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:35.380811" elapsed="0.013922">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.395252" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.395433" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:35.395383" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.395359" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.395773" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.395869" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.379165" elapsed="0.016851">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.396118" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.256143" elapsed="0.140105">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:35.396648" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:35.396376" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:35.396353" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:35.396827" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.251351" elapsed="0.145608">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.460068" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:36.459673" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:36.460959" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.460709" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:36.461130" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:36.460343" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.461728" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:36.461326" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:36.462064" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:36.462212" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:36.461921" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.462665" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:36.462398" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.463762" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:36.463490" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.464244" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.463975" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.465013" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.464666" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.465978" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.465629" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.466058" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:36.466220" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.465232" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.466402" elapsed="0.000313"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:36.464524" elapsed="0.002233"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.468593" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.467041" elapsed="0.001580"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.469523" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.469168" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.469605" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:49:36.469768" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.468818" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.469950" elapsed="0.000275"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:36.466873" elapsed="0.003394"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.470877" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.470544" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.471855" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.471502" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.471933" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:36.472087" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.471116" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.472307" elapsed="0.000295"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:36.470384" elapsed="0.002261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.473220" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.472896" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.474138" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.473799" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.474215" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:36.474368" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.473435" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.474573" elapsed="0.000456"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:36.472759" elapsed="0.002312"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.475682" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.475322" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.476586" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.476238" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.476663" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:36.476815" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.475898" elapsed="0.000941"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.476992" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:36.475187" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.477912" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.477569" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.478842" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.478502" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.478922" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:49:36.479121" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.478127" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.479303" elapsed="0.000292"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:36.477417" elapsed="0.002219"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.480209" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.479888" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.522490" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.480782" elapsed="0.041756"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.522622" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:49:36.522835" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.480423" elapsed="0.042437"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.523109" elapsed="0.000332"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:36.479752" elapsed="0.043750"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.524156" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:36.523780" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:36.525181" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.524841" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:36.525258" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:36.525423" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:36.524468" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:36.525697" elapsed="0.000279"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:36.523637" elapsed="0.002380"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:36.464322" elapsed="0.061731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:36.526099" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:36.526261" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:36.463138" elapsed="0.063150"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:36.462787" elapsed="0.063534"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.526531" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:36.526350" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:36.462764" elapsed="0.063845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.527546" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:36.526757" elapsed="0.000819"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:36.527628" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:36.459022" elapsed="0.068734"/>
</kw>
<msg time="2026-05-01T00:49:36.527814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:36.444814" elapsed="0.083054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.541893" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.556022" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.570481" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.570692" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.570878" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.571306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:36.571155" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:36.571138" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.571547" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.571723" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.571947" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:36.571103" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.570986" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.572179" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.572257" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:36.572399" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:36.440096" elapsed="0.132331"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:36.573795" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.573515" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:36.573963" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:36.573123" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.574323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:36.574060" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.575082" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:36.574604" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:36.574405" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:36.574042" elapsed="0.001125"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.577750" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:36.575321" elapsed="0.002457"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:36.577831" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:36.577989" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:36.572776" elapsed="0.005238"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:36.579283" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.579046" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:36.579440" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:36.578671" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:36.579690" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:49:36.579553" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:36.579535" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.579921" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.580092" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.580157" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:49:36.582417" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:36.578323" elapsed="0.004121"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.583880" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:36.583627" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:36.584369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:36.584118" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:36.599801" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:36.600079" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:36.600320" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.586807" elapsed="0.014311">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:36.584521" elapsed="0.016779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.601764" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:36.601376" elapsed="0.000534"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:36.584501" elapsed="0.017464">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.602852" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.603181" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:36.603099" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:36.603060" elapsed="0.000265"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.603717" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.603882" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.582775" elapsed="0.021340">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.604286" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.414841" elapsed="0.189687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:36.605149" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:36.604741" elapsed="0.000570"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:36.604704" elapsed="0.000661"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:36.605440" elapsed="0.000063"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:36.408009" elapsed="0.197679">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.667235" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:37.666833" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:37.668074" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.667812" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:37.668249" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:37.667465" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.668848" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:37.668445" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:37.669184" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:37.669369" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:37.669042" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.669830" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:37.669577" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.670964" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:37.670690" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.671483" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.671185" elapsed="0.000327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.672329" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.671923" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.673317" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.672954" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.673399" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:37.673587" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.672586" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.673775" elapsed="0.000298"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:37.671757" elapsed="0.002359"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.674744" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.674374" elapsed="0.000397"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.675698" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.675324" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.675777" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:37.675944" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.674972" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.676137" elapsed="0.000281"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:37.674234" elapsed="0.002242"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.677309" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.676794" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.678269" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.677921" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.678347" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:37.678570" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.677556" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.678751" elapsed="0.000272"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:37.676653" elapsed="0.002412"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.679664" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.679313" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.680588" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.680238" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.680665" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:37.680817" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.679895" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.680996" elapsed="0.000269"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:37.679178" elapsed="0.002128"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.681926" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.681574" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.682926" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.682581" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.683005" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:37.683181" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.682160" elapsed="0.001048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.683365" elapsed="0.000334"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:37.681421" elapsed="0.002321"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.684324" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.683998" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.685265" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.684925" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.685342" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:37.685513" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.684560" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.685692" elapsed="0.000272"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:37.683860" elapsed="0.002146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.686641" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.686269" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.687596" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.687226" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.687682" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:37.687842" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.686858" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.688026" elapsed="0.000273"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:37.686132" elapsed="0.002210"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.689007" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:37.688635" elapsed="0.000399"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:37.690129" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.689791" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:37.690208" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:37.690364" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:37.689241" elapsed="0.001178"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:37.690606" elapsed="0.000309"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:37.688481" elapsed="0.002484"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:37.671564" elapsed="0.019438"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:37.691046" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:37.691210" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:37.670289" elapsed="0.020948"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:37.669957" elapsed="0.021312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.691480" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:37.691295" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:37.669933" elapsed="0.021628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.692411" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:37.691709" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:37.692512" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:37.666144" elapsed="0.026500"/>
</kw>
<msg time="2026-05-01T00:49:37.692701" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:37.651676" elapsed="0.041075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.707215" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.721213" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.735247" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.735462" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.735645" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.736174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:37.736023" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:37.736007" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.736399" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.736594" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.736767" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:37.735975" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.735862" elapsed="0.000984"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.736995" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.737072" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:37.737203" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:37.646871" elapsed="0.090359"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:37.738577" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.738267" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:37.738745" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:37.737913" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.739090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:37.738841" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.739665" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:37.739350" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:37.739171" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:37.738823" elapsed="0.000924"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.742445" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:37.739899" elapsed="0.002597"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:37.742549" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:37.742707" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:37.737578" elapsed="0.005153"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:37.743956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.743723" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:37.744111" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:37.743366" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:37.744339" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:37.744205" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:37.744187" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.744588" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.744761" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.744865" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:37.747038" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:37.743041" elapsed="0.004024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.748488" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:37.748225" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:37.748928" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:37.748689" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:37.757934" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:37.758072" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:37.758169" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.751331" elapsed="0.007249">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:37.749037" elapsed="0.009664">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.758964" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:37.758749" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:37.749019" elapsed="0.010069">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.759636" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.759824" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:37.759772" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:37.759748" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.760115" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.760215" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.747385" elapsed="0.012974">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.760484" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.620956" elapsed="0.139669">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:37.761071" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:37.760816" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:37.760790" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:37.761255" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:37.616042" elapsed="0.145349">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.823462" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:38.823046" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:38.824482" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.824169" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:38.824660" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:38.823681" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.825243" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:38.824856" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:38.825598" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:38.825775" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:38.825432" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.826229" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:38.825985" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.827267" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:38.827006" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.827765" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.827495" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.828571" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.828176" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.829516" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.829144" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.829597" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:38.829759" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.828797" elapsed="0.000987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.829959" elapsed="0.000299"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:38.828030" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.831053" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.830571" elapsed="0.000509"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.832054" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.831720" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.832131" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:38.832284" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.831351" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.832476" elapsed="0.000288"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:38.830417" elapsed="0.002389"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.833377" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.833055" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.834320" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.833981" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.834399" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:38.834570" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.833612" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.834749" elapsed="0.000271"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:38.832920" elapsed="0.002142"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.835645" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.835312" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.836550" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.836199" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.836628" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:38.836779" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.835858" elapsed="0.000945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.836956" elapsed="0.000270"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:38.835177" elapsed="0.002091"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.838166" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.837547" elapsed="0.000685"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.840270" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.839519" elapsed="0.000810"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.840441" elapsed="0.000098"/>
</return>
<msg time="2026-05-01T00:49:38.840816" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.838714" elapsed="0.002157"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.841212" elapsed="0.000733"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:38.837383" elapsed="0.004657"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.843432" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.842643" elapsed="0.000885"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.845709" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.844838" elapsed="0.000934"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.845919" elapsed="0.000074"/>
</return>
<msg time="2026-05-01T00:49:38.846289" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.843984" elapsed="0.002364"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.846755" elapsed="0.000655"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:38.842300" elapsed="0.005242"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.848959" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.848151" elapsed="0.000870"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.851117" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.850773" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.851196" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:38.851349" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.849534" elapsed="0.001840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.851545" elapsed="0.000272"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:38.847826" elapsed="0.004033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.852430" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:38.852109" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:38.853341" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.853006" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:38.853419" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:49:38.853600" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:38.852665" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:38.853785" elapsed="0.000414"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:38.851973" elapsed="0.002268"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:38.827845" elapsed="0.026431"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:38.854319" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:38.854497" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:38.826678" elapsed="0.027847"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:38.826354" elapsed="0.028203"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.854734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:38.854582" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:38.826330" elapsed="0.028482"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.855659" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:38.854957" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:38.855739" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:38.822403" elapsed="0.033461"/>
</kw>
<msg time="2026-05-01T00:49:38.855918" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:38.808217" elapsed="0.047750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.869829" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.883714" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.897567" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.897770" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.897964" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.898335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:38.898184" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:38.898170" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.898573" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.898743" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.898910" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:38.898140" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.898039" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.899134" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.899210" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:38.899333" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:38.802668" elapsed="0.096693"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:38.900627" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.900371" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:38.900785" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:38.900026" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.901127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:38.900880" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.901703" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:38.901387" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:38.901207" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:38.900862" elapsed="0.000926"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.904563" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:38.901972" elapsed="0.002619"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:38.904646" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:38.904805" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:38.899700" elapsed="0.005131"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:38.906086" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.905841" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:38.906278" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:38.905480" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:38.906528" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:38.906376" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:38.906356" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.906764" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.906938" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.907004" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:38.909136" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:38.905140" elapsed="0.004022"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.910584" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:38.910320" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:38.911031" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:38.910791" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:38.920185" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:38.920326" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:38.920424" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.913419" elapsed="0.007411">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:38.911141" elapsed="0.009772">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.921104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:38.920948" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:38.911123" elapsed="0.010070">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.921590" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.921724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:38.921686" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:38.921669" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.921993" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.922065" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.909493" elapsed="0.012678">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.922280" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.777161" elapsed="0.145218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:38.922686" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:38.922489" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:38.922471" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:38.922872" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:38.770374" elapsed="0.152633">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.986586" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:39.986178" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:39.987397" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:39.987139" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:39.987592" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:39.986798" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.988174" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:39.987787" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:39.988523" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:39.988696" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:39.988367" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.989132" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:39.988889" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.990155" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:39.989896" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.990650" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.990366" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.991478" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:39.991052" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:39.992409" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.992046" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:39.992566" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:39.992731" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:39.991701" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.992915" elapsed="0.000294"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:39.990913" elapsed="0.002338"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.995128" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:39.993672" elapsed="0.001484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:39.996093" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.995746" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:39.996174" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:39.996331" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:39.995362" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.996537" elapsed="0.000276"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:39.993531" elapsed="0.003325"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.997438" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:39.997114" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:39.998359" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.998019" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:39.998437" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:49:39.998610" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:39.997674" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:39.998790" elapsed="0.000273"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:39.996974" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:39.999722" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:39.999371" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:40.000649" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.000280" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:40.000726" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:40.000879" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:39.999937" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.001058" elapsed="0.000272"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:39.999233" elapsed="0.002139"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.001964" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:40.001642" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:40.002867" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.002532" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:40.002943" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:40.003114" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:40.002178" elapsed="0.000963"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.003294" elapsed="0.000301"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:40.001504" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.004205" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:40.003885" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:40.005125" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.004795" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:40.005242" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:40.005398" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:40.004423" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.005594" elapsed="0.000273"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:40.003750" elapsed="0.002160"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.006498" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:40.006161" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:40.007635" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.007066" elapsed="0.000597"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:40.007716" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:40.007877" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:40.006715" elapsed="0.001187"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.008058" elapsed="0.000274"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:40.006026" elapsed="0.002348"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.008992" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:40.008667" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:40.009906" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.009569" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:40.009983" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:40.010136" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:40.009209" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:40.010313" elapsed="0.000286"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:40.008529" elapsed="0.002111"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:39.990728" elapsed="0.019947"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:40.010718" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:40.010882" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:39.989569" elapsed="0.021350"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:39.989252" elapsed="0.021699"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.011126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:40.010976" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:39.989230" elapsed="0.021972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.012060" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:40.011344" elapsed="0.000745"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:40.012139" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:39.985550" elapsed="0.026730"/>
</kw>
<msg time="2026-05-01T00:49:40.012338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:39.971286" elapsed="0.041101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.026237" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.040137" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.054331" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.054578" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.054764" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.055184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:40.055016" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:40.054994" elapsed="0.000275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.055416" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.055607" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.055778" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:40.054958" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.054845" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.056035" elapsed="0.000126"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.056225" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:40.056368" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:39.966577" elapsed="0.089818"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:40.057812" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:40.057520" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:40.057985" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:40.057105" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.058370" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:40.058081" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.058969" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:40.058666" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:40.058479" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:40.058062" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.061961" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:40.059215" elapsed="0.002774"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:40.062043" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:40.062254" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:40.056760" elapsed="0.005520"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:40.063579" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:40.063323" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:40.063749" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:40.062978" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:40.064004" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:40.063863" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:40.063844" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.064241" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.064414" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.064500" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:40.066706" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:40.062623" elapsed="0.004111"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.068200" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:40.067927" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:40.068670" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:40.068405" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:40.078954" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:40.079097" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:40.079210" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:40.071113" elapsed="0.008497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:40.068782" elapsed="0.010912">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.079887" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:40.079729" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:40.068763" elapsed="0.011241">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.080394" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.080579" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:40.080510" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:40.080492" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.080801" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.080871" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:40.067076" elapsed="0.013901">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.081069" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:39.941217" elapsed="0.139981">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:40.081514" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:40.081298" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:40.081280" elapsed="0.000332"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:40.081649" elapsed="0.000018"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:39.934562" elapsed="0.147230">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.146269" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:41.145780" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:41.147160" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.146881" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:41.147350" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:41.146514" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.147982" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:41.147566" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:41.148327" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:41.148537" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:41.148179" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.148979" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:41.148729" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.150207" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:41.149936" elapsed="0.000397"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.150805" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.150522" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.151623" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.151238" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.152654" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.152249" elapsed="0.000433"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.152739" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:49:41.152923" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.151889" elapsed="0.001060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.153113" elapsed="0.000350"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:41.151094" elapsed="0.002415"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.154318" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.153769" elapsed="0.000576"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.155319" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.154910" elapsed="0.000437"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.155401" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:41.155579" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.154561" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.155777" elapsed="0.000337"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:41.153629" elapsed="0.002536"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.156828" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.156474" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.157815" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.157439" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.158010" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:49:41.158175" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.157053" elapsed="0.001163"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.158372" elapsed="0.000309"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:41.156287" elapsed="0.002437"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.159306" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.158977" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.160269" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.159933" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.160347" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:41.160529" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.159572" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.160710" elapsed="0.000276"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:41.158840" elapsed="0.002189"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.161629" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.161284" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.162568" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.162205" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.162647" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:41.162801" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.161848" elapsed="0.000978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.163121" elapsed="0.000287"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:41.161146" elapsed="0.002467"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.164225" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.163893" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.165152" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.164813" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.165232" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:41.165388" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.164444" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.165587" elapsed="0.000299"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:41.163748" elapsed="0.002186"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.166618" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.166262" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.167847" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.167195" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.167938" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:41.168098" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.166843" elapsed="0.001283"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.168301" elapsed="0.000327"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:41.166089" elapsed="0.002584"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.169340" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:41.168974" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:41.170268" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.169930" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:41.170347" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:41.170520" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:41.169583" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:41.170701" elapsed="0.000313"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:41.168810" elapsed="0.002247"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:41.150891" elapsed="0.020202"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:41.171141" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:41.171322" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:41.149573" elapsed="0.021777"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:41.149118" elapsed="0.022270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.171633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:41.171419" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:41.149089" elapsed="0.022623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.172631" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:41.171863" elapsed="0.000798"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:41.172711" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:41.144938" elapsed="0.027909"/>
</kw>
<msg time="2026-05-01T00:49:41.172977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:41.129906" elapsed="0.043144"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.187241" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.201493" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.215585" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.215813" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.216006" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.216430" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:41.216272" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:41.216254" elapsed="0.000303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.216733" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.216912" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.217081" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:41.216214" elapsed="0.000920"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.216093" elapsed="0.001070"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.217367" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.217470" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:49:41.217632" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:41.124715" elapsed="0.092946"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:41.219119" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.218815" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:41.219299" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:41.218378" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.219753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:41.219473" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.220324" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:41.220027" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:41.219836" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:41.219437" elapsed="0.000971"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.223289" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:41.220580" elapsed="0.002738"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:41.223373" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:49:41.223554" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:41.218002" elapsed="0.005578"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:41.224843" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.224605" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:41.225003" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:41.224238" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:41.225262" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:49:41.225101" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:41.225082" elapsed="0.000287"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.225539" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.225721" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.225790" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:41.227989" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:41.223901" elapsed="0.004115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.229507" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:41.229190" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:41.229962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:41.229714" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:41.240059" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:41.240205" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:41.240306" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.232367" elapsed="0.008359">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:41.230089" elapsed="0.010729">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.241056" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:41.240891" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:41.230070" elapsed="0.011077">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.241583" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.241721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:41.241683" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:41.241666" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.241955" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.242028" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.228340" elapsed="0.013798">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.242214" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.098805" elapsed="0.143508">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:41.242623" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:41.242409" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:41.242392" elapsed="0.000328"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:41.242754" elapsed="0.000015"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:41.093200" elapsed="0.149652">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.306532" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:42.306088" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:42.307358" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.307097" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:42.307550" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:42.306754" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.308152" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:42.307743" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:42.308510" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:42.308752" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:42.308343" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.309188" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:42.308941" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.310272" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:42.310010" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.310773" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.310501" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.311559" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.311179" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.312534" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.312153" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.312617" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:42.312784" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.311779" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.312973" elapsed="0.000292"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:42.311043" elapsed="0.002264"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.314077" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.313575" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.314989" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.314650" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.315067" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:42.315218" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.314292" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.315397" elapsed="0.000287"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:42.313422" elapsed="0.002305"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.316309" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.315990" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.317233" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.316895" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.317310" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:42.317478" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.316553" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.317661" elapsed="0.000271"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:42.315840" elapsed="0.002133"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.318563" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.318228" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.319462" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.319118" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.319540" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:42.319690" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.318777" elapsed="0.000937"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.319879" elapsed="0.000270"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:42.318091" elapsed="0.002099"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.320842" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.320519" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.321745" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.321398" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.321822" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:42.321973" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.321058" elapsed="0.000940"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.322151" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:42.320347" elapsed="0.002131"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.323052" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.322729" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.324017" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.323641" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.324114" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:42.324298" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.323272" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.324532" elapsed="0.000289"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:42.322594" elapsed="0.002272"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.325463" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.325118" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.326561" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.326208" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.326638" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:42.326790" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.325685" elapsed="0.001129"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.326971" elapsed="0.000268"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:42.324982" elapsed="0.002297"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.327881" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:42.327541" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:42.328821" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.328478" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:42.328903" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:42.329054" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:42.328093" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:42.329233" elapsed="0.000321"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:42.327391" elapsed="0.002205"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:42.310855" elapsed="0.018776"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:42.329675" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:42.329835" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:42.309679" elapsed="0.020183"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:42.309320" elapsed="0.020574"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.330076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:42.329922" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:42.309294" elapsed="0.020857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.331032" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:42.330296" elapsed="0.000804"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:42.331153" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:42.305396" elapsed="0.025884"/>
</kw>
<msg time="2026-05-01T00:49:42.331337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:42.291093" elapsed="0.040295"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.345473" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.359317" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.373958" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.374208" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.374398" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.374864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:42.374692" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:42.374674" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.375104" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.375277" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.375467" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:42.374632" elapsed="0.000892"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.374500" elapsed="0.001052"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.375704" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.375784" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:42.375944" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:42.286341" elapsed="0.089633"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:42.377492" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.377184" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:42.377668" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:42.376780" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.378036" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:42.377767" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.378626" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:42.378308" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:42.378120" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:42.377748" elapsed="0.000973"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.381607" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:42.378889" elapsed="0.002747"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:42.381688" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:42.381852" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:42.376395" elapsed="0.005482"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:42.383202" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.382959" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:42.383366" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:42.382541" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:42.383623" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:42.383483" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:42.383462" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.383856" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.384030" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.384096" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:42.386222" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:42.382189" elapsed="0.004059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.387710" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:42.387435" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:42.388160" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:42.387916" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:42.396183" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:42.396333" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:42.396432" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.390580" elapsed="0.006292">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:42.388269" elapsed="0.008687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.397151" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:42.396990" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:42.388251" elapsed="0.008989">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.397650" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.397793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:42.397751" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:42.397733" elapsed="0.000127"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.398009" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.398081" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.386595" elapsed="0.011593">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.398264" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.260912" elapsed="0.137467">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:42.398692" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:42.398506" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:42.398488" elapsed="0.000301"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:42.398822" elapsed="0.000015"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:42.253877" elapsed="0.145044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.460606" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:43.460159" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:43.461514" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.461177" elapsed="0.000437">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:43.461711" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:43.460837" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.462421" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:43.462026" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:43.462792" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:43.463000" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:43.462638" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.463444" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:43.463190" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.464562" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:43.464269" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.465057" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.464774" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.465903" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.465514" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.466925" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.466524" elapsed="0.000436"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.467035" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:49:43.467274" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.466125" elapsed="0.001182"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.467496" elapsed="0.000353"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:43.465355" elapsed="0.002536"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.470340" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.468150" elapsed="0.002217"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.471277" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.470927" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.471354" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:43.471542" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.470576" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.471725" elapsed="0.000271"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:43.468011" elapsed="0.004027"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.472628" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.472290" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.473578" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.473189" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.473658" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:43.473812" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.472843" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.473993" elapsed="0.000285"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:43.472153" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.474947" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.474620" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.475883" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.475548" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.476009" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:43.476162" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.475163" elapsed="0.001024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.476342" elapsed="0.000296"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:43.474478" elapsed="0.002202"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.477249" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.476931" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.478163" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.477826" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.478239" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:43.478562" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.477481" elapsed="0.001108"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.478767" elapsed="0.000285"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:43.476794" elapsed="0.002300"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.479744" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.479347" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.480657" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.480302" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.480733" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:43.480884" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.479959" elapsed="0.000950"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.481062" elapsed="0.000271"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:43.479210" elapsed="0.002164"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.481961" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.481642" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.483075" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.482539" elapsed="0.000563"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.483154" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:43.483317" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.482176" elapsed="0.001168"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.483541" elapsed="0.000276"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:43.481504" elapsed="0.002355"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.484431" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:43.484108" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:43.485350" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.485009" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:43.485426" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:49:43.485596" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:43.484666" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:43.485774" elapsed="0.000273"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:43.483973" elapsed="0.002114"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:43.465150" elapsed="0.020972"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:43.486167" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:49:43.486330" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:43.463942" elapsed="0.022453"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:43.463602" elapsed="0.022828"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.486629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:43.486474" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:43.463570" elapsed="0.023137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.487668" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:43.486857" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:43.487747" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:43.459523" elapsed="0.028349"/>
</kw>
<msg time="2026-05-01T00:49:43.487930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:43.445247" elapsed="0.042732"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.502035" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.516067" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.530065" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.530298" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.530533" elapsed="0.000029"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.531107" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:43.530896" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:43.530870" elapsed="0.000355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.531433" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.531693" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.531892" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:43.530813" elapsed="0.001134"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.530649" elapsed="0.001329"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.532133" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.532217" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:49:43.532498" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:43.440434" elapsed="0.092098"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:43.534081" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.533742" elapsed="0.000439">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:43.534284" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:43.533273" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.534713" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:43.534384" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.535329" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:43.535014" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:43.534798" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:43.534365" elapsed="0.001051"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.538308" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:43.535590" elapsed="0.002746"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:43.538399" elapsed="0.000063"/>
</return>
<msg time="2026-05-01T00:49:43.538609" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:43.532890" elapsed="0.005747"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:43.539928" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.539689" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:43.540087" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:43.539322" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:43.540323" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:49:43.540184" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:43.540165" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.540578" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.540758" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.540841" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:43.543059" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:43.538983" elapsed="0.004104"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.544559" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:43.544277" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:43.545027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:43.544767" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:43.554643" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:43.554882" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:43.555010" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.547544" elapsed="0.007955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:43.545141" elapsed="0.010452">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.555790" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:43.555628" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:43.545123" elapsed="0.010756">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.556299" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.556440" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:43.556404" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:43.556386" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.556675" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.556746" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.543423" elapsed="0.013436">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.556935" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.415184" elapsed="0.141850">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:43.557318" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:43.557130" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:43.557113" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:43.557460" elapsed="0.000016"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:43.410192" elapsed="0.147368">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.620264" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:44.619776" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:44.621387" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.621091" elapsed="0.000411">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:44.621612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:44.620725" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.622247" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:44.621816" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:44.622633" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:44.622818" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:44.622477" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.623272" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:44.623014" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.624388" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:44.624108" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.624926" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.624634" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.625837" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.625359" elapsed="0.000512"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.627006" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.626620" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.627093" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:49:44.627271" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.626142" elapsed="0.001160"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.627484" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:44.625212" elapsed="0.002643"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.628680" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.628119" elapsed="0.000589"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.629642" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.629267" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.629722" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:44.629884" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.628908" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.630094" elapsed="0.000289"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:44.627977" elapsed="0.002451"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.631281" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.630749" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.632266" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.631905" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.632346" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:44.632527" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.631531" elapsed="0.001023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.632762" elapsed="0.000289"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:44.630587" elapsed="0.002508"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.633712" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.633354" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.634696" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.634311" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.634776" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:44.634936" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.633955" elapsed="0.001007"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.635119" elapsed="0.000281"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:44.633215" elapsed="0.002228"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.636087" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.635745" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.637118" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.636752" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.637199" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:44.637361" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.636322" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.637559" elapsed="0.000317"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:44.635580" elapsed="0.002342"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.638572" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.638197" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.639517" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.639153" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.639597" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:44.639753" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.638794" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.639936" elapsed="0.000279"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:44.638044" elapsed="0.002214"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.640867" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.640535" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.642045" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.641466" elapsed="0.000607"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.642126" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:44.642286" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.641089" elapsed="0.001222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.642514" elapsed="0.000284"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:44.640379" elapsed="0.002461"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.643437" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:44.643099" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:44.644388" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.644032" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:44.644484" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:44.644646" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:44.643676" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:44.644873" elapsed="0.000283"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:44.642958" elapsed="0.002240"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:44.625014" elapsed="0.020221"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:44.645281" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:44.645464" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:44.623767" elapsed="0.021727"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:44.623410" elapsed="0.022118"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.645724" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:44.645555" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:44.623382" elapsed="0.022424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.646728" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:44.645957" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:44.646809" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:44.618932" elapsed="0.028006"/>
</kw>
<msg time="2026-05-01T00:49:44.646995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:44.604378" elapsed="0.042668"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.661065" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.675006" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.689389" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.689619" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.689804" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.690194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:44.690043" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:44.690026" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.690420" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.690608" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.690841" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:44.689992" elapsed="0.000904"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.689885" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.691075" elapsed="0.000061"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.691195" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:44.691336" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:44.599590" elapsed="0.091775"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:44.692742" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.692431" elapsed="0.000387">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:44.692915" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:44.692062" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.693306" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:44.693033" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.693913" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:44.693612" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:44.693389" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:44.693012" elapsed="0.000985"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.696807" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:44.694154" elapsed="0.002681"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:44.696888" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:44.697075" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:44.691719" elapsed="0.005383"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:44.698583" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.698321" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:44.698743" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:44.697965" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:44.698999" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:44.698858" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:44.698836" elapsed="0.000250"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.699235" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.699411" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.699498" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:44.701677" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:44.697425" elapsed="0.004279"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.703121" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:44.702870" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:44.703630" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:44.703365" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:44.712999" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:44.713304" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:44.713552" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.706075" elapsed="0.008282">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:44.703743" elapsed="0.010829">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.715035" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:44.714659" elapsed="0.000525"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:44.703725" elapsed="0.011512">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.716201" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.716537" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:44.716424" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:44.716386" elapsed="0.000299"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.717035" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.717192" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.702028" elapsed="0.015395">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.717620" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.573311" elapsed="0.144521">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:44.718445" elapsed="0.000098"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:44.718041" elapsed="0.000642"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:44.718003" elapsed="0.000744"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:44.718843" elapsed="0.000038"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:44.568258" elapsed="0.150834">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.792681" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:45.792204" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:45.793640" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.793293" elapsed="0.000444">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:45.793841" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:45.792926" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.794442" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:45.794046" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:45.794810" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:45.795018" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=no...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:45.794660" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.795489" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB_OPENCONFIG/peer=bgp%3A%2F%2F$IP/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:45.795214" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.796677" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:45.796385" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.797179" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.796895" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.798044" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.797641" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.799051" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.798663" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.799137" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:49:45.799328" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.798276" elapsed="0.001077"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.799539" elapsed="0.000315"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:45.797494" elapsed="0.002403"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.800743" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.800154" elapsed="0.000615"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.801702" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.801316" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.801781" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:45.801942" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.800967" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.802125" elapsed="0.000273"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:45.800017" elapsed="0.002424"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.803265" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.802928" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.804224" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.803873" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.804330" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:45.804511" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.803521" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.804696" elapsed="0.000281"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:45.802764" elapsed="0.002258"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.805617" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.805275" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.806604" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.806237" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.806681" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:45.806863" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.805882" elapsed="0.001006"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.807046" elapsed="0.000299"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:45.805138" elapsed="0.002252"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.808015" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.807684" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.808960" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.808620" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.809037" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:45.809190" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.808235" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.809396" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:45.807544" elapsed="0.002208"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.810330" level="INFO">${value} = 65432</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.810005" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.811273" level="INFO">${encoded} = 65432</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.810934" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.811350" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:49:45.811549" level="INFO">${encoded_value} = 65432</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.810563" elapsed="0.001011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.811728" elapsed="0.000274"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-05-01T00:49:45.809867" elapsed="0.002176"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.812631" level="INFO">${value} = 64496</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.812293" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.813777" level="INFO">${encoded} = 64496</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.813397" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.813856" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:45.814011" level="INFO">${encoded_value} = 64496</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.812847" elapsed="0.001188"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.814188" elapsed="0.000306"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-05-01T00:49:45.812158" elapsed="0.002378"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.815158" level="INFO">${value} = 8.1.0.0/28</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:45.814798" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:45.816086" level="INFO">${encoded} = 8.1.0.0/28</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.815749" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:45.816162" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:45.816312" level="INFO">${encoded_value} = 8.1.0.0/28</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:45.815374" elapsed="0.000963"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.816507" elapsed="0.000273"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-05-01T00:49:45.814651" elapsed="0.002170"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:45.797268" elapsed="0.019588"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:45.816902" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:49:45.817061" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'AS_NUMBER': '65432', 'PEER_AS': '64496', 'PREFIXLEN': '8.1.0.0/28'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:45.796043" elapsed="0.021044"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:45.795644" elapsed="0.021475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.817299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.817147" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.795609" elapsed="0.021767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.818298" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:45.817539" elapsed="0.000789"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:45.818379" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:45.791396" elapsed="0.027130"/>
</kw>
<msg time="2026-05-01T00:49:45.818585" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:45.776647" elapsed="0.041992"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.832691" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.846583" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.860391" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.860613" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.860795" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.861226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.861076" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:45.861060" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.861465" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.861640" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.861808" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:45.861027" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.860917" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.862035" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.862112" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:45.862257" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:45.771340" elapsed="0.090945"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:45.863623" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.863353" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:45.863790" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:45.862997" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.864141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.863886" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.864728" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:45.864413" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:45.864222" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.863867" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.867583" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:45.864967" elapsed="0.002644"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:45.867663" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:45.867822" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:45.862656" elapsed="0.005191"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:45.869096" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.868856" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/adj_rib_out/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:45.869254" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:45.868512" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:45.869507" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:45.869352" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.869333" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.869743" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.869919" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.870021" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:45.872191" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/adj_rib_out/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:45.868167" elapsed="0.004051"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.873662" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:45.873392" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.874130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:45.873866" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:45.883541" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:45.883742" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:45.883882" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.876558" elapsed="0.007842">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:49:45.874242" elapsed="0.010298">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.884810" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.884589" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-05-01T00:49:45.874224" elapsed="0.010709">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.885499" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.885685" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:45.885634" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:45.885612" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.886003" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.886102" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.872561" elapsed="0.013692">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.886356" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.739478" elapsed="0.147038">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.886961" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.886698" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:45.886673" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.887144" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:49:45.728891" elapsed="0.158393">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<msg time="2026-05-01T00:49:45.887428" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</msg>
<arg>${DEFAULT_TOPOLOGY_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_TOPOLOGY_CHECK_PERIOD}</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/adj_rib_out</arg>
<arg>mapping=${mapping}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:49:35.246633" elapsed="10.640953">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.889523" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:49:45.889059" elapsed="0.000524"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:49:45.888539" elapsed="0.001116"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:49:45.888080" elapsed="0.001651"/>
</kw>
<doc>Verifies eBGP's adj-rib-out output. Expects local-as, and ibgp peer-as presence.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:49:35.131384" elapsed="10.758406">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes?content=nonconfig</status>
</test>
<test id="s1-s9-t20" name="TC_LAS_Kill_iBgp_Speaker_After_Talking" line="380">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:45.896143" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:45.895864" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.897494" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:45.897355" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.897335" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.903172" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:45.903062" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.903044" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.904293" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:45.903883" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.904803" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:45.904501" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:45.904875" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:49:45.905043" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:45.903500" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.911477" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:45.911340" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.911318" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.912866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:45.912755" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.912736" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:45.913552" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:45.913183" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:45.914013" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:45.913772" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:45.945766" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:45.914589" elapsed="0.031311"/>
</kw>
<msg time="2026-05-01T00:49:45.946081" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:45.946130" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.914205" elapsed="0.031962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:45.975825" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "i "B "g "p "_ "S "p "e "a "k "e "r "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:45.946770" elapsed="0.029174"/>
</kw>
<msg time="2026-05-01T00:49:45.976111" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:45.976159" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "i "B "g "p "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.946358" elapsed="0.029838"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.976564" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.976287" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.976262" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.977143" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "i "B "g "p "_ "S "p "e "a "k "e "r "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:45.976802" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.977533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.977289" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.977269" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:45.977654" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:45.980440" elapsed="0.000175"/>
</kw>
<msg time="2026-05-01T00:49:45.980679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:45.979220" elapsed="0.001613"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.981115" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.981476" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:45.978581" elapsed="0.003089"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:45.977992" elapsed="0.003744"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:45.912417" elapsed="0.069415"/>
</kw>
<msg time="2026-05-01T00:49:45.981924" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:45.981967" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "i "B "g "p "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.911735" elapsed="0.070271"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:45.982193" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:49:45.982083" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.982064" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.982813" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.983266" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:45.983341" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:45.910946" elapsed="0.072520"/>
</kw>
<msg time="2026-05-01T00:49:45.983564" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:45.983608" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "i "B "g "p "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.905487" elapsed="0.078158"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:45.984194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:45.983722" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:45.983704" elapsed="0.000571"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:45.905322" elapsed="0.078976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:45.905132" elapsed="0.079202"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:45.902688" elapsed="0.081708"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:45.897055" elapsed="0.087414"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.896606" elapsed="0.087913"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:45.891606" elapsed="0.092967"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ibgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:45.984768" elapsed="0.000113"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:45.986098" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:45.985777" elapsed="0.000349"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:45.986283" elapsed="0.000257"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:49:45.985504" elapsed="0.001105"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.003594" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:45.987102" elapsed="0.016553"/>
</kw>
<msg time="2026-05-01T00:49:46.003748" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.003791" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:45.986770" elapsed="0.017045"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.004435" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:49:46.016915" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:46.017013" level="INFO">${output_log} = 2026-05-01 00:49:22,204 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:49:22,205 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:46.004293" elapsed="0.012747"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.017487" level="INFO">2026-05-01 00:49:22,204 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:49:22,205 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:49:22,206 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:49:22,206 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104ff9800b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My Autonomous System number: 64497
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   My Autonomous System=64497 (0xfbf1)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf1
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1'
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1
2026-05-01 00:49:22,210 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,212 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064400304c0000201)
2026-05-01 00:49:22,216 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf140050400000064400304c00002011c08000000
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0053408145904541016s
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:49:22,218 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf140050400000064
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:32,233 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:32,233 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.012s
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
26-05-01 00:49:40,088 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-05-01 00:49:40,089 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.011s
2026-05-01 00:49:40,089 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:40,089 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:40,089 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.017206" elapsed="0.000483"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:49:46.004011" elapsed="0.013736"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:49:46.017956" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.017811" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.017793" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.018514" elapsed="0.000051"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.018896" elapsed="0.000048"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:49:45.985153" elapsed="0.033916"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.020954" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:49:46.020160" elapsed="0.000887"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:49:46.019524" elapsed="0.001655"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:46.022446" elapsed="0.001037"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:49:46.021787" elapsed="0.001825"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:45.890664" elapsed="0.133037"/>
</test>
<test id="s1-s9-t21" name="TC_LAS_Kill_eBgp_Speaker_After_Talking" line="390">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:46.030724" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:46.030445" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.032000" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.031888" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.031869" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.037673" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.037567" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.037549" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.038746" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:46.038348" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.039229" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:46.038937" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:46.039298" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:46.039468" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:46.037972" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.045646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.045537" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.045518" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.046879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.046772" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.046754" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:46.047399" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.047097" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.047818" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:46.047605" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.078843" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:46.048375" elapsed="0.030568"/>
</kw>
<msg time="2026-05-01T00:49:46.079127" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:46.079174" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.048008" elapsed="0.031240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.108689" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "e "B "g "p "_ "S "p "e "a "k "e "r "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:46.079819" elapsed="0.029089"/>
</kw>
<msg time="2026-05-01T00:49:46.109144" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:46.109192" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "e "B "g "p "_ "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.079430" elapsed="0.029800"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.109791" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.109375" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.109328" elapsed="0.000561"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.110501" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "e "B "g "p "_ "S "p "e "a "k "e "r "_ "A "f "t "e "r "_ "T "a "l "k "i "n "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.110054" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.110879" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.110652" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.110633" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:46.111007" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:46.114288" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:49:46.114527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.112853" elapsed="0.001849"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.114992" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.115591" elapsed="0.000091"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:46.112128" elapsed="0.003678"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:46.111426" elapsed="0.004448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:46.046469" elapsed="0.069514"/>
</kw>
<msg time="2026-05-01T00:49:46.116087" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.116133" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "e "B "g "p "_ "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.045871" elapsed="0.070306"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:46.116371" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.116259" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.116239" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.116937" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.117302" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.117374" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:46.045177" elapsed="0.072330"/>
</kw>
<msg time="2026-05-01T00:49:46.117609" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.117653" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "K "i "l "l "_ "e "B "g "p "_ "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.039888" elapsed="0.077811"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.118041" elapsed="0.000115"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.117778" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.117759" elapsed="0.000461"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:46.039741" elapsed="0.078504"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:46.039557" elapsed="0.078729"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:46.037191" elapsed="0.081166"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:46.031590" elapsed="0.086831"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.031143" elapsed="0.087355"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:46.026712" elapsed="0.091850"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>ebgp_peer1_console</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:46.118745" elapsed="0.000118"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.120497" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.119866" elapsed="0.000661"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:46.120689" elapsed="0.000287"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:49:46.119585" elapsed="0.001461"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.140112" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:46.121565" elapsed="0.018647"/>
</kw>
<msg time="2026-05-01T00:49:46.140349" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.140394" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.121211" elapsed="0.019209"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.141289" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:49:46.153943" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:46.154045" level="INFO">${output_log} = 2026-05-01 00:49:22,204 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:49:22,205 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:46.141115" elapsed="0.012957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.154579" level="INFO">2026-05-01 00:49:22,204 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:49:22,205 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:49:22,205 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:49:22,206 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:49:22,206 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104ff9800b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My Autonomous System number: 64497
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:49:22,207 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:49:22,208 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-05-01 00:49:22,208 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   My Autonomous System=64497 (0xfbf1)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf1
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1'
2026-05-01 00:49:22,209 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1
2026-05-01 00:49:22,210 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,211 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:49:22,212 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:49:22,212 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-05-01 00:49:22,213 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-05-01 00:49:22,214 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064400304c0000201)
2026-05-01 00:49:22,216 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-05-01 00:49:22,217 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf140050400000064400304c00002011c08000000
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:49:22,217 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0053408145904541016s
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job):   
2026-05-01 00:49:22,218 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:49:22,218 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf140050400000064
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:49:22,219 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:49:22,220 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-05-01 00:49:32,232 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:32,233 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:32,233 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.012s
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:49:42,235 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt
t):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.154246" elapsed="0.000578"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:49:46.140736" elapsed="0.014153"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:49:46.155328" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.155051" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.154999" elapsed="0.000583"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.155925" elapsed="0.000047"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.156300" elapsed="0.000044"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:49:46.119136" elapsed="0.037361"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.158342" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:49:46.157597" elapsed="0.000837"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:49:46.156938" elapsed="0.001658"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:46.159976" elapsed="0.000457"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:49:46.159281" elapsed="0.001303"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:46.024576" elapsed="0.136095"/>
</test>
<test id="s1-s9-t22" name="TC_LAS_Delete_Bgp_Peer_Configurations" line="400">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:49:46.166586" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:49:46.166304" elapsed="0.000600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.168023" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.167896" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.167875" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.174054" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.173939" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.173919" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.175317" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:46.174877" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.175832" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:49:46.175531" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:49:46.175905" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:49:46.176076" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:49:46.174392" elapsed="0.001709"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.182244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.182132" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.182113" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.183638" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:46.183527" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.183508" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:46.184175" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.183862" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.184611" level="INFO">${current_connection_index} = 8</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:46.184365" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.214003" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:46.185143" elapsed="0.029182"/>
</kw>
<msg time="2026-05-01T00:49:46.214641" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:49:46.214690" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.184799" elapsed="0.030070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.239434" level="INFO">". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:49:46.216414" elapsed="0.023293"/>
</kw>
<msg time="2026-05-01T00:49:46.239986" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:49:46.240036" level="INFO">${message_wait} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "D "e "l "e "t "e "_ "B "g "p "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.215423" elapsed="0.024653"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.240652" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.240228" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.240181" elapsed="0.000578"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.241377" level="INFO"> ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.240919" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.241781" elapsed="0.000086"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.241554" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.241533" elapsed="0.000395"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:49:46.241973" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:49:46.244985" elapsed="0.000424"/>
</kw>
<msg time="2026-05-01T00:49:46.245532" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.243795" elapsed="0.001880"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.245993" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.246343" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:49:46.243036" elapsed="0.003540"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:49:46.242361" elapsed="0.004283"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:49:46.183192" elapsed="0.063550"/>
</kw>
<msg time="2026-05-01T00:49:46.246838" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.246882" level="INFO">${message} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "D "e "l "e "t "e "_ "B "g "p "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.182514" elapsed="0.064405"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:49:46.247107" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.246998" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.246979" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.247736" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.248100" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.248172" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:49:46.181784" elapsed="0.066497"/>
</kw>
<msg time="2026-05-01T00:49:46.248377" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:46.248429" level="INFO">${output} =  ". "t "x "t ". "E "b "g "p "[C "P "e "e "r "s "[C "B "a "s "i "c ". "T "C "_ "L "A "S "_ "D "e "l "e "t "e "_ "B "g "p "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.176537" elapsed="0.071946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.248819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.248562" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.248544" elapsed="0.000460"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:49:46.176370" elapsed="0.072659"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:49:46.176170" elapsed="0.072895"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:49:46.173539" elapsed="0.075590"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:49:46.167582" elapsed="0.081608"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:46.167076" elapsed="0.082162"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:49:46.163506" elapsed="0.085789"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.250062" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${iBGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.249541" elapsed="0.000549"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.297396" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.297009" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:46.298277" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:46.298007" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:46.298473" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:46.297617" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.299055" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:46.298668" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:46.299381" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:46.299559" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:46.299246" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.299987" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.299744" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.300996" level="INFO">mapping: {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.300740" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.301531" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.301238" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.302236" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:46.301937" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:46.303387" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.302986" elapsed="0.000427"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:46.303479" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:46.303638" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:46.302467" elapsed="0.001196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.303821" elapsed="0.000255"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:49:46.301795" elapsed="0.002322"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.304728" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:46.304409" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:46.305512" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.305282" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:46.305588" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:46.305738" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:46.304952" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.305916" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:46.304269" elapsed="0.001907"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:46.301614" elapsed="0.004597"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:46.306254" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:46.306409" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:46.300400" elapsed="0.006034"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.300099" elapsed="0.006382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.306658" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.306507" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.300080" elapsed="0.006654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.307494" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.306881" elapsed="0.000643"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:46.307573" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:46.296372" elapsed="0.011326"/>
</kw>
<msg time="2026-05-01T00:49:46.307751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.282376" elapsed="0.025422"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.321787" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.335517" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.349296" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.349512" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.349691" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.350112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.349912" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:46.349898" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.350338" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.350523" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.350694" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:46.349869" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.349767" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.350921" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.350997" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:46.351120" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:46.277697" elapsed="0.073449"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.352257" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.352011" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:46.363649" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:46.363698" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:46.363793" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:46.354799" elapsed="0.009020"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.352371" elapsed="0.011489"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.364044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.363886" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.352353" elapsed="0.011774"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.367799" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.365171" elapsed="0.002671"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.364948" elapsed="0.002930"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.364929" elapsed="0.002975"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.371580" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.368185" elapsed="0.003461"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.367958" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.367942" elapsed="0.003786"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.372530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.371962" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.373008" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.372667" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.373793" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.373352" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.373122" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.372642" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.374719" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.374185" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.375185" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.374855" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.375959" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.375547" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.375297" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.374830" elapsed="0.001251"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.376306" elapsed="0.000518"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:46.377472" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.377059" elapsed="0.000452"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.377733" elapsed="0.003615"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:46.364541" elapsed="0.016870"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:46.381471" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:46.383993" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:49:46.351415" elapsed="0.032605"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:46.384073" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:49:46.250322" elapsed="0.133888"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.384874" level="INFO">&amp;{mapping} = { IP=127.0.0.3 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${eBGP_PEER1_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.384404" elapsed="0.000498"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.431973" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.431587" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:46.432720" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:46.432509" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:46.432878" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:46.432164" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.433444" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:46.433065" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:46.433783" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/local_as/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:46.433912" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:46.433650" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.434339" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.434101" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.435374" level="INFO">mapping: {'IP': '127.0.0.3', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.435118" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.435878" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.435615" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.436562" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:46.436253" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:46.437304" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.437094" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:46.437379" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:46.437546" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:46.436774" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.437726" elapsed="0.000221"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:49:46.436116" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.438542" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:46.438233" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:46.439278" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.439071" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:46.439353" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:46.439521" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:46.438753" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.439713" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:46.438098" elapsed="0.001882"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:46.435952" elapsed="0.004063"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:46.440057" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:46.440213" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:46.434797" elapsed="0.005441"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.434502" elapsed="0.005768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.440460" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.440294" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.434482" elapsed="0.006056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.441415" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.440685" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:46.441511" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:46.430956" elapsed="0.010682"/>
</kw>
<msg time="2026-05-01T00:49:46.441691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.416777" elapsed="0.024959"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.455621" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.469482" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//local_as/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.483181" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.483383" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.483584" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.483952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.483806" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:46.483791" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.484179" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.484349" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.484532" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:46.483763" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.483661" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.484760" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:46.484834" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:46.484956" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:46.412055" elapsed="0.072927"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.486091" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.485846" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:46.496776" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0hovynm8vqg2v1lknzll1w7lox17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:46.496841" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:46.496964" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:46.488494" elapsed="0.008510"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.486204" elapsed="0.010855"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.497308" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.497095" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.486187" elapsed="0.011304"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.502916" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.498989" elapsed="0.003992"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.498661" elapsed="0.004369"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.498637" elapsed="0.004428"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.507159" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.503486" elapsed="0.003736"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.503150" elapsed="0.004121"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.503127" elapsed="0.004179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.508054" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.507560" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.508387" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.508151" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.508948" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.508651" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.508485" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.508133" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.509570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.509197" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.509901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.509665" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.510439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:46.510149" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.509984" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.509648" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.510689" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:46.511496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.511207" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.511678" elapsed="0.002647"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:46.498073" elapsed="0.016314"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:46.514433" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:49:46.516972" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:49:46.485242" elapsed="0.031756"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:46.517050" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}local_as/ebgp_peer</arg>
<arg>mapping=${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:49:46.385132" elapsed="0.132040"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.518421" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:46.518039" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.518022" elapsed="0.000501"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.518693" elapsed="0.000325"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.524418" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:46.524015" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:49:46.524734" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.524580" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.524561" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.524969" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.525143" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.525317" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.525503" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.525675" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.525844" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.526014" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:49:46.523711" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:46.517832" elapsed="0.008308"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:49:46.517469" elapsed="0.008711"/>
</kw>
<doc>Delete peer configuration.</doc>
<status status="PASS" start="2026-05-01T00:49:46.161398" elapsed="0.364821"/>
</test>
<kw name="Teardown_Everything" owner="BgpOperations" type="TEARDOWN">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.527844" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:49:46.550817" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:49:46.551032" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:46.527701" elapsed="0.023388"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:49:46.551198" elapsed="0.000070"/>
</return>
<msg time="2026-05-01T00:49:46.551597" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:49:46.527405" elapsed="0.024250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.552612" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:46.552018" elapsed="0.000688"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.554590" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:49:46.554762" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:49:46.553948" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:49:46.555217" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:49:46.554971" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:46.554929" elapsed="0.000469"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.555771" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.556156" elapsed="0.000045"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:46.556563" elapsed="0.000047"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:49:46.553244" elapsed="0.003507"/>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:49:46.527125" elapsed="0.029738"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:46.557341" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:49:46.557183" elapsed="0.000567"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:49:46.558088" elapsed="0.001394"/>
</kw>
<doc>Create and Log the diff between expected and actual responses, make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-05-01T00:49:46.526852" elapsed="0.032824"/>
</kw>
<doc>Basic tests for eBGP application peers.

Copyright (c) 2015-2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic eBGP functional tests:
Two eBGP peers advertise the same group of prefixes (aka BGP HA)
https://wiki.opendaylight.org/view/BGP_LS_PCEP:BGP
Reported bugs:
Bug 4834 - ODL controller announces the same route twice (two eBGP scenario aka HA)
Bug 4835 - Routes not withdrawn when eBGP peers are disconnected (the same prefixes announced)

For versions Fluorine and above, there are test cases:
TC_LAS (test case local AS)
- configuration of ebgp with local-as and ibgp without local-as
- connect bgp speakers (play.py) to both peers and check their connection
- check adj-rib-out on both peers, expecting local-as in as-sequence on both peers.

TODO: Extend testsuite by tests dedicated to path selection algorithm
TODO: Choose keywords used by more than one test suite to be placed in a common place.</doc>
<status status="FAIL" start="2026-05-01T00:47:15.382937" elapsed="151.176809"/>
</suite>
<suite id="s1-s10" name="010 Bgp Flowspec" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/010_bgp_flowspec.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:49:46.626683" elapsed="0.000435"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:49:46.628949" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:49:46.629039" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:49:46.628648" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.629208" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:49:46.630417" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:49:47.377173" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:49:46 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:45:19 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:49:46.630090" elapsed="0.747260"/>
</kw>
<msg time="2026-05-01T00:49:47.377443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.629749" elapsed="0.747801"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:49:46.628196" elapsed="0.749477"/>
</kw>
<msg time="2026-05-01T00:49:47.377727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:46.627719" elapsed="0.750053"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:49:46.627337" elapsed="0.750539"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.384077" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:47.383733" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:47.385612" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:49:47.640559" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:47.640867" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 107ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:49:47.640971" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:49:47.641064" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:47.385387" elapsed="0.255729"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.643025" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:49:47.642375" elapsed="0.000755"/>
</kw>
<msg time="2026-05-01T00:49:47.643401" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:49:47.643533" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:47.641571" elapsed="0.002015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.644930" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:47.643933" elapsed="0.001056"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.647280" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 107ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:47.646726" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.648247" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:47.647723" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.649305" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:47.648785" elapsed="0.000616"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:49:47.645949" elapsed="0.003602"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:47.645177" elapsed="0.004457"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:47.645125" elapsed="0.004570"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:49:47.650042" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:47.649817" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:47.649781" elapsed="0.000417"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:49:47.650538" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:49:47.650312" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:47.650279" elapsed="0.000458"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:47.651030" elapsed="0.000048"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:49:47.384821" elapsed="0.266516"/>
</kw>
<msg time="2026-05-01T00:49:47.651491" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.384254" elapsed="0.267348"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:49:47.383098" elapsed="0.268743"/>
</kw>
<msg time="2026-05-01T00:49:47.651962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.379133" elapsed="0.272900"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:49:47.378765" elapsed="0.273373"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:47.658517" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:47.658179" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:47.660315" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:49:49.811797" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:49.812598" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attem...</msg>
<msg time="2026-05-01T00:49:49.812850" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:49:49.813070" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:47.659973" elapsed="2.153199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.819119" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:49:49.817614" elapsed="0.001803"/>
</kw>
<msg time="2026-05-01T00:49:49.820024" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:49:49.820197" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:49.814239" elapsed="0.006043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.823722" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:49.821253" elapsed="0.002558"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.827204" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:49.826571" elapsed="0.000775"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.828785" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:49.828152" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.829816" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:49.829325" elapsed="0.000592"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:49:49.825220" elapsed="0.004810"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:49.824121" elapsed="0.006025"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:49.824071" elapsed="0.006126"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:49:49.830793" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:49.830298" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:49.830271" elapsed="0.000677"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:49:49.831173" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-05-01T00:49:49.831004" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:49.830987" elapsed="0.000414"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:49.831592" elapsed="0.000024"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:49:47.659328" elapsed="2.172532"/>
</kw>
<msg time="2026-05-01T00:49:49.831939" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.658690" elapsed="2.173324"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:49:47.657592" elapsed="2.174536"/>
</kw>
<msg time="2026-05-01T00:49:49.832188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.653960" elapsed="2.178277"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:49:47.653412" elapsed="2.178911"/>
</kw>
<msg time="2026-05-01T00:49:49.832374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.653046" elapsed="2.179374"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:47.652726" elapsed="2.179792"/>
</kw>
<msg time="2026-05-01T00:49:49.832564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:47.652283" elapsed="2.180327"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:47.378390" elapsed="2.454301"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:49.840270" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:49.839918" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:49.842176" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:49:50.698569" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:50.699353" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setupt...</msg>
<msg time="2026-05-01T00:49:50.699521" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:49:50.699632" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:49.841790" elapsed="0.857907"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.705074" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:49:50.703644" elapsed="0.002881"/>
</kw>
<msg time="2026-05-01T00:49:50.706910" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:49:50.706964" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:50.700630" elapsed="0.006360"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.708943" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:50.707472" elapsed="0.001499"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.711544" level="INFO">Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:50.711110" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.712234" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:50.711909" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.712938" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:50.712615" elapsed="0.000391"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:49:50.710141" elapsed="0.002949"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:50.709150" elapsed="0.004039"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:50.709109" elapsed="0.004119"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:49:50.713445" elapsed="0.000092"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:50.713291" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:50.713272" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:49:50.713843" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-05-01T00:49:50.713708" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:50.713690" elapsed="0.000315"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:50.714145" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:49:49.841129" elapsed="0.873164"/>
</kw>
<msg time="2026-05-01T00:49:50.714358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:49.840471" elapsed="0.873951"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:49:49.839292" elapsed="0.875257"/>
</kw>
<msg time="2026-05-01T00:49:50.714610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:49.835219" elapsed="0.879443"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:49:49.834676" elapsed="0.880089"/>
</kw>
<msg time="2026-05-01T00:49:50.714820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:49.834154" elapsed="0.880712"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:49.833775" elapsed="0.881182"/>
</kw>
<msg time="2026-05-01T00:49:50.715004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:49.833315" elapsed="0.881735"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:49.832948" elapsed="0.882188"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:50.722274" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:50.721943" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:50.724131" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-05-01T00:49:52.419858" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:52.420389" level="INFO">${stdout} = Collecting exabgp==3.4.16
  Downloading exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to bu...</msg>
<msg time="2026-05-01T00:49:52.420553" level="INFO">${stderr} =   error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        ...</msg>
<msg time="2026-05-01T00:49:52.420666" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:50.723753" elapsed="1.696967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.425081" level="INFO">Length is 1821.</msg>
<msg time="2026-05-01T00:49:52.426134" level="FAIL">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:49:52.423893" elapsed="0.002929">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-05-01T00:49:52.427210" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:49:52.427320" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:52.421360" elapsed="0.006020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.430034" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:52.427884" elapsed="0.002211"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.433373" level="INFO">Collecting exabgp==3.4.16
  Downloading exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.432834" elapsed="0.000699"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.434416" level="INFO">  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-g0986767/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.433950" elapsed="0.000801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.435653" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.435168" elapsed="0.000583"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:49:52.431426" elapsed="0.004430"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:52.430313" elapsed="0.005681"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:52.430274" elapsed="0.005764"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:49:52.436343" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:52.436127" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:52.436102" elapsed="0.000445"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:49:52.436820" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-05-01T00:49:52.436630" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:52.436606" elapsed="0.000425"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:52.437440" elapsed="0.000075"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:49:50.723090" elapsed="1.714606"/>
</kw>
<msg time="2026-05-01T00:49:52.437783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:50.722462" elapsed="1.715399"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:49:50.721294" elapsed="1.716707"/>
</kw>
<msg time="2026-05-01T00:49:52.438083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:50.717335" elapsed="1.720806"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:49:50.716795" elapsed="1.721438"/>
</kw>
<msg time="2026-05-01T00:49:52.438291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:50.716385" elapsed="1.721961"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:50.716010" elapsed="1.722538"/>
</kw>
<msg time="2026-05-01T00:49:52.438599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:50.715631" elapsed="1.723015"/>
</kw>
<arg>exabgp==3.4.16</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:49:50.715341" elapsed="1.723396"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:52.439193" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19d91950&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:49:52.438889" elapsed="0.000476"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.469506" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:49:52.487684" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec/bgp-flowspec.cfg' -&gt; '/home/jenkins/.//bgp-flowspec.cfg'</msg>
<msg time="2026-05-01T00:49:52.487772" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec/bgp-flowspec-redirect.cfg' -&gt; '/home/jenkins/.//bgp-flowspec-redirect.cfg'</msg>
<arg>${BGP_VARIABLES_FOLDER}</arg>
<arg>.</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:49:52.439875" elapsed="0.047989"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.497324" level="INFO">4 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:49:52.497553" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | exa-md5.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:49:52.488177" elapsed="0.009418"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.498442" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:49:52.511083" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.498180" elapsed="0.013077"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.512738" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:49:52.559821" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.511697" elapsed="0.048328"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.561041" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:49:52.607676" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:52.607997" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.560513" elapsed="0.047548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.609243" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.608576" elapsed="0.000781"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:49:52.497965" elapsed="0.111473"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.610406" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:49:52.656268" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.610031" elapsed="0.046679"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.657723" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:49:52.708123" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.657198" elapsed="0.051114"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.709010" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:49:52.759767" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:52.760043" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.708696" elapsed="0.051410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.761271" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.760594" elapsed="0.000804"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:49:52.609733" elapsed="0.151776"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.762491" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:49:52.807144" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.762071" elapsed="0.045211"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.808055" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:49:52.855517" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.807670" elapsed="0.047989"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.856367" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:49:52.907247" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:52.907497" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.856030" elapsed="0.051532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:52.908549" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:52.907926" elapsed="0.000731"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:49:52.761773" elapsed="0.146960"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.909676" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:49:52.955638" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.909263" elapsed="0.046613"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:52.956998" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:49:53.007337" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:52.956509" elapsed="0.050999"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:49:53.008182" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:49:53.055666" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:49:53.055892" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:49:53.007863" elapsed="0.048089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.057040" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.056352" elapsed="0.000798"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:49:52.908970" elapsed="0.148259"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:49:52.497706" elapsed="0.559604"/>
</for>
<arg>${BGP_VARIABLES_FOLDER}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:49:52.439595" elapsed="0.617890"/>
</kw>
<doc>Suite setup keyword</doc>
<status status="PASS" start="2026-05-01T00:49:46.626327" elapsed="6.431289"/>
</kw>
<test id="s1-s10-t1" name="Check_For_Empty_Topology_Before_Talking" line="41">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Empty_Flowspec_Data">
<kw name="Verify_Empty_Flowspec_Data_Neon">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.110550" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.110084" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.111534" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.111062" elapsed="0.000561">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.111723" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.110738" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.112300" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.111910" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.112659" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.112837" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.112509" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.113251" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.113007" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.114534" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.114061" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.115109" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.114745" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.115557" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.116160" elapsed="0.000049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.116651" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.115364" elapsed="0.001449"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.115195" elapsed="0.001684"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:53.116974" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:53.117153" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:53.113688" elapsed="0.003491"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.113377" elapsed="0.003834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.117374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.117238" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.113352" elapsed="0.004116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.118079" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.117603" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.118157" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.109467" elapsed="0.008819"/>
</kw>
<msg time="2026-05-01T00:49:53.118340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.098088" elapsed="0.020302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.129928" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.141055" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.152269" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.152464" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.152625" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.152975" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.152845" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.152831" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.153181" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.153332" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.153499" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.152802" elapsed="0.000752"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.152700" elapsed="0.000880"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.153711" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.153851" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:49:53.153976" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.094211" elapsed="0.059791"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.155230" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.154978" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.155396" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.154653" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.155742" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.155509" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.156303" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.155980" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.155824" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.155489" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.158529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.156538" elapsed="0.002017"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:53.158606" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:53.158762" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:53.154326" elapsed="0.004461"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.159926" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.159732" elapsed="0.000249"/>
</kw>
<msg time="2026-05-01T00:49:53.160071" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.159396" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.160298" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:53.160164" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.160146" elapsed="0.000219"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.160677" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.160816" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.160510" elapsed="0.000331"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:49:53.161217" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.160981" elapsed="0.000261"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:49:53.161288" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:53.161443" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:53.159082" elapsed="0.002401"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.162864" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.162621" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.163287" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.163046" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:53.175182" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:53.175464" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:49:53 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:49:53.175582" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:53.165489" elapsed="0.010120"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.163463" elapsed="0.012189"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.175821" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.175679" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.163427" elapsed="0.012481"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.179102" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.176914" elapsed="0.002235"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.176707" elapsed="0.002482"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.176689" elapsed="0.002525"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.181527" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.179498" elapsed="0.002074"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.179269" elapsed="0.002337"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.179253" elapsed="0.002398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.182186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.181797" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.182515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.182284" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.183035" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.182740" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.182599" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.182267" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.183639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.183263" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.183955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.183736" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.184486" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.184178" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.184036" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.183718" elapsed="0.000852"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.184705" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:53.185507" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.185198" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.185688" elapsed="0.002035"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:53.176272" elapsed="0.011513"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.187992" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:53.187855" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.187836" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.190654" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.188196" elapsed="0.002487"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:49:53.190735" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:53.190892" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:53.161817" elapsed="0.029101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.190980" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:49:53.191129" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:53.073681" elapsed="0.117474"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.217050" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.216313" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.218840" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.218307" elapsed="0.000683">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.219120" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.217227" elapsed="0.001918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.220053" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.219296" elapsed="0.000785"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.220475" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.220701" level="INFO">${template} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.220234" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.221289" level="INFO">{
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
                "uptodate": "*"
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.220870" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:53.221988" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.221420" elapsed="0.000725"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.222968" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.222334" elapsed="0.000676"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.222172" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.221401" elapsed="0.001714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.224007" level="INFO">${final_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.223248" elapsed="0.000788"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.224084" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.215629" elapsed="0.008582"/>
</kw>
<msg time="2026-05-01T00:49:53.224300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.204281" elapsed="0.020070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.235613" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.246656" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.257689" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.257867" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.258026" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.258382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.258254" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.258240" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.258606" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.258758" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.258907" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.258211" elapsed="0.000749"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.258101" elapsed="0.000885"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.259115" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.259191" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:53.259307" level="INFO">${expected_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.201866" elapsed="0.057469"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.259510" elapsed="0.002217"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.262762" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.262478" elapsed="0.000312"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.263199" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.262929" elapsed="0.000297"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:49:53.263364" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:49:53.262071" elapsed="0.001697"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.261842" elapsed="0.001959"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.263960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.263827" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.261822" elapsed="0.002213"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:49:53.192268" elapsed="0.071815"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:49:53.191486" elapsed="0.072672"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.191243" elapsed="0.072965"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.191226" elapsed="0.073005"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.264265" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}empty_route</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:49:53.068132" elapsed="0.196259"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-05-01T00:49:53.060951" elapsed="0.203517"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-05-01T00:49:53.060295" elapsed="0.204225"/>
</kw>
<arg>60s</arg>
<arg>3s</arg>
<arg>Verify_Empty_Flowspec_Data</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:53.059182" elapsed="0.205381"/>
</kw>
<doc>Sanity check bgp-flowspec:flowspec-routes is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:49:53.057752" elapsed="0.206931"/>
</test>
<test id="s1-s10-t2" name="Reconfigure_ODL_To_Accept_Connection" line="46">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.266134" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB_OPENCONFIG=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.265542" elapsed="0.000621"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.296244" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.295872" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.297020" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.296749" elapsed="0.000384">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.297234" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.296418" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.297810" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.297409" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.298114" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.298278" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.297982" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.298704" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.298446" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.301010" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.299402" elapsed="0.001668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.301505" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.301219" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.302186" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.301882" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.302927" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.302711" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.303005" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:53.303160" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.302389" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.303326" elapsed="0.000249"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:49:53.301762" elapsed="0.001855"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.304160" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.303856" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.304898" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.304685" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.304975" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:53.305156" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.304365" elapsed="0.000822"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.305325" elapsed="0.000242"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:49:53.303734" elapsed="0.001874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.306134" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.305840" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.306863" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.306654" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.306939" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:53.307089" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.306338" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.307250" elapsed="0.000237"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:49:53.305721" elapsed="0.001807"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.308059" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.307763" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.308783" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.308574" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.308859" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:53.309009" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.308258" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.309184" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:49:53.307643" elapsed="0.001819"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.310037" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.309739" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.310762" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.310551" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.310836" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:53.310987" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.310237" elapsed="0.000775"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.311148" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:49:53.309620" elapsed="0.001791"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.311954" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.311659" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:49:53.312909" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.312690" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:49:53.312986" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:49:53.313153" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:49:53.312328" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.313315" elapsed="0.000240"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:49:53.311540" elapsed="0.002057"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:49:53.301584" elapsed="0.012048"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:53.313675" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:53.313834" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:53.299096" elapsed="0.014764"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.298817" elapsed="0.015075"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.314051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.313917" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.298799" elapsed="0.015328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.314904" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.314253" elapsed="0.000680"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.314982" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.295262" elapsed="0.019844"/>
</kw>
<msg time="2026-05-01T00:49:53.315159" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.283790" elapsed="0.031421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.326318" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.337419" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.348542" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.348727" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.348901" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.349274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.349138" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.349121" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.349499" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.349655" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.349805" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.349088" elapsed="0.000770"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.348980" elapsed="0.000905"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.350017" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.350092" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:49:53.350224" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.279959" elapsed="0.070292"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.373842" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.373444" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.374595" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.374342" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.374765" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.374026" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.375318" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.374937" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.375644" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.375808" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.375507" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.376222" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.375980" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:53.376721" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.376394" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.377237" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.376939" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.376807" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.376376" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.378196" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.377470" elapsed="0.000756"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.378278" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.372846" elapsed="0.005561"/>
</kw>
<msg time="2026-05-01T00:49:53.378484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.361540" elapsed="0.016994"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.389929" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.401004" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.412057" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.412238" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.412397" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.412792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.412662" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.412648" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.412997" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.413149" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.413301" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.412617" elapsed="0.000736"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.412487" elapsed="0.000894"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.413565" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.413644" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:53.413780" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.359071" elapsed="0.054738"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.415060" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.414786" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.415218" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.414441" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.415563" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.415313" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.416084" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.415797" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.415644" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.415295" elapsed="0.000871"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.418294" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.416304" elapsed="0.002016"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:53.418371" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:49:53.418540" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:53.414130" elapsed="0.004435"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.419916" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.419671" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.420337" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.420102" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.420884" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.420590" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.421393" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.421113" elapsed="0.000332"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:49:53.422393" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:49:53.422162" elapsed="0.000263"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:49:53.422835" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:49:53.422630" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.423041" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.423667" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.423400" elapsed="0.000311"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:49:53.423755" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:53.423911" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:49:53.421709" elapsed="0.002227"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:53.439910" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Content-Length': '1132', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:49:53.440003" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:53.440150" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:53.426085" elapsed="0.014102"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.424007" elapsed="0.016243"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.440540" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.440286" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.423989" elapsed="0.016679"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.444972" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.441958" elapsed="0.003074"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.441672" elapsed="0.003409"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.441647" elapsed="0.003468"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.448340" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.445500" elapsed="0.002965"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.445193" elapsed="0.003322"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.445169" elapsed="0.003380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.449275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.448750" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.449735" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.449410" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.450620" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.450049" elapsed="0.000607"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.449850" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.449386" elapsed="0.001349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.451429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.450933" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.451881" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.451584" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.452725" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.452264" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.452056" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.451560" elapsed="0.001281"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.453032" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:53.454134" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.453749" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.454365" elapsed="0.002875"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:53.441155" elapsed="0.016172"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:49:53.457590" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:49:53.457420" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.457395" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.457899" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.457993" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:49:53.460899" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:53.418881" elapsed="0.042055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.461026" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:53.461225" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:53.270294" elapsed="0.190956"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.461586" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.461348" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.461330" elapsed="0.000347"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.461710" elapsed="0.000025"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:49:53.266418" elapsed="0.195414"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:49:53.265010" elapsed="0.196943"/>
</test>
<test id="s1-s10-t3" name="FlowSpec_Test_1" line="60">
<kw name="Setup_Testcase" type="SETUP">
<kw name="Verify_Empty_Flowspec_Data">
<kw name="Verify_Empty_Flowspec_Data_Neon">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.509078" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.508642" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.510009" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.509634" elapsed="0.000452">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.510182" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.509284" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.510786" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.510363" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.511192" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.511353" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.511046" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.511789" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.511542" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.513132" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.512641" elapsed="0.000538"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.513768" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.513328" elapsed="0.000467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.514155" elapsed="0.000074"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.514652" elapsed="0.000078"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.514944" elapsed="0.000076"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.513999" elapsed="0.001111"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.513853" elapsed="0.001292"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:53.515196" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:49:53.515370" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:53.512273" elapsed="0.003122"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.511921" elapsed="0.003506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.515626" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.515487" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.511894" elapsed="0.003811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.516311" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.515837" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.516388" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.507887" elapsed="0.008646"/>
</kw>
<msg time="2026-05-01T00:49:53.516590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.496439" elapsed="0.020202"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.528265" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.541753" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.553121" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.553351" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.553542" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.553957" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.553816" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.553798" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.554177" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.554333" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.554501" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.553756" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.553628" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.554720" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.554801" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:49:53.554966" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.492521" elapsed="0.062474"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.556890" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.556565" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.557075" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.556019" elapsed="0.001081"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.557418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.557172" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.557968" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.557676" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.557516" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.557154" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.560208" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.558190" elapsed="0.002044"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:53.560286" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:53.560444" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:53.555323" elapsed="0.005161"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.561623" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.561411" elapsed="0.000266"/>
</kw>
<msg time="2026-05-01T00:49:53.561834" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.561092" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.562067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:53.561930" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.561911" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.562432" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.562624" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.562265" elapsed="0.000385"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:49:53.563036" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.562794" elapsed="0.000268"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:49:53.563109" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:49:53.563269" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:53.560782" elapsed="0.002512"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.564695" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.564429" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.565116" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.564879" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:53.574064" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:53.574210" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:49:53.574316" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:53.567259" elapsed="0.007084"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.565224" elapsed="0.009166"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.574602" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.574419" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.565206" elapsed="0.009485"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.577967" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.575747" elapsed="0.002270"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.575517" elapsed="0.002534"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.575498" elapsed="0.002579"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.580586" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.578343" elapsed="0.002311"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.578133" elapsed="0.002573"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.578116" elapsed="0.002627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.581582" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.580973" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.582045" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.581725" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.582838" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.582376" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.582164" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.581699" elapsed="0.001343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.583836" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.583261" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.584294" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.583979" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.585082" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.584648" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.584413" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.583953" elapsed="0.001256"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.585412" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:53.586621" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.586184" elapsed="0.000474"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:53.586855" elapsed="0.002891"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:53.575059" elapsed="0.014778"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.590090" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:53.589937" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.589910" elapsed="0.000281"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.593435" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.590376" elapsed="0.003104"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:49:53.593533" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:49:53.593703" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:53.563615" elapsed="0.030114"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.593794" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:49:53.593948" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:53.472496" elapsed="0.121478"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.619905" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.619126" elapsed="0.000807"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.621169" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.620674" elapsed="0.000714">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:53.621537" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:53.620083" elapsed="0.001479"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.622351" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.621716" elapsed="0.000663"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:53.622809" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:53.622982" level="INFO">${template} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:53.622543" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.623633" level="INFO">{
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
                "uptodate": "*"
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.623151" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:53.624099" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.623751" elapsed="0.000515"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.625024" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.624430" elapsed="0.000702"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.624295" elapsed="0.001012"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.623730" elapsed="0.001602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.626391" level="INFO">${final_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:53.625484" elapsed="0.000937"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.626490" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:53.618530" elapsed="0.008093"/>
</kw>
<msg time="2026-05-01T00:49:53.626678" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.607077" elapsed="0.019652"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.641630" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.652824" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.663828" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.664033" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.664204" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.664625" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.664486" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:53.664466" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.664838" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.665062" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.665217" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:53.664413" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.664288" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.665433" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:53.665531" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:49:53.665686" level="INFO">${expected_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:53.604671" elapsed="0.061044"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.665882" elapsed="0.002902"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.669963" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.669628" elapsed="0.000374"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:53.670589" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:53.670149" elapsed="0.000468"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:49:53.670758" elapsed="0.000358"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:49:53.669166" elapsed="0.002012"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.668899" elapsed="0.002316"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:53.671412" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:53.671243" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.668863" elapsed="0.002647"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:49:53.595125" elapsed="0.076437"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:49:53.594304" elapsed="0.077333"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.594060" elapsed="0.077623"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.594043" elapsed="0.077665"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:53.671745" elapsed="0.000035"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}empty_route</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:49:53.466981" elapsed="0.204904"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-05-01T00:49:53.463243" elapsed="0.208708"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-05-01T00:49:53.463015" elapsed="0.208986"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.675171" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.674844" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.675659" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.675367" elapsed="0.000338"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:53.679693" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:53.676361" elapsed="0.003402"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:53.683188" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:49:53.683314" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:53.679934" elapsed="0.003409"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.683954" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.683697" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:53.683422" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:53.683399" elapsed="0.000663"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:49:53.676009" elapsed="0.008119"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:53.686505" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg</msg>
<msg time="2026-05-01T00:49:53.686600" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:53.684280" elapsed="0.002346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.687027" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.686777" elapsed="0.000296"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:53.674532" elapsed="0.012596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.689112" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:53.688756" elapsed="0.000384"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.691326" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:53.689291" elapsed="0.002064"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:53.697842" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:53.698009" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:53.698110" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:53.691526" elapsed="0.006616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.701542" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:53.698386" elapsed="0.003236"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:49:53.705204" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:49:53.701825" elapsed="0.003488">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:49:53.688266" elapsed="0.017247">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.708511" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.707591" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.712746" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:56.708931" elapsed="0.003857"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:56.721685" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:56.724166" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3993'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:49:56.724475" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:56.713011" elapsed="0.011506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.728237" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.724764" elapsed="0.003584"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:49:56.728580" elapsed="0.003289"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:49:56.706350" elapsed="0.025659"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:53.687757" elapsed="3.044332"/>
</kw>
<msg time="2026-05-01T00:49:56.732241" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:49:56.732298" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:53.687313" elapsed="3.045009"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.732737" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.732428" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.732402" elapsed="0.000419"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:49:56.732985" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:49:56.732877" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.732861" elapsed="0.000220"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:49:53.674334" elapsed="3.058775"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:49:53.674096" elapsed="3.059050"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.733287" elapsed="0.000022"/>
</kw>
<arg>${cfg_file}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:49:53.672319" elapsed="3.061048"/>
</kw>
<arg>${CFG1}</arg>
<status status="PASS" start="2026-05-01T00:49:53.462730" elapsed="3.270699"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Flowspec_Data">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.779661" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.779244" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.780592" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:56.780305" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:56.780763" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:56.779974" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.781329" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:56.780942" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.781687" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:56.781849" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:56.781545" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.782265" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.782022" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.783351" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.783039" elapsed="0.000358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.783866" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:56.783567" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.784209" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.784404" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.784589" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:49:56.784088" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.783945" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:56.784727" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:49:56.784897" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:56.782725" elapsed="0.002197"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.782391" elapsed="0.002563"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.785112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.784979" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.782368" elapsed="0.002820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.785791" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.785319" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:56.785869" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:56.778610" elapsed="0.007384"/>
</kw>
<msg time="2026-05-01T00:49:56.786049" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:56.767253" elapsed="0.018846"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.797435" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.808694" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.819858" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.820107" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.820278" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.820710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.820571" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:56.820553" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.820922" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.821077" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.821232" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:56.820513" elapsed="0.000773"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.820365" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.821449" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.821548" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:49:56.821702" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:56.763322" elapsed="0.058409"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.823105" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:56.822799" elapsed="0.000382">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:56.823275" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:56.822408" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.823653" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.823371" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.824188" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.823893" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.823737" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.823353" elapsed="0.000976"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.826478" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:56.824483" elapsed="0.002022"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:56.826556" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:49:56.826715" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:56.822071" elapsed="0.004669"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.828110" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:56.827862" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:56.828267" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:56.827349" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:49:56.828514" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:49:56.828361" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.828343" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.828736" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.828892" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.828957" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:49:56.832231" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:56.827040" elapsed="0.005220"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.833691" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.833407" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.834120" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.833876" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:56.844348" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:56.845335" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1466'} 
 body={"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}} 
 </msg>
<msg time="2026-05-01T00:49:56.845478" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:56.836124" elapsed="0.009383"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.834232" elapsed="0.011321"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.845732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.845582" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.834212" elapsed="0.011659"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.849658" level="INFO">{"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ","attributes":{"extended-communities":[{"traffic-action-extended-community":{"sample":true,"terminal-action":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"},{"protocol-ips":[{"value":6,"op":"end-of-list equals"}]},{"ports":[{"value":80,"op":"end-of-list equals"}]},{"destination-ports":[{"value":8080,"op":"greater-than"},{"value":8088,"op":"end-of-list and-bit less-than"}]},{"source-ports":[{"value":1024,"op":"end-of-list greater-than"}]},{"types":[{"value":0,"op":"end-of-list equals"}]},{"codes":[{"value":0,"op":"end-of-list equals"}]},{"tcp-flags":[{"value":32,"op":"end-of-list match"}]},{"packet-lengths":[{"value":400,"op":"greater-than"},{"value":500,"op":"end-of-list and-bit less-than"}]},{"dscps":[{"value":20,"op":"end-of-list equals"}]},{"fragments":[{"value":"first","op":"end-of-list match"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.846909" elapsed="0.002833"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.846698" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.846680" elapsed="0.003150"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.853353" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.850221" elapsed="0.003201"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.849913" elapsed="0.003580"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.849888" elapsed="0.003643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.854350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.853767" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.854840" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.854518" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.855697" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.855175" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.854960" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.854489" elapsed="0.001335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.856598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.856036" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.857057" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.856741" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.857984" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.857387" elapsed="0.000635"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.857177" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.856713" elapsed="0.001393"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:56.858313" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:56.859563" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.859068" elapsed="0.000537"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:56.859821" elapsed="0.002254"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:56.846245" elapsed="0.015898"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.862362" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:56.862216" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.862197" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:56.865920" level="INFO">${text_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "traffic-action-extended-community": {
        "sample": true,
       ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:56.862594" elapsed="0.003356"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:49:56.866006" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:56.866181" level="INFO">${response_text} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "traffic-action-extended-community": {
        "sample": true,
       ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:56.832598" elapsed="0.033676"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:56.866342" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:49:56.866515" level="INFO">${response_text} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "traffic-action-extended-community": {
        "sample": true,
       ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:56.743200" elapsed="0.123343"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.892415" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.891895" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.893278" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:56.892971" elapsed="0.000434">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:56.893602" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:56.892640" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.894228" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:56.893783" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:56.894584" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:56.894761" level="INFO">${template} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND whe...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:56.894404" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.895200" level="INFO">{
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND where IP protocol equals to 6 AND where port equals to 80 AND where destination port is greater than 8080 and is less than 8088 AND where source port is greater than 1024 AND where ICMP type equals to 0 AND where ICMP code equals to 0 AND where TCP flags does match 32 AND where packet length is greater than 400 and is less than 500 AND where DSCP equals to 20 AND where fragment does match 'IS FIRST' ",
                "attributes": {
                    "extended-communities": [
                        {
                            "transitive": true,
                            "traffic-action-extended-community": {
                                "sample": true,
                                "terminal-action": true
                            }
                        }
                    ],
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "flowspec": [
                    {
                        "destination-prefix": "192.168.0.1/32"
                    },
                    {
                        "source-prefix": "10.0.0.1/32"
                    },
                    {
                        "protocol-ips": [
                            {
                                "op": "end-of-list equals",
                                "value": 6
                            }
                        ]
                    },
                    {
                        "ports": [
                            {
                                "op": "end-of-list equals",
                                "value": 80
                            }
                        ]
                    },
                    {
                        "destination-ports": [
                            {
                                "op": "greater-than",
                                "value": 8080
                            },
                            {
                                "op": "end-of-list and-bit less-than",
                                "value": 8088
                            }
                        ]
                    },
                    {
                        "source-ports": [
                            {
                                "op": "end-of-list greater-than",
                                "value": 1024
                            }
                        ]
                    },
                    {
                        "types": [
                            {
                                "op": "end-of-list equals",
                                "value": 0
                            }
                        ]
                    },
                    {
                        "codes": [
                            {
                                "op": "end-of-list equals",
                                "value": 0
                            }
                        ]
                    },
                    {
                        "tcp-flags": [
                            {
                                "op": "end-of-list match",
                                "value": 32
                            }
                        ]
                    },
                    {
                        "packet-lengths": [
                            {
                                "op": "greater-than",
                                "value": 400
                            },
                            {
                                "op": "end-of-list and-bit less-than",
                                "value": 500
                            }
                        ]
                    },
                    {
                        "dscps": [
                            {
                                "op": "end-of-list equals",
                                "value": 20
                            }
                        ]
                    },
                    {
                        "fragments": [
                            {
                                "op": "end-of-list match",
                                "value": "first"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.894933" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:56.895896" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.895441" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.896638" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:56.896116" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.895983" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.895377" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.897358" level="INFO">${final_text} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND whe...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.896854" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:56.897440" elapsed="0.000067"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:56.891230" elapsed="0.006381"/>
</kw>
<msg time="2026-05-01T00:49:56.897688" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:56.879845" elapsed="0.017896"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.909276" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.920596" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.931645" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.931886" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.932061" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.932506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.932348" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:56.932329" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.932728" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.932881" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.933032" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:56.932285" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.932148" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.933249" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:56.933412" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:49:56.933623" level="INFO">${expected_text} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.1/32 AND from 10.0.0.1/32 AND whe...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:56.877373" elapsed="0.056281"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:56.933825" elapsed="0.002443"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:56.938594" level="INFO">${expected_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "traffic-action-extended-community": {
        "sample": true,
       ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:56.937057" elapsed="0.001567"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:56.940194" level="INFO">${actual_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "traffic-action-extended-community": {
        "sample": true,
       ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:56.938768" elapsed="0.001456"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:49:56.940370" elapsed="0.000374"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:49:56.936624" elapsed="0.004184"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.936354" elapsed="0.004490"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:56.941012" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:56.940872" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.936334" elapsed="0.004755"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:49:56.867716" elapsed="0.073427"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:49:56.866885" elapsed="0.074338"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:56.866630" elapsed="0.074640"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:56.866612" elapsed="0.074683"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:56.941338" elapsed="0.000039"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${exprspdir}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:49:56.737712" elapsed="0.203784"/>
</kw>
<arg>${EXP1}</arg>
<doc>Verify expected response</doc>
<status status="PASS" start="2026-05-01T00:49:56.734064" elapsed="0.207495"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>Verify_Flowspec_Data</arg>
<arg>${EXP1}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:56.733611" elapsed="0.207995"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:49:56.942366" level="INFO">[?2004l00:49:53 | 2646   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:53 | 2646   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:53 | 2646   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:49:53 | 2646   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:49:53 | 2646   | [01;34minstallation [0m | [1m        [0m
00:49:53 | 2646   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:49:53 | 2646   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:49:53 | 2646   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:49:53 | 2646   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:49:53 | 2646   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:49:53 | 2646   | configuration[0m | . local-as         | '64496'[0m
00:49:53 | 2646   | configuration[0m | . peer-as          | '64496'[0m
00:49:53 | 2646   | configuration[0m | &gt; family           | [0m
00:49:53 | 2646   | configuration[0m | . ipv4             | 'flow'[0m
00:49:53 | 2646   | configuration[0m | &lt; family           | [0m
00:49:53 | 2646   | configuration[0m | &gt; flow             | [0m
00:49:53 | 2646   | configuration[0m | &gt; route            | 'flow1'[0m
00:49:53 | 2646   | configuration[0m | &gt; match            | [0m
00:49:53 | 2646   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:49:53 | 2646   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:49:53 | 2646   | configuration[0m | . port             | '=80'[0m
00:49:53 | 2646   | configuration[0m | . destination-port | '&gt;8080&amp;&lt;8088'[0m
00:49:53 | 2646   | configuration[0m | . source-port      | '&gt;1024'[0m
00:49:53 | 2646   | configuration[0m | . protocol         | 'tcp'[0m
00:49:53 | 2646   | configuration[0m | . packet-length    | '&gt;400&amp;&lt;500'[0m
00:49:53 | 2646   | configuration[0m | . fragment         | '=first-fragment'[0m
00:49:53 | 2646   | configuration[0m | . icmp-type        | 'echo-reply'[0m
00:49:53 | 2646   | configuration[0m | . icmp-code        | 'network-unreachable'[0m
00:49:53 | 2646   | configuration[0m | . tcp-flags        | '=urgent'[0m
00:49:53 | 2646   | configuration[0m | . dscp             | '20'[0m
00:49:53 | 2646   | configuration[0m | &lt; match            | [0m
00:49:53 | 2646   | configuration[0m | &gt; then             | [0m
00:49:53 | 2646   | configuration[0m | . action           | 'sample-terminal'[0m
00:49:53 | 2646   | configuration[0m | &lt; then             | [0m
00:49:53 | 2646   | configuration[0m | &lt; route            | [0m
00:49:53 | 2646   | configuration[0m | &lt; flow             | [0m
00:49:53 | 2646   | configuration[0m | &lt; neighbor         | [0m
00:49:53 | 2646   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:49:53 | 2646   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:49:53 | 2646   | reactor      [0m | initialising connection to peer-1[0m
00:49:53 | 2646   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  52) 04FB F000 B4C0 0002 022A 0228 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0085 0104 0001 0080 0104 0001 0085 4002 00B4 4700[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 flow,ipv4 mpls-vpn,ipv4 flow), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:49:53 | 2646   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:49:53 | 2646   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:49:53 | 2646   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload ( 108) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 006C 0200 0000 5540 0101 0040 0200 4005 0400 0000 64C0 1008 8007 0000 0000 0003 800E 3900 0185 0000 3301 20C0 A800 0102 200A 0000 0103 8106 0481 5005 121F 90D4 1F98 0692 0400 0781 0008 8100 0981 200A 1201 90D4 01F4 0B81 140C 8104[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:49:53 | 2646   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:49:53 | 2646   | routes       [0m | withdrawn NLRI none[0m
00:49:53 | 2646   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:49:53 | 2646   | routes       [0m | announced NLRI none[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:54 | 2646   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:49:54 | 2646   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-05-01T00:49:56.942707" level="INFO">${output} = [?2004l00:49:53 | 2646   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:53 | 2646   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:53 | 2646   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:49:56.942218" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.943132" level="INFO">[?2004l00:49:53 | 2646   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:53 | 2646   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:53 | 2646   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:49:53 | 2646   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:49:53 | 2646   | [01;34minstallation [0m | [1m        [0m
00:49:53 | 2646   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:49:53 | 2646   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:49:53 | 2646   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:49:53 | 2646   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:49:53 | 2646   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:49:53 | 2646   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:49:53 | 2646   | configuration[0m | . local-as         | '64496'[0m
00:49:53 | 2646   | configuration[0m | . peer-as          | '64496'[0m
00:49:53 | 2646   | configuration[0m | &gt; family           | [0m
00:49:53 | 2646   | configuration[0m | . ipv4             | 'flow'[0m
00:49:53 | 2646   | configuration[0m | &lt; family           | [0m
00:49:53 | 2646   | configuration[0m | &gt; flow             | [0m
00:49:53 | 2646   | configuration[0m | &gt; route            | 'flow1'[0m
00:49:53 | 2646   | configuration[0m | &gt; match            | [0m
00:49:53 | 2646   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:49:53 | 2646   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:49:53 | 2646   | configuration[0m | . port             | '=80'[0m
00:49:53 | 2646   | configuration[0m | . destination-port | '&gt;8080&amp;&lt;8088'[0m
00:49:53 | 2646   | configuration[0m | . source-port      | '&gt;1024'[0m
00:49:53 | 2646   | configuration[0m | . protocol         | 'tcp'[0m
00:49:53 | 2646   | configuration[0m | . packet-length    | '&gt;400&amp;&lt;500'[0m
00:49:53 | 2646   | configuration[0m | . fragment         | '=first-fragment'[0m
00:49:53 | 2646   | configuration[0m | . icmp-type        | 'echo-reply'[0m
00:49:53 | 2646   | configuration[0m | . icmp-code        | 'network-unreachable'[0m
00:49:53 | 2646   | configuration[0m | . tcp-flags        | '=urgent'[0m
00:49:53 | 2646   | configuration[0m | . dscp             | '20'[0m
00:49:53 | 2646   | configuration[0m | &lt; match            | [0m
00:49:53 | 2646   | configuration[0m | &gt; then             | [0m
00:49:53 | 2646   | configuration[0m | . action           | 'sample-terminal'[0m
00:49:53 | 2646   | configuration[0m | &lt; then             | [0m
00:49:53 | 2646   | configuration[0m | &lt; route            | [0m
00:49:53 | 2646   | configuration[0m | &lt; flow             | [0m
00:49:53 | 2646   | configuration[0m | &lt; neighbor         | [0m
00:49:53 | 2646   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:49:53 | 2646   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:49:53 | 2646   | reactor      [0m | initialising connection to peer-1[0m
00:49:53 | 2646   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  52) 04FB F000 B4C0 0002 022A 0228 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0085 0104 0001 0080 0104 0001 0085 4002 00B4 4700[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 flow,ipv4 mpls-vpn,ipv4 flow), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:49:53 | 2646   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:49:53 | 2646   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:49:53 | 2646   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:49:53 | 2646   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload ( 108) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 006C 0200 0000 5540 0101 0040 0200 4005 0400 0000 64C0 1008 8007 0000 0000 0003 800E 3900 0185 0000 3301 20C0 A800 0102 200A 0000 0103 8106 0481 5005 121F 90D4 1F98 0692 0400 0781 0008 8100 0981 200A 1201 90D4 01F4 0B81 140C 8104[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:49:53 | 2646   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:49:53 | 2646   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:49:53 | 2646   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:49:53 | 2646   | routes       [0m | withdrawn NLRI none[0m
00:49:53 | 2646   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:49:53 | 2646   | routes       [0m | announced NLRI none[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:53 | 2646   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:53 | 2646   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:53 | 2646   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:53 | 2646   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:49:53 | 2646   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:54 | 2646   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:49:54 | 2646   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:49:55 | 2646   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:56.942881" elapsed="0.000496"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:56.944198" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:56.943870" elapsed="0.000355"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:56.944365" elapsed="0.000311"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:49:56.943585" elapsed="0.001151"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.071684" level="INFO">^C00:49:56 | 2646   | [00;31mreactor      [0m | [1m^C received[0m
00:49:56 | 2646   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:49:56 | 2646   | outgoing-1   [0m | stop, message [shutting down][0m
00:49:56 | 2646   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:49:57.071947" level="INFO">${output} = ^C00:49:56 | 2646   | [00;31mreactor      [0m | [1m^C received[0m
00:49:56 | 2646   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:49:56 | 2646   | outgoing-1   [0m | stop, messag...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:56.944886" elapsed="0.127097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.072637" level="INFO">^C00:49:56 | 2646   | [00;31mreactor      [0m | [1m^C received[0m
00:49:56 | 2646   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:49:56 | 2646   | outgoing-1   [0m | stop, message [shutting down][0m
00:49:56 | 2646   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.072247" elapsed="0.000447"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.075047" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:57.073434" elapsed="0.001671"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.075941" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:49:57.076028" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:57.075254" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.076921" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.076420" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.076137" elapsed="0.000869"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.076112" elapsed="0.000924"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:49:57.073004" elapsed="0.004084"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:49:56.941918" elapsed="0.135222"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec.cfg</doc>
<status status="PASS" start="2026-05-01T00:49:53.462289" elapsed="3.614900"/>
</test>
<test id="s1-s10-t4" name="FlowSpec_Test_2" line="66">
<kw name="Setup_Testcase" type="SETUP">
<kw name="Verify_Empty_Flowspec_Data">
<kw name="Verify_Empty_Flowspec_Data_Neon">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.126954" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.126497" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.127959" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:57.127512" elapsed="0.000528">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:57.128138" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:57.127160" elapsed="0.001002"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.128751" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:57.128320" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.129077" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:57.129245" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:57.128932" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.129697" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.129422" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.131128" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.130590" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.131779" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:49:57.131328" elapsed="0.000478"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.132172" elapsed="0.000076"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.132681" elapsed="0.000083"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.132983" elapsed="0.000076"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:49:57.132012" elapsed="0.001140"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.131864" elapsed="0.001323"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:49:57.133239" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:49:57.133418" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:49:57.130252" elapsed="0.003191"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.129907" elapsed="0.003603"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.133678" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.133538" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.129880" elapsed="0.003889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.134381" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:57.133905" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:57.134477" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:57.125795" elapsed="0.008813"/>
</kw>
<msg time="2026-05-01T00:49:57.134689" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:57.114090" elapsed="0.020665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.146409" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.157859" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.169239" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.169544" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.169729" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.170291" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.170130" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:57.170021" elapsed="0.000360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.170534" elapsed="0.000056"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.170733" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.170889" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:57.169975" elapsed="0.000969"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.169819" elapsed="0.001155"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.171114" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.171199" elapsed="0.000025"/>
</return>
<msg time="2026-05-01T00:49:57.171375" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:57.109829" elapsed="0.061576"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.172883" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:57.172574" elapsed="0.000389">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:57.173059" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:57.172149" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.173425" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.173159" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.173996" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.173697" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.173528" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.173140" elapsed="0.000940"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.176366" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:57.174223" elapsed="0.002170"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:49:57.176663" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:49:57.176838" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:57.171790" elapsed="0.005073"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.178134" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:49:57.177901" elapsed="0.000288"/>
</kw>
<msg time="2026-05-01T00:49:57.178275" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:57.177558" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.178592" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:57.178385" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.178363" elapsed="0.000305"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.178975" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:57.179245" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:57.178805" elapsed="0.000466"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:49:57.179955" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:49:57.179698" elapsed="0.000283"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:49:57.180030" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:49:57.180191" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:49:57.177194" elapsed="0.003022"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.181666" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.181390" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.182097" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.181854" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:57.192016" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:57.192383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '148'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}}]} 
 </msg>
<msg time="2026-05-01T00:49:57.192613" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:57.184367" elapsed="0.008290"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.182208" elapsed="0.010522"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.193016" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.192778" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.182190" elapsed="0.010959"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.198265" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.194823" elapsed="0.003516"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.194436" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.194407" elapsed="0.004027"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.202013" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.198895" elapsed="0.003187"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.198564" elapsed="0.003571"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.198536" elapsed="0.003636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.203100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:57.202415" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.203519" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.203249" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.204065" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.203753" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.203604" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.203222" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.204679" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:57.204294" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.205004" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.204780" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.205542" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.205230" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.205087" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.204760" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:57.205860" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:49:57.206720" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:57.206378" elapsed="0.000369"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:49:57.206901" elapsed="0.002099"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:49:57.193764" elapsed="0.015309"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.209265" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:49:57.209148" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.209129" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:57.212011" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:57.209492" elapsed="0.002548"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:49:57.212095" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:49:57.212269" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:49:57.180561" elapsed="0.031734"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:57.212361" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:49:57.212536" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:49:57.088996" elapsed="0.123568"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.238936" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.238080" elapsed="0.000891"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.240244" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:49:57.239741" elapsed="0.000733">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:49:57.240612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:49:57.239137" elapsed="0.001500"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.241435" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:57.240791" elapsed="0.000687"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:49:57.241833" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/empty_route/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:49:57.242016" level="INFO">${template} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:49:57.241628" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.242671" level="INFO">{
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
                "uptodate": "*"
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.242187" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:49:57.243204" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.242804" elapsed="0.000633"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.244213" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.243639" elapsed="0.000680"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.243499" elapsed="0.001014"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.242779" elapsed="0.001761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.245502" level="INFO">${final_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:49:57.244679" elapsed="0.000854"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:49:57.245587" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:49:57.237405" elapsed="0.008326"/>
</kw>
<msg time="2026-05-01T00:49:57.245787" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:57.225862" elapsed="0.019979"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.257281" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.268372" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.279441" elapsed="0.000191"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.279804" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.279974" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.280376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.280237" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:49:57.280220" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.280608" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.280764" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.280915" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:49:57.280182" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.280057" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.281131" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:49:57.281288" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:49:57.281439" level="INFO">${expected_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-flowspec:flowspec-subsequent-address-family",
            "attributes": {
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:49:57.223384" elapsed="0.058100"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:57.281652" elapsed="0.002310"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:57.285042" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:57.284714" elapsed="0.000356"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:49:57.285505" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-flowspec:flowspec-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:49:57.285211" elapsed="0.000323"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:49:57.285675" elapsed="0.000333"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:49:57.284275" elapsed="0.001793"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.284043" elapsed="0.002058"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:49:57.286295" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:49:57.286127" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.284025" elapsed="0.002353"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:49:57.213735" elapsed="0.072856"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:49:57.212898" elapsed="0.073774"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.212650" elapsed="0.074070"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.212633" elapsed="0.074111"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:49:57.286780" elapsed="0.000033"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}empty_route</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:49:57.083266" elapsed="0.203652"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-05-01T00:49:57.079032" elapsed="0.207950"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-05-01T00:49:57.078598" elapsed="0.208434"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.290108" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.289786" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.290559" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.290298" elapsed="0.000306"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.294482" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:57.291178" elapsed="0.003364"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.298579" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:49:57.298669" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:49:57.294697" elapsed="0.003998"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.299250" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.299002" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-05-01T00:49:57.298764" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-05-01T00:49:57.298745" elapsed="0.000663"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:49:57.290833" elapsed="0.008641"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:49:57.301782" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg</msg>
<msg time="2026-05-01T00:49:57.301870" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:49:57.299615" elapsed="0.002281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.302315" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.302040" elapsed="0.000325"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:49:57.289478" elapsed="0.012942"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.304267" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:49:57.303920" elapsed="0.000373"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.306402" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:49:57.304442" elapsed="0.001987"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:49:57.313470" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:49:57.313622" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:49:57.313719" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:49:57.306595" elapsed="0.007149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.316084" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:49:57.313896" elapsed="0.002235"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:49:57.318983" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:49:57.316274" elapsed="0.002812">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:49:57.303478" elapsed="0.015773">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.322276" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.321372" elapsed="0.000973"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.326819" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.322759" elapsed="0.004122"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:00.337938" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:00.340793" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3477'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:50:00.341166" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:00.327215" elapsed="0.014013"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.346999" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true},"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.341609" elapsed="0.005566"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:50:00.347495" elapsed="0.002214"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:50:00.320138" elapsed="0.029638"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:49:57.302973" elapsed="3.046859"/>
</kw>
<msg time="2026-05-01T00:50:00.349938" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:00.349983" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:49:57.302586" elapsed="3.047420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.350390" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.350112" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.350087" elapsed="0.000409"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:50:00.350681" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:50:00.350553" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.350537" elapsed="0.000239"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:49:57.289297" elapsed="3.061507"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:49:57.289077" elapsed="3.061763"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.350984" elapsed="0.000022"/>
</kw>
<arg>${cfg_file}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:49:57.287324" elapsed="3.063744"/>
</kw>
<arg>${CFG2}</arg>
<status status="PASS" start="2026-05-01T00:49:57.078268" elapsed="3.272862"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Flowspec_Data">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.398069" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.397676" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.398954" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:00.398624" elapsed="0.000411">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:00.399131" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:00.398251" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.399712" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.399306" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.400025" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:00.400181" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:00.399887" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.400610" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.400349" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.401640" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.401321" elapsed="0.000365"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.402103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.401834" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.402446" elapsed="0.000065"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.402690" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.402851" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:50:00.402321" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.402182" elapsed="0.000756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:00.402983" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:00.403147" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:00.401013" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.400726" elapsed="0.002480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.403365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.403231" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.400706" elapsed="0.002765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.404072" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.403631" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.404149" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:00.397061" elapsed="0.007214"/>
</kw>
<msg time="2026-05-01T00:50:00.404329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.385643" elapsed="0.018734"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.415813" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.426951" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.437989" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.438172" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.438333" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.438886" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.438752" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:00.438738" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.439114" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.439271" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.439424" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:00.438707" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.438441" elapsed="0.001077"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.439652" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.439727" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:00.439849" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:00.381748" elapsed="0.058128"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.441090" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:00.440846" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:00.441247" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:00.440518" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.441592" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.441343" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.442119" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.441828" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.441673" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.441324" elapsed="0.000877"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.444322" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.442338" elapsed="0.002011"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:00.444435" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:50:00.444608" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:00.440191" elapsed="0.004442"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.445815" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:00.445577" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:00.445972" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:00.445238" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:00.446211" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:00.446068" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.446050" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.446478" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.446752" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.446817" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:00.448664" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:00.444929" elapsed="0.003762"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.450048" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.449802" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.450534" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.450231" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:00.461583" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:00.462721" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-flowspec%3Aflowspec-subsequent-address-family/bgp-flowspec:flowspec-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1208'} 
 body={"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}} 
 </msg>
<msg time="2026-05-01T00:50:00.462886" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:00.452495" elapsed="0.010429"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.450646" elapsed="0.012339"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.463221" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.463023" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.450627" elapsed="0.012715"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.467882" level="INFO">{"bgp-flowspec:flowspec-routes":{"flowspec-route":[{"path-id":0,"route-key":"all packets to 192.168.0.4/32 AND from 10.0.0.4/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"127.0.0.1"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.4/32"},{"source-prefix":"10.0.0.4/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.2/32 AND from 10.0.0.2/32","attributes":{"extended-communities":[{"redirect-ip-nh-extended-community":{"next-hop-address":"0.0.0.0","copy":false},"transitive":true}],"ipv4-next-hop":{"global":"1.2.3.4"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.2/32"},{"source-prefix":"10.0.0.2/32"}]},{"path-id":0,"route-key":"all packets to 192.168.0.1/32 AND from 10.0.0.1/32","attributes":{"extended-communities":[{"redirect-extended-community":{"global-administrator":65500,"local-administrator":"AAAwOQ=="},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"flowspec":[{"destination-prefix":"192.168.0.1/32"},{"source-prefix":"10.0.0.1/32"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.464744" elapsed="0.003261"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.464433" elapsed="0.003622"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.464408" elapsed="0.003683"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.471355" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.468486" elapsed="0.002935"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.468172" elapsed="0.003308"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.468148" elapsed="0.003359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.472039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.471655" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.472355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.472138" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.472906" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.472598" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.472437" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.472119" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.473514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.473137" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.473829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.473614" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.474375" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.474053" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.473911" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.473596" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.474619" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:00.475407" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.475117" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.475593" elapsed="0.002052"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:00.463845" elapsed="0.013863"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.477884" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:00.477778" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.477760" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:00.481118" level="INFO">${text_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "redirect-ip-nh-extended-community": {
        "copy": false,
        ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:00.478086" elapsed="0.003063"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:50:00.481202" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:00.481364" level="INFO">${response_text} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "redirect-ip-nh-extended-community": {
        "copy": false,
        ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:00.448996" elapsed="0.032396"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.481469" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:00.481625" level="INFO">${response_text} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "redirect-ip-nh-extended-community": {
        "copy": false,
        ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:00.361545" elapsed="0.120107"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.508658" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.508169" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.509433" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:00.509155" elapsed="0.000417">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:00.509745" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:00.508836" elapsed="0.000935"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.510381" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.509922" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.510733" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_flowspec_redirect/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:00.510891" level="INFO">${template} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.2/32 AND from 10.0.0.2/32",
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:00.510573" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.511331" level="INFO">{
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.2/32 AND from 10.0.0.2/32",
                "attributes": {
                    "extended-communities": [
                        {
                            "transitive": true,
                            "redirect-ip-nh-extended-community": {
                                "next-hop-address": "0.0.0.0",
                                "copy": false
                            }
                        }
                    ],
                    "ipv4-next-hop": {
                        "global": "1.2.3.4"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "flowspec": [
                    {
                        "destination-prefix": "192.168.0.2/32"
                    },
                    {
                        "source-prefix": "10.0.0.2/32"
                    }
                ]
            },
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.1/32 AND from 10.0.0.1/32",
                "attributes": {
                    "extended-communities": [
                        {
                            "transitive": true,
                            "redirect-extended-community": {
                                "global-administrator": 65500,
                                "local-administrator": "AAAwOQ=="
                            }
                        }
                    ],
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "flowspec": [
                    {
                        "destination-prefix": "192.168.0.1/32"
                    },
                    {
                        "source-prefix": "10.0.0.1/32"
                    }
                ]
            },
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.4/32 AND from 10.0.0.4/32",
                "attributes": {
                    "extended-communities": [
                        {
                            "transitive": true,
                            "redirect-ip-nh-extended-community": {
                                "next-hop-address": "0.0.0.0",
                                "copy": false
                            }
                        }
                    ],
                    "ipv4-next-hop": {
                        "global": "127.0.0.1"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "flowspec": [
                    {
                        "destination-prefix": "192.168.0.4/32"
                    },
                    {
                        "source-prefix": "10.0.0.4/32"
                    }
                ]
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.511062" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:00.511880" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.511490" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.512613" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.512098" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.511966" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.511469" elapsed="0.001229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.513315" level="INFO">${final_text} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.2/32 AND from 10.0.0.2/32",
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.512831" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.513395" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:00.507569" elapsed="0.006008"/>
</kw>
<msg time="2026-05-01T00:50:00.513650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.496138" elapsed="0.017561"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.525010" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.536113" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_flowspec_redirect/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.547302" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.547515" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.547685" elapsed="0.000044"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.548162" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.548000" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:00.547982" elapsed="0.000275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.548414" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.548606" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.548760" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:00.547943" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.547808" elapsed="0.001034"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.548978" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.549056" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:50:00.549250" level="INFO">${expected_text} = {
    "bgp-flowspec:flowspec-routes": {
        "flowspec-route": [
            {
                "path-id": 0,
                "route-key": "all packets to 192.168.0.2/32 AND from 10.0.0.2/32",
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:00.493604" elapsed="0.055674"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.549512" elapsed="0.002285"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:00.553589" level="INFO">${expected_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "redirect-ip-nh-extended-community": {
        "copy": false,
        ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:00.552542" elapsed="0.001078"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:00.554790" level="INFO">${actual_normalized} = {
 "bgp-flowspec:flowspec-routes": {
  "flowspec-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "redirect-ip-nh-extended-community": {
        "copy": false,
        ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:00.553764" elapsed="0.001056"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:50:00.554965" elapsed="0.000334"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:50:00.552111" elapsed="0.003250"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.551879" elapsed="0.003517"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.555575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.555423" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.551860" elapsed="0.003794"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:50:00.482795" elapsed="0.072909"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:50:00.481966" elapsed="0.073815"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.481738" elapsed="0.074089"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.481720" elapsed="0.074131"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.555886" elapsed="0.000030"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${exprspdir}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:50:00.355376" elapsed="0.200640"/>
</kw>
<arg>${EXP2}</arg>
<doc>Verify expected response</doc>
<status status="PASS" start="2026-05-01T00:50:00.351755" elapsed="0.204323"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>Verify_Flowspec_Data</arg>
<arg>${EXP2}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:00.351291" elapsed="0.204832"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.556864" level="INFO">[?2004l00:49:57 | 2650   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:57 | 2650   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:57 | 2650   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:49:57 | 2650   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:49:57 | 2650   | [01;34minstallation [0m | [1m        [0m
00:49:57 | 2650   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:49:57 | 2650   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:49:57 | 2650   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:49:57 | 2650   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:49:57 | 2650   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:49:57 | 2650   | configuration[0m | . local-as         | '64496'[0m
00:49:57 | 2650   | configuration[0m | . peer-as          | '64496'[0m
00:49:57 | 2650   | configuration[0m | &gt; family           | [0m
00:49:57 | 2650   | configuration[0m | . ipv4             | 'flow'[0m
00:49:57 | 2650   | configuration[0m | &lt; family           | [0m
00:49:57 | 2650   | configuration[0m | &gt; flow             | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow1'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect         | '65500:12345'[0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow2'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.2/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.2/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect         | '1.2.3.4'[0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow4'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.4/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.4/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | . next-hop         | '127.0.0.1'[0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect-to-nexthop | [0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &lt; flow             | [0m
00:49:57 | 2650   | configuration[0m | &lt; neighbor         | [0m
00:49:57 | 2650   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:49:57 | 2650   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:49:57 | 2650   | reactor      [0m | initialising connection to peer-1[0m
00:49:57 | 2650   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  52) 04FB F000 B4C0 0002 022A 0228 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0085 0104 0001 0080 0104 0001 0085 4002 00B4 4700[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 flow,ipv4 mpls-vpn,ipv4 flow), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:49:57 | 2650   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:49:57 | 2650   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:49:57 | 2650   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  69) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0045 0200 0000 2E40 0101 0040 0200 4005 0400 0000 64C0 1008 8008 FFDC 0000 3039 800E 1200 0185 0000 0C01 20C0 A800 0102 200A 0000 01[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  73) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0049 0200 0000 3240 0101 0040 0200 4005 0400 0000 64C0 1008 0800 0000 0000 0000 800E 1600 0185 0401 0203 0400 0C01 20C0 A800 0202 200A 0000 02[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  73) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0049 0200 0000 3240 0101 0040 0200 4005 0400 0000 64C0 1008 0800 0000 0000 0000 800E 1600 0185 047F 0000 0100 0C01 20C0 A800 0402 200A 0000 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; 3 UPDATE(s)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:49:57 | 2650   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:49:57 | 2650   | routes       [0m | withdrawn NLRI none[0m
00:49:57 | 2650   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:49:57 | 2650   | routes       [0m | announced NLRI none[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #2 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:58 | 2650   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:49:58 | 2650   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:49:59 | 2650   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:49:59 | 2650   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:50:00 | 2650   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:50:00 | 2650   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-05-01T00:50:00.557158" level="INFO">${output} = [?2004l00:49:57 | 2650   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:57 | 2650   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:57 | 2650   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:50:00.556722" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.557602" level="INFO">[?2004l00:49:57 | 2650   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:49:57 | 2650   | [01;34mversion      [0m | [1m4.2.17  [0m
00:49:57 | 2650   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:49:57 | 2650   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:49:57 | 2650   | [01;34minstallation [0m | [1m        [0m
00:49:57 | 2650   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:49:57 | 2650   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:49:57 | 2650   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:49:57 | 2650   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:49:57 | 2650   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:49:57 | 2650   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:49:57 | 2650   | configuration[0m | . local-as         | '64496'[0m
00:49:57 | 2650   | configuration[0m | . peer-as          | '64496'[0m
00:49:57 | 2650   | configuration[0m | &gt; family           | [0m
00:49:57 | 2650   | configuration[0m | . ipv4             | 'flow'[0m
00:49:57 | 2650   | configuration[0m | &lt; family           | [0m
00:49:57 | 2650   | configuration[0m | &gt; flow             | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow1'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect         | '65500:12345'[0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow2'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.2/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.2/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect         | '1.2.3.4'[0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &gt; route            | 'flow4'[0m
00:49:57 | 2650   | configuration[0m | &gt; match            | [0m
00:49:57 | 2650   | configuration[0m | . source           | '10.0.0.4/32'[0m
00:49:57 | 2650   | configuration[0m | . destination      | '192.168.0.4/32'[0m
00:49:57 | 2650   | configuration[0m | &lt; match            | [0m
00:49:57 | 2650   | configuration[0m | . next-hop         | '127.0.0.1'[0m
00:49:57 | 2650   | configuration[0m | &gt; then             | [0m
00:49:57 | 2650   | configuration[0m | . redirect-to-nexthop | [0m
00:49:57 | 2650   | configuration[0m | &lt; then             | [0m
00:49:57 | 2650   | configuration[0m | &lt; route            | [0m
00:49:57 | 2650   | configuration[0m | &lt; flow             | [0m
00:49:57 | 2650   | configuration[0m | &lt; neighbor         | [0m
00:49:57 | 2650   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:49:57 | 2650   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:49:57 | 2650   | reactor      [0m | initialising connection to peer-1[0m
00:49:57 | 2650   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  52) 04FB F000 B4C0 0002 022A 0228 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0002 0085 0104 0001 0080 0104 0001 0085 4002 00B4 4700[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv6 flow,ipv4 mpls-vpn,ipv4 flow), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 180 , ASN4(64496), Unassigned 71][0m
00:49:57 | 2650   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:49:57 | 2650   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:49:57 | 2650   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:49:57 | 2650   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  69) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0045 0200 0000 2E40 0101 0040 0200 4005 0400 0000 64C0 1008 8008 FFDC 0000 3039 800E 1200 0185 0000 0C01 20C0 A800 0102 200A 0000 01[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  73) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0049 0200 0000 3240 0101 0040 0200 4005 0400 0000 64C0 1008 0800 0000 0000 0000 800E 1600 0185 0401 0203 0400 0C01 20C0 A800 0202 200A 0000 02[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  73) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0049 0200 0000 3240 0101 0040 0200 4005 0400 0000 64C0 1008 0800 0000 0000 0000 800E 1600 0185 047F 0000 0100 0C01 20C0 A800 0402 200A 0000 04[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; 3 UPDATE(s)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:57 | 2650   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:49:57 | 2650   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:49:57 | 2650   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:49:57 | 2650   | routes       [0m | withdrawn NLRI none[0m
00:49:57 | 2650   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:49:57 | 2650   | routes       [0m | announced NLRI none[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #2 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:49:57 | 2650   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:49:57 | 2650   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:49:57 | 2650   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:49:57 | 2650   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:49:57 | 2650   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:49:58 | 2650   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:49:58 | 2650   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:49:59 | 2650   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:49:59 | 2650   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:50:00 | 2650   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:50:00 | 2650   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.557330" elapsed="0.000511"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.558672" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.558335" elapsed="0.000365"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:00.558839" elapsed="0.000282"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:50:00.558034" elapsed="0.001148"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.684526" level="INFO">^C00:50:00 | 2650   | [00;31mreactor      [0m | [1m^C received[0m
00:50:00 | 2650   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:50:00 | 2650   | outgoing-1   [0m | stop, message [shutting down][0m
00:50:00 | 2650   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:50:00.684772" level="INFO">${output} = ^C00:50:00 | 2650   | [00;31mreactor      [0m | [1m^C received[0m
00:50:00 | 2650   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:50:00 | 2650   | outgoing-1   [0m | stop, messag...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:50:00.559331" elapsed="0.125476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.685424" level="INFO">^C00:50:00 | 2650   | [00;31mreactor      [0m | [1m^C received[0m
00:50:00 | 2650   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:50:00 | 2650   | outgoing-1   [0m | stop, message [shutting down][0m
00:50:00 | 2650   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.685066" elapsed="0.000436"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.687508" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:00.686248" elapsed="0.001319"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.688769" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:50:00.688862" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:50:00.687720" elapsed="0.001170"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.689523" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.689247" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.688976" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.688949" elapsed="0.000689"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:50:00.685787" elapsed="0.003901"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:50:00.556414" elapsed="0.133328"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec-redirect.cfg</doc>
<status status="PASS" start="2026-05-01T00:49:57.077742" elapsed="3.612050"/>
</test>
<test id="s1-s10-t5" name="Deconfigure_ODL_To_Accept_Connection" line="72">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.691150" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.690676" elapsed="0.000503"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.731896" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.731292" elapsed="0.000649"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.733005" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:00.732658" elapsed="0.000450">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:00.733242" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:00.732166" elapsed="0.001110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.734125" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.733510" elapsed="0.000656"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:00.734558" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpflowspec/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:00.734733" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:00.734375" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.735155" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.734908" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.736290" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.736032" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.736777" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.736505" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.737476" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:00.737162" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:00.738237" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.738013" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:00.738316" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:50:00.738506" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:00.737683" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.738675" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:00.737038" elapsed="0.001921"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.739516" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:00.739194" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:00.740415" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.740022" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:00.740513" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:00.740671" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:00.739720" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.740835" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:00.739076" elapsed="0.002023"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:00.736859" elapsed="0.004275"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:00.741179" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:00.741336" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:00.735713" elapsed="0.005649"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.735354" elapsed="0.006040"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.741575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.741422" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.735328" elapsed="0.006326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.742414" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.741805" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.742513" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:00.730327" elapsed="0.012314"/>
</kw>
<msg time="2026-05-01T00:50:00.742697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.717553" elapsed="0.025194"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.754041" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.765308" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.776523" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.776733" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.776907" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.777307" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.777170" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:00.777153" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.777539" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.777715" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.777871" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:00.777113" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.776990" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.778086" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.778166" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:50:00.778322" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:00.713511" elapsed="0.064839"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.779531" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.779225" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:00.791116" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0j68na24y51odwiwn0uikaqj19.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:00.791168" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:00.791283" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:00.781504" elapsed="0.009806"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.779653" elapsed="0.011699"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.791808" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.791380" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.779634" elapsed="0.012382"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.801792" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.794621" elapsed="0.007306"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.794034" elapsed="0.007991"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.793988" elapsed="0.008105"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.805260" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.802591" elapsed="0.002718"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.802228" elapsed="0.003118"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.802189" elapsed="0.003182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.806010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.805555" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.806334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.806112" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.807056" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.806641" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.806420" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.806093" elapsed="0.001082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.807888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.807374" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.808257" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.808027" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.808811" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.808504" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:00.808342" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.808001" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.809041" elapsed="0.000434"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:00.810093" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:00.809713" elapsed="0.000414"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.810310" elapsed="0.002135"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:00.792887" elapsed="0.019647"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:00.812593" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:50:00.814780" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:50:00.778628" elapsed="0.036181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:00.814865" elapsed="0.000034"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:50:00.691400" elapsed="0.123604"/>
</kw>
<doc>Deconfigure BGP peer.</doc>
<status status="PASS" start="2026-05-01T00:50:00.690241" elapsed="0.124888"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:50:00.815787" elapsed="0.000365"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:00.816376" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:50:00.816298" elapsed="0.000251"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:50:00.815566" elapsed="0.001049"/>
</kw>
<doc>Functional test for bgp flowspec.

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html</doc>
<status status="PASS" start="2026-05-01T00:49:46.561353" elapsed="14.255293"/>
</suite>
<suite id="s1-s11" name="Ibgp Peer Lsp" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.906924" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:00.902527" elapsed="0.004448"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:50:00.902272" elapsed="0.004772"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.911991" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:50:00.908164" elapsed="0.003855"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:50:00.912233" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:00.912107" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.912083" elapsed="0.000223"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.912844" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:00.912484" elapsed="0.000403"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.913370" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:50:00.913059" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:50:00.913983" elapsed="0.000285"/>
</kw>
<msg time="2026-05-01T00:50:00.914366" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:00.914413" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:00.913621" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.915003" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.914629" elapsed="0.000400"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.916028" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:00.915762" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.916477" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:00.916208" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.916958" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.916670" elapsed="0.000315"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.920308" elapsed="0.000223"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.921018" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.920696" elapsed="0.000349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.921203" elapsed="0.000265"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.922274" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.921972" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:50:00.922348" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:00.922523" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:50:00.921674" elapsed="0.000874"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:00.923132" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1942df10&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:50:00.922709" elapsed="0.000552"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.923429" elapsed="0.000207"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:50:00.919734" elapsed="0.003962"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:00.919535" elapsed="0.004205"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:50:00.917040" elapsed="0.006733"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.924345" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:00.923944" elapsed="0.000444"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.924971" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:00.924571" elapsed="0.000482"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.925644" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:00.925224" elapsed="0.000464"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:50:00.915290" elapsed="0.010457"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:50:00.907815" elapsed="0.017988"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:00.925984" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:00.925870" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.925851" elapsed="0.000201"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.929220" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:00.928838" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.929759" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:00.929430" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:00.929833" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:00.929994" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:00.928500" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:00.931065" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.930786" elapsed="0.000306"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.931877" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:00.931981" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:00.931707" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:00.935721" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:00.935112" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:00.935092" elapsed="0.000756"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.936523" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:00.936762" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:00.936057" elapsed="0.000758"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.937807" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:00.937090" elapsed="0.000825"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.939134" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:00.938203" elapsed="0.000986"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:00.940959" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:00.941140" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:00.940598" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.941590" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:50:00.943226" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:50:01.553706" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:50:01 UTC 2026

  System load:  0.17               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:47:17 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:50:00.942897" elapsed="0.611124"/>
</kw>
<msg time="2026-05-01T00:50:01.554132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.942418" elapsed="0.611917"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:50:00.939678" elapsed="0.614891"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.555745" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:50:01.568925" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:50:01.569155" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:50:01.569261" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:01.555072" elapsed="0.014241"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.569723" elapsed="0.000587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.571592" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:01.570975" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.572145" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.571873" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.571846" elapsed="0.000493"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:01.572675" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-05-01T00:50:01.572421" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.572404" elapsed="0.000465"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.572931" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.576618" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.577405" elapsed="0.000328"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.578010" elapsed="0.000230"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:01.573444" elapsed="0.004869"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:50:00.934125" elapsed="0.644493"/>
</kw>
<msg time="2026-05-01T00:50:01.578679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.933381" elapsed="0.645359"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:50:00.932717" elapsed="0.646105"/>
</kw>
<msg time="2026-05-01T00:50:01.578862" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:00.932172" elapsed="0.646736"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.581682" elapsed="0.000316"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.582169" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.582570" elapsed="0.000100"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:01.579216" elapsed="0.003506"/>
</kw>
<msg time="2026-05-01T00:50:01.582880" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:50:00.931321" elapsed="0.651585"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.583379" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:01.583123" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:50:01.583481" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:50:00.930396" elapsed="0.653219"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:00.930206" elapsed="0.653447"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:00.930073" elapsed="0.653617"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:50:00.926281" elapsed="0.657467"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:50:01.583909" elapsed="0.000236"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.598393" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.598279" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.598257" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.598789" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:01.598893" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.598647" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.599337" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:01.599079" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.599796" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:01.599553" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:01.600664" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:50:01.600417" elapsed="0.000360">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:50:01.600886" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:50:01.600930" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.600004" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.601261" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:01.601029" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.601010" elapsed="0.000350"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:01.602137" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.601870" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:50:01.602211" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:01.602362" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:50:01.601591" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.602570" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.603261" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:01.603360" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.603154" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.603554" elapsed="0.002456"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.606473" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:50:01.748781" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.606185" elapsed="0.142862"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.752584" elapsed="0.000366"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.753125" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.753474" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:01.750208" elapsed="0.003426"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:01.749502" elapsed="0.004180"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.597988" elapsed="0.155750"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:01.584907" elapsed="0.168880"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.584527" elapsed="0.169314"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:01.584363" elapsed="0.169520"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:50:01.584208" elapsed="0.169713"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:50:00.907347" elapsed="0.846635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.756748" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.756629" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.756607" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.761980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.761865" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.761847" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.763033" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:01.762643" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.763541" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:01.763228" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:01.763612" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:50:01.763776" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:01.762286" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.770966" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.770855" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.770836" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.772320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:01.772192" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.772173" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:01.772908" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.772567" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.773331" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:01.773105" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.805595" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:01.774054" elapsed="0.031679"/>
</kw>
<msg time="2026-05-01T00:50:01.805865" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:01.805911" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.773544" elapsed="0.032597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.874299" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "i "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "_ "l "s "p ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:01.806869" elapsed="0.067696"/>
</kw>
<msg time="2026-05-01T00:50:01.874699" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:01.874745" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.806329" elapsed="0.068453"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.875111" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:01.874862" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.874842" elapsed="0.000444"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.875827" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "u "s "e "r "/ "i "b "g "p "_ "p "e "[78Ce "[A[78Cr
 "_ "l "s "p ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:01.875438" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.876219" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:01.875977" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.875959" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:01.876428" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.878424" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.879256" elapsed="0.000311"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:01.879932" elapsed="0.000237"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:01.877632" elapsed="0.002629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:01.876727" elapsed="0.003668"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:01.771899" elapsed="0.108614"/>
</kw>
<msg time="2026-05-01T00:50:01.880607" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:01.880651" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.771199" elapsed="0.109489"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:01.880874" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:01.880765" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.880746" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.881368" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.881743" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:01.881815" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:01.770561" elapsed="0.111366"/>
</kw>
<msg time="2026-05-01T00:50:01.882019" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:01.882062" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.764334" elapsed="0.117766"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:01.882430" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:01.882175" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:01.882158" elapsed="0.000430"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:01.764164" elapsed="0.118448"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:01.763983" elapsed="0.118659"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:01.761404" elapsed="0.121293"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:50:01.754617" elapsed="0.128134"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:01.754150" elapsed="0.128643"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:50:00.901874" elapsed="0.980968"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-01T00:50:01.882999" elapsed="0.000178"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:01.883337" elapsed="0.000415"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:01.885423" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:01.885529" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:01.885146" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.885717" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:50:01.887296" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:50:02.216433" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:49:46 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:49:47 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:50:01.886974" elapsed="0.329629"/>
</kw>
<msg time="2026-05-01T00:50:02.216686" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.886423" elapsed="0.330343"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:50:01.884709" elapsed="0.332168"/>
</kw>
<msg time="2026-05-01T00:50:02.216930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:01.884297" elapsed="0.332680"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:50:01.883958" elapsed="0.333097"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.218479" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-05-01T00:50:02.230959" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:02.231147" level="INFO">${stdout} = usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_ins...</msg>
<msg time="2026-05-01T00:50:02.231213" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:50:02.231273" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:02.218258" elapsed="0.013048"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.232551" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:50:02.232141" elapsed="0.000474"/>
</kw>
<msg time="2026-05-01T00:50:02.232746" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:50:02.232807" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.231617" elapsed="0.001221"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.233705" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:02.233081" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.234340" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:02.233857" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.233826" elapsed="0.000746"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:50:02.234794" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.234653" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.234631" elapsed="0.000290"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.235091" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.235038" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:02.235014" elapsed="0.000163"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.235385" elapsed="0.000030"/>
</kw>
<msg time="2026-05-01T00:50:02.235618" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>python3 --help</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:02.217897" elapsed="0.017756"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:50:02.235874" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.235748" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.235724" elapsed="0.000260"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.236192" elapsed="0.000030"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:02.217420" elapsed="0.018880"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.238066" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:50:02.299934" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:02.300193" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:50:02.300290" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:50:02.300382" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:02.237813" elapsed="0.062621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.302302" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:50:02.301713" elapsed="0.000689"/>
</kw>
<msg time="2026-05-01T00:50:02.302649" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:50:02.302748" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.300897" elapsed="0.001902"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.304229" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:02.303270" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.305260" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:02.304491" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.304418" elapsed="0.001069"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:50:02.305833" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.305616" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.305581" elapsed="0.000444"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.306225" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.306149" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:02.306114" elapsed="0.000249"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.306722" elapsed="0.000049"/>
</kw>
<msg time="2026-05-01T00:50:02.307080" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:02.237266" elapsed="0.069870"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:50:02.307527" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.307290" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.307252" elapsed="0.000457"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.308049" elapsed="0.000047"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:50:02.236666" elapsed="0.071563"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.344943" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:50:02.359773" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:50:02.308604" elapsed="0.051280"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:02.360749" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19daf990&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:50:02.360223" elapsed="0.000856"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.363265" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:50:02.362706" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-05-01T00:50:02.363586" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.363418" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.363385" elapsed="0.000302"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.363851" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.364034" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.364219" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.364407" elapsed="0.000021"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.364721" elapsed="0.000024"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:50:02.362175" elapsed="0.002637"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.364997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.364876" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.364858" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.368579" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:02.368170" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.369073" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:02.368775" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:02.369145" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:02.369300" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:02.367836" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:02.370365" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.370092" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.371162" level="INFO">index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:02.371262" level="INFO">${current_connection} = index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.371035" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.373997" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:02.373666" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.373647" elapsed="0.000548"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.374478" level="INFO">index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:02.374603" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.374351" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.375771" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:02.374829" elapsed="0.000990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.376703" level="INFO">${conn_id} = 8</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.376026" elapsed="0.000704"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.378057" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:02.378258" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:02.377497" elapsed="0.000812"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.378621" elapsed="0.000632"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.380895" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:50:02.697844" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:50:01 UTC 2026

  System load:  0.17               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:50:01 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:50:02.380353" elapsed="0.317701"/>
</kw>
<msg time="2026-05-01T00:50:02.698171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.379615" elapsed="0.318803"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:50:02.376955" elapsed="0.321773"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.699359" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:50:02.712007" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:50:02.712366" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:50:02.712512" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:02.699007" elapsed="0.013569"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.712958" elapsed="0.000588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.715337" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:02.714005" elapsed="0.001494"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.716047" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.715687" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.715635" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:02.716676" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-05-01T00:50:02.716341" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.716306" elapsed="0.000582"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.716966" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:02.723517" elapsed="0.000482"/>
</kw>
<msg time="2026-05-01T00:50:02.724139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.721732" elapsed="0.002625"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.724724" elapsed="0.000111"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.725113" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:02.717735" elapsed="0.007621"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:50:02.373151" elapsed="0.352428"/>
</kw>
<msg time="2026-05-01T00:50:02.725659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.372482" elapsed="0.353313"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:50:02.371982" elapsed="0.353931"/>
</kw>
<msg time="2026-05-01T00:50:02.725972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.371469" elapsed="0.354568"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:02.731379" elapsed="0.000273"/>
</kw>
<msg time="2026-05-01T00:50:02.731726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.730286" elapsed="0.001542"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.732091" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.732333" elapsed="0.000028"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:02.726679" elapsed="0.005767"/>
</kw>
<msg time="2026-05-01T00:50:02.732607" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:50:02.370637" elapsed="0.362006"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.733299" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:02.732938" elapsed="0.000419"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:50:02.733418" elapsed="0.000065"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:50:02.369729" elapsed="0.363902"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:02.369542" elapsed="0.364141"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:02.369385" elapsed="0.364347"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:50:02.365285" elapsed="0.368527"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:50:02.734040" elapsed="0.000379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.749240" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.749126" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.749106" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.749610" level="INFO">index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:02.749713" level="INFO">${current_ssh_connection_object} = index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.749489" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.750176" level="INFO">{1: 4}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:02.749899" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.750697" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:02.750389" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.751281" elapsed="0.000236"/>
</kw>
<msg time="2026-05-01T00:50:02.751624" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:02.751670" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.750911" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:02.752554" elapsed="0.000138"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.762405" level="INFO">logout</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:02.753198" elapsed="0.009284"/>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.752864" elapsed="0.009672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.763052" elapsed="0.000192"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.762720" elapsed="0.000573"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:50:02.752013" elapsed="0.011324"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:02.751772" elapsed="0.011664"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.751753" elapsed="0.011729"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:02.764253" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.763983" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:50:02.764328" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:02.764504" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:50:02.763700" elapsed="0.000830"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.764690" elapsed="0.000465"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.765442" level="INFO">index=9
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:02.765563" level="INFO">${karaf_connection_object} = index=9
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.765338" elapsed="0.000252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.765743" elapsed="0.002263"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.768435" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:50:02.947353" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.768174" elapsed="0.179331"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:02.951786" elapsed="0.000214"/>
</kw>
<msg time="2026-05-01T00:50:02.952057" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:02.951183" elapsed="0.000961"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.952312" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:02.952507" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:02.948588" elapsed="0.004007"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:02.947892" elapsed="0.004750"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:50:02.748836" elapsed="0.203858"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:02.735206" elapsed="0.217537"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.734837" elapsed="0.217958"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:02.734689" elapsed="0.218146"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:50:02.734533" elapsed="0.218341"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:50:02.361575" elapsed="0.591361"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
prepare directories for responses, put Python tool to mininet machine, setup imported resources.</doc>
<status status="PASS" start="2026-05-01T00:50:00.901549" elapsed="2.051438"/>
</kw>
<test id="s1-s11-t1" name="TC1_Configure_iBGP_Peer" line="54">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:02.956328" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:02.955996" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.957694" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.957572" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.957548" elapsed="0.000256"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.962943" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.962820" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.962802" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.964069" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:02.963674" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:02.964577" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:02.964262" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:02.964649" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:02.964806" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:02.963256" elapsed="0.001575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.970767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.970655" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.970635" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:02.972072" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:02.971950" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:02.971932" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:02.972629" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:02.972293" elapsed="0.000363"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:02.973036" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:02.972819" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.015844" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:02.973594" elapsed="0.042501"/>
</kw>
<msg time="2026-05-01T00:50:03.016538" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:03.016649" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.973227" elapsed="0.043505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.068392" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:03.018058" elapsed="0.050455"/>
</kw>
<msg time="2026-05-01T00:50:03.068684" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:03.068730" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.017135" elapsed="0.051631"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.069084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.068846" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.068826" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.069672" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.069311" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.070031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.069808" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.069789" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:03.070188" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.072749" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:50:03.072955" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.071671" elapsed="0.001414"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.073361" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.073756" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:03.071023" elapsed="0.002919"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:03.070477" elapsed="0.003530"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:02.971639" elapsed="0.102474"/>
</kw>
<msg time="2026-05-01T00:50:03.074207" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.074251" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.970994" elapsed="0.103295"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:03.074498" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.074366" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.074348" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.074994" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.075340" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.075410" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:02.970283" elapsed="0.105254"/>
</kw>
<msg time="2026-05-01T00:50:03.075631" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.075675" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.965215" elapsed="0.110496"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.076046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.075786" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.075769" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:02.965068" elapsed="0.111078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:02.964890" elapsed="0.111285"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:02.962441" elapsed="0.113788"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:02.957234" elapsed="0.119050"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:02.956775" elapsed="0.119554"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:02.953686" elapsed="0.122695"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.077396" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exam...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.076595" elapsed="0.000830"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.111999" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.111586" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:03.112832" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:03.112557" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:03.113007" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:03.112197" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.113605" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.113197" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:03.113934" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:03.114098" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:03.113797" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.114543" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.114283" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.115561" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.115281" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.116026" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.115767" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.116751" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.116421" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.117566" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.117294" elapsed="0.000299"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.117643" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:50:03.117798" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.116972" elapsed="0.000850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.117980" elapsed="0.000244"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:50:03.116281" elapsed="0.001982"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.118836" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.118537" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.119744" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.119531" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.119820" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:03.119973" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.119051" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.120154" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:50:03.118383" elapsed="0.002032"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.120983" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.120689" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.121779" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.121562" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.121889" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:03.122044" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.121200" elapsed="0.000868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.122223" elapsed="0.000221"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:03.120551" elapsed="0.001949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.123052" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.122758" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.123825" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.123609" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.123900" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.124057" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.123269" elapsed="0.000813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.124235" elapsed="0.000234"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:50:03.122620" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.125054" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.124761" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.125824" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.125616" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.125898" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.126046" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.125269" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.126229" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:50:03.124624" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.127056" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.126755" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.127824" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.127608" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.127897" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:03.128046" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.127274" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.128224" elapsed="0.000238"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:50:03.126617" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.129068" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.128761" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.130035" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.129656" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.130110" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.130261" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.129284" elapsed="0.001001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.130439" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:03.128624" elapsed="0.002091"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.131259" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.130964" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.132016" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.131810" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.132126" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:03.132280" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.131489" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.132474" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:50:03.130827" elapsed="0.001910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.133277" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.132985" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.134046" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.133839" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.134121" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.134269" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.133519" elapsed="0.000780"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.134469" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:03.132849" elapsed="0.001881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.135273" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:03.134980" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:03.136041" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.135833" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:03.136116" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.136265" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:03.135504" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.136442" elapsed="0.000236"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:03.134844" elapsed="0.001873"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:03.116099" elapsed="0.020654"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:03.136795" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:50:03.136955" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:03.114956" elapsed="0.022025"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.114656" elapsed="0.022357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.137191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.137038" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.114638" elapsed="0.022628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.138200" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.137419" elapsed="0.000810"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:03.138278" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:03.110956" elapsed="0.027447"/>
</kw>
<msg time="2026-05-01T00:50:03.138471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.097998" elapsed="0.040523"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.151759" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.164447" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.177181" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.177384" elapsed="0.000047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.177609" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.177991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.177840" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:03.177825" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.178215" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.178384" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.178573" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:03.177794" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.177687" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.178805" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.178880" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:03.179011" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:03.093646" elapsed="0.085392"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.205840" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.205434" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:03.206621" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:03.206372" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:03.206788" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:03.206036" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.207357" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.206978" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:03.207701" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:03.207883" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:03.207564" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.208326" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.208072" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:03.208774" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.208473" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.209302" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.209008" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.208857" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.208434" elapsed="0.000964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.210350" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.209566" elapsed="0.000814"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:03.210430" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:03.204807" elapsed="0.005773"/>
</kw>
<msg time="2026-05-01T00:50:03.210637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.191931" elapsed="0.018753"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.224701" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.237386" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.250138" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.250352" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.250604" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.250978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.250828" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:03.250814" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.251204" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.251377" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.251574" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:03.250785" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.250682" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.251806" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.251881" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:03.252016" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:03.189204" elapsed="0.062840"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:03.253336" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:03.253078" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:03.253507" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:03.252734" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.253854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.253604" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.254408" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.254118" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.253934" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.253586" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.256897" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.254668" elapsed="0.002255"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:03.256974" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:03.257127" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:03.252383" elapsed="0.004769"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.258765" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.258316" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.259205" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.258972" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.259754" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.259509" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.260189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.259952" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:03.261064" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:50:03.260866" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:50:03.261481" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:50:03.261256" elapsed="0.000253"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.261670" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.262280" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.262034" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:50:03.262365" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.262539" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:50:03.260441" elapsed="0.002124"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:03.283798" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1079', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:50:03.283892" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:50:03 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:03.284145" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:03.264931" elapsed="0.019251"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.262636" elapsed="0.021610"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.284536" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.284282" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.262618" elapsed="0.022049"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.289527" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.286107" elapsed="0.003482"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.285795" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.285769" elapsed="0.003905"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.293371" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.290068" elapsed="0.003368"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.289752" elapsed="0.003751"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.289729" elapsed="0.003810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.294298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.293775" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.294839" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.294433" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.295635" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.295193" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.294956" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.294408" elapsed="0.001344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.296515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.295988" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.296986" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.296651" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.297805" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.297370" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.297098" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.296626" elapsed="0.001296"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.298136" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:03.299258" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.298872" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.299536" elapsed="0.002964"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:03.285271" elapsed="0.017293"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:03.302743" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.302637" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.302619" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.302984" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.303052" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:03.305376" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:03.257523" elapsed="0.047880"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:03.305482" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.305638" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:03.082425" elapsed="0.223237"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.306002" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.305759" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.305742" elapsed="0.000351"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:03.306127" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:50:03.077739" elapsed="0.228511"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.307534" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.307125" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.307108" elapsed="0.000512"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.307770" elapsed="0.000353"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.313482" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.313012" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:03.313730" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.313587" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.313568" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.313967" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.314143" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.314320" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.314506" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.314679" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.314849" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.315015" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:03.312699" elapsed="0.002393"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.306917" elapsed="0.008225"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:03.306550" elapsed="0.008633"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:02.953054" elapsed="0.362167"/>
</test>
<test id="s1-s11-t2" name="TC1_Check_Example_Bgp_Rib_Is_Empty" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:03.318639" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:03.318346" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.319906" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.319797" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.319778" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.325021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.324915" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.324897" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.326126" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.325750" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.326626" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:03.326317" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:03.326697" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:03.326853" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:03.325356" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.332718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.332608" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.332588" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.334064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.333956" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.333938" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:03.334602" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.334283" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.335073" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.334845" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.364104" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:03.335643" elapsed="0.028616"/>
</kw>
<msg time="2026-05-01T00:50:03.364483" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:03.364535" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.335265" elapsed="0.029309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.388080" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:03.365195" elapsed="0.022995"/>
</kw>
<msg time="2026-05-01T00:50:03.388352" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:03.388399" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.364779" elapsed="0.023658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.388926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.388559" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.388532" elapsed="0.000476"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.389521" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.389191" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.389882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.389660" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.389642" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:03.389997" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.392730" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:50:03.392942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.391571" elapsed="0.001547"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.393404" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.393783" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:03.390897" elapsed="0.003076"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:03.390314" elapsed="0.003724"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:03.333649" elapsed="0.060487"/>
</kw>
<msg time="2026-05-01T00:50:03.394230" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.394276" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.332947" elapsed="0.061369"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:03.394525" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.394394" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.394376" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.395030" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.395409" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.395545" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:03.332249" elapsed="0.063411"/>
</kw>
<msg time="2026-05-01T00:50:03.395754" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.395804" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.327251" elapsed="0.068591"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.396178" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.395921" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.395903" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:03.327103" elapsed="0.069179"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:03.326931" elapsed="0.069387"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:03.324555" elapsed="0.071837"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:03.319499" elapsed="0.076983"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.319054" elapsed="0.077479"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:03.316127" elapsed="0.080465"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:03.405178" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:03.407337" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:03.407651" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:03.397326" elapsed="0.010372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.411410" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.407941" elapsed="0.003557"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.415097" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.411731" elapsed="0.003523"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:03.415433" elapsed="0.002963"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>${JSONKEYSTR}</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:03.396865" elapsed="0.021617"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.419778" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.419368" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.419348" elapsed="0.000519"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.420026" elapsed="0.000324"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.425596" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:03.425169" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:03.425846" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.425701" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.425682" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426094" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426273" elapsed="0.000022"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426466" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426644" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426816" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.426987" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.427156" elapsed="0.000019"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:03.424806" elapsed="0.002427"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:03.419144" elapsed="0.008141"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:03.418767" elapsed="0.008572"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:03.315587" elapsed="0.111792"/>
</test>
<test id="s1-s11-t3" name="TC1_Connect_BGP_Peer" line="78">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:03.430825" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:03.430557" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.432152" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.432020" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.431996" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.437925" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.437815" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.437797" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.439039" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.438653" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.439561" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:03.439233" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:03.439633" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:03.439792" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:03.438250" elapsed="0.001607"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.446189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.446078" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.446059" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.447442" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.447332" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.447311" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:03.448012" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.447696" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.448420" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.448204" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.480393" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:03.449022" elapsed="0.031493"/>
</kw>
<msg time="2026-05-01T00:50:03.480702" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:03.480748" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.448632" elapsed="0.032152"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.504227" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:03.481348" elapsed="0.022988"/>
</kw>
<msg time="2026-05-01T00:50:03.504518" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:03.504564" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.480990" elapsed="0.023611"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.504936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.504680" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.504660" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.505489" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.505164" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.505845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.505625" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.505607" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:03.505960" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.508493" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:50:03.508700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.507404" elapsed="0.001426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.509123" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.509644" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:03.506785" elapsed="0.003051"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:03.506232" elapsed="0.003668"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:03.447022" elapsed="0.062975"/>
</kw>
<msg time="2026-05-01T00:50:03.510123" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.510168" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.446421" elapsed="0.063785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:03.510390" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.510282" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.510264" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.510902" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.511245" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.511318" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:03.445731" elapsed="0.065694"/>
</kw>
<msg time="2026-05-01T00:50:03.511534" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.511578" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.440251" elapsed="0.071364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.511943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.511690" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.511673" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:03.440099" elapsed="0.071944"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:03.439919" elapsed="0.072153"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:03.437429" elapsed="0.074697"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:03.431712" elapsed="0.080468"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.431244" elapsed="0.080979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:03.428305" elapsed="0.083969"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.519645" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.519537" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.519519" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.520716" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:03.520321" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.521215" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:03.520922" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:03.521285" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:03.521439" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:03.519942" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.527039" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.526934" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.526916" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.528197" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:03.528092" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.528075" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:03.528643" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:03.528412" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.529047" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.528828" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.572495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "E "r "r "o "r "[C "= "[C "W "E "L "L "_ "K "N "O "W "N "_ "A "T "T "R "_ "M "I "S "S "I "N "G "[78C[C "[A[78Ci</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:03.529596" elapsed="0.042998"/>
</kw>
<msg time="2026-05-01T00:50:03.572711" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:03.572758" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "E "r "r "o "r "[C "= "[C "W "E "L "L "_ "K "N "O "W "N "_ "A "T "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.529236" elapsed="0.043578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.658592" level="INFO">"s "[C "E "X "P "E "C "T "E "D "[C "i "n "[C "t "h "i "s "[C "t "e "s "t "[C "c "a "s "e ", "[C "a "n "d "[C "s "h "o "u "l "d "[C "b "e "[C "t "h "r "o "w "n "[C "w "h "e "n "[C "m "i "s "s "i "n "g "[C "m "a "n "d "a "t "o "r "y "[C "a "t "t "r "[78Ci "[A[78Cb
 "u "t "e "s ". "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:03.573390" elapsed="0.085301"/>
</kw>
<msg time="2026-05-01T00:50:03.658795" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:03.658841" level="INFO">${message_wait} =  "s "[C "E "X "P "E "C "T "E "D "[C "i "n "[C "t "h "i "s "[C "t "e "s "t "[C "c "a "s "e ", "[C "a "n "d "[C "s "h "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.573013" elapsed="0.085864"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.659212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.658965" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.658940" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.659724" level="INFO"> "s "[C "E "X "P "E "C "T "E "D "[C "i "n "[C "t "h "i "s "[C "t "e "s "t "[C "c "a "s "e ", "[C "a "n "d "[C "s "h "o "u "l "d "[C "b "e "[C "t "h "r "o "w "n "[C "w "h "e "n "[C "m "i "s "s "i "n "g "[C "m "a "n "d "a "t "o "r "y "[C "a "t "t "r "[78Ci "[A[78Cb
 "u "t "e "s ". "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.659445" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.660105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.659884" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.659866" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:03.660219" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:03.662034" elapsed="0.000209"/>
</kw>
<msg time="2026-05-01T00:50:03.662393" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:03.661502" elapsed="0.000991"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.662673" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.662841" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:03.661111" elapsed="0.001812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:03.660554" elapsed="0.002415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:03.527796" elapsed="0.135272"/>
</kw>
<msg time="2026-05-01T00:50:03.663160" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.663204" level="INFO">${message} =  "s "[C "E "X "P "E "C "T "E "D "[C "i "n "[C "t "h "i "s "[C "t "e "s "t "[C "c "a "s "e ", "[C "a "n "d "[C "s "h "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.527268" elapsed="0.135973"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:03.663423" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:50:03.663316" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.663298" elapsed="0.000260"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.663967" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.664306" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:03.664428" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:03.526601" elapsed="0.137961"/>
</kw>
<msg time="2026-05-01T00:50:03.664697" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:03.664746" level="INFO">${output} =  "s "[C "E "X "P "E "C "T "E "D "[C "i "n "[C "t "h "i "s "[C "t "e "s "t "[C "c "a "s "e ", "[C "a "n "d "[C "s "h "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.521847" elapsed="0.142936"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:03.665116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:03.664861" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:03.664843" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:03.521701" elapsed="0.143516"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:03.521530" elapsed="0.143718"/>
</for>
<arg>Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes.</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:03.517410" elapsed="0.147895"/>
</kw>
<arg>KarafKeywords.Log_Message_To_Controller_Karaf</arg>
<arg>Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes.</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:03.512439" elapsed="0.152913"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.674197" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:03.673870" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.674648" level="INFO">python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.674386" elapsed="0.000309"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:03.678885" level="INFO">python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<msg time="2026-05-01T00:50:03.678980" level="INFO">${output} =  python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:03.674851" elapsed="0.004156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:03.679416" level="INFO"> python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:03.679172" elapsed="0.000307"/>
</kw>
<arg>${BGP_PEER_COMMAND} ${SKIP_PARAMS}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:50:03.673441" elapsed="0.006095"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:50:13.681835" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:50:03.681158" elapsed="10.001525">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.683058" elapsed="0.000045"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:50:03.680879" elapsed="10.002402">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:50:03.680441" elapsed="10.002986"/>
</kw>
<msg time="2026-05-01T00:50:13.683565" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:03.680079" elapsed="10.003513"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:50:13.683794" elapsed="0.000357"/>
</return>
<status status="PASS" start="2026-05-01T00:50:13.683696" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.683670" elapsed="0.000544"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.684482" elapsed="0.000029"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.684667" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:50:03.679796" elapsed="10.004953"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.686205" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:13.685797" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.685779" elapsed="0.000514"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:13.686455" elapsed="0.000399"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.692104" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:13.691667" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:13.692350" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:13.692206" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.692188" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.692610" elapsed="0.000023"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.692791" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.692968" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.693144" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.693313" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.693504" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.693681" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:13.691310" elapsed="0.002448"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:13.685476" elapsed="0.008331"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:13.685033" elapsed="0.008816"/>
</kw>
<doc>Connect BGP peer with advertising the routes without mandatory params like LOC_PREF.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:03.427711" elapsed="10.266175"/>
</test>
<test id="s1-s11-t4" name="TC1_Check_Example_Bgp_Rib" line="87">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:13.697339" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:13.697072" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.698638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:13.698527" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.698507" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.704203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:13.704090" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.704072" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.705300" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:13.704909" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.705812" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:13.705513" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:13.705883" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:13.706039" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:13.704527" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.711780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:13.711652" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.711633" elapsed="0.000254"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.713087" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:13.712980" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.712962" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:13.713639" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:13.713308" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:13.714056" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:13.713835" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:13.866784" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:13.714614" elapsed="0.152298"/>
</kw>
<msg time="2026-05-01T00:50:13.867091" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:13.867139" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.714251" elapsed="0.152924"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:13.888134" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:13.867770" elapsed="0.020467"/>
</kw>
<msg time="2026-05-01T00:50:13.888397" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:13.888442" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.867369" elapsed="0.021135"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.888827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:13.888587" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.888565" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.889360" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:13.889060" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.889735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:13.889513" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.889494" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:13.889847" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:13.892402" elapsed="0.000165"/>
</kw>
<msg time="2026-05-01T00:50:13.892628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:13.891372" elapsed="0.001389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.893047" elapsed="0.000240"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.893585" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:13.890699" elapsed="0.003073"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:13.890141" elapsed="0.003695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:13.712679" elapsed="0.181255"/>
</kw>
<msg time="2026-05-01T00:50:13.894028" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:13.894071" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.712045" elapsed="0.182066"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:13.894295" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:13.894188" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.894169" elapsed="0.000255"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.894860" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.895225" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.895298" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:13.711296" elapsed="0.184110"/>
</kw>
<msg time="2026-05-01T00:50:13.895521" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:13.895566" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.706449" elapsed="0.189154"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:13.895937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:13.895679" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.895661" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:13.706297" elapsed="0.189740"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:13.706120" elapsed="0.189948"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:13.703723" elapsed="0.192401"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:13.698219" elapsed="0.197960"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.697784" elapsed="0.198439"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:13.694819" elapsed="0.201473"/>
</kw>
<kw name="Verify_Keyword_Does_Not_Fail_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Confirm_Keyword_Fails_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:13.907245" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:13.907801" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:13.908085" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:13.900940" elapsed="0.007217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.911401" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:13.908418" elapsed="0.003066"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.916017" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:13.911718" elapsed="0.004540"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:13.916605" elapsed="0.004527"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:13.900537" elapsed="0.020764"/>
</kw>
<msg time="2026-05-01T00:50:13.921398" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:13.921442" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.900078" elapsed="0.021405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:13.921672" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:13.921560" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:13.921540" elapsed="0.000201"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.922202" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:13.921892" elapsed="0.000336"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:13.922732" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:13.922387" elapsed="0.000413">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:13.899741" elapsed="0.023165">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:14.934945" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:14.935764" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:14.936165" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:14.925920" elapsed="0.010332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:14.940459" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:14.936637" elapsed="0.003929"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:14.944686" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:14.940857" elapsed="0.004013"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:14.945177" elapsed="0.004245"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:14.925320" elapsed="0.024327"/>
</kw>
<msg time="2026-05-01T00:50:14.949761" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:14.949808" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:14.924537" elapsed="0.025295"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:14.950063" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:14.949927" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:14.949898" elapsed="0.000245"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:14.950643" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:14.950301" elapsed="0.000370"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:14.951279" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:14.950855" elapsed="0.000505">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:14.923758" elapsed="0.027738">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:15.966543" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:15.967065" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:15.967406" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:15.955812" elapsed="0.011688"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:15.974303" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:15.967832" elapsed="0.006579"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:15.979207" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:15.974818" elapsed="0.004606"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:15.979684" elapsed="0.003592"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:15.954766" elapsed="0.028724"/>
</kw>
<msg time="2026-05-01T00:50:15.983602" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:15.983647" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:15.953637" elapsed="0.030032"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:15.983894" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:15.983764" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:15.983735" elapsed="0.000237"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:15.984451" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:15.984129" elapsed="0.000363"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:15.984969" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:15.984654" elapsed="0.000384">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:15.952584" elapsed="0.032567">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:17.000049" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:17.000557" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:17.000896" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:16.989538" elapsed="0.011430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:17.004144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:17.001237" elapsed="0.003001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:17.008968" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:17.004587" elapsed="0.004620"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:17.009554" elapsed="0.004323"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:16.988547" elapsed="0.025501"/>
</kw>
<msg time="2026-05-01T00:50:17.014150" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:17.014196" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:16.987360" elapsed="0.026859"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:17.014427" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:17.014305" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:17.014281" elapsed="0.000275"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:17.015042" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:17.014725" elapsed="0.000344"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:17.015602" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:17.015233" elapsed="0.000439">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:16.986271" elapsed="0.029511">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:18.029734" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:18.030412" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:18.030863" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:18.020095" elapsed="0.010870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:18.035940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:18.031349" elapsed="0.004687"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:18.041895" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:18.036383" elapsed="0.005754"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:18.042488" elapsed="0.004142"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:18.018983" elapsed="0.027830"/>
</kw>
<msg time="2026-05-01T00:50:18.046919" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:18.046964" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:18.017820" elapsed="0.029167"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:18.047213" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:18.047082" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:18.047054" elapsed="0.000241"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:18.047815" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:18.047456" elapsed="0.000386"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:18.048347" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:18.048001" elapsed="0.000438">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:18.016784" elapsed="0.031794">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:19.063092" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:19.063821" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:19.064265" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:19.052962" elapsed="0.011411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:19.069093" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:19.064815" elapsed="0.004373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:19.073246" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:19.069555" elapsed="0.003863"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:19.073674" elapsed="0.003568"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:19.051934" elapsed="0.025485"/>
</kw>
<msg time="2026-05-01T00:50:19.077542" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:19.077587" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:19.050716" elapsed="0.026894"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:19.077838" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:19.077708" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:19.077679" elapsed="0.000240"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:19.078427" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:19.078076" elapsed="0.000378"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:19.078999" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:19.078677" elapsed="0.000397">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:19.049621" elapsed="0.029569">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:20.094708" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:20.095365" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:20.095845" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:20.083873" elapsed="0.012075"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:20.100594" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:20.096322" elapsed="0.004363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:20.105129" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:20.101007" elapsed="0.004321"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:20.105576" elapsed="0.003525"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:20.082732" elapsed="0.026538"/>
</kw>
<msg time="2026-05-01T00:50:20.109369" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:20.109412" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:20.081373" elapsed="0.028062"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:20.109661" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:20.109537" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:20.109512" elapsed="0.000225"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:20.110199" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:20.109889" elapsed="0.000336"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:20.110717" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:20.110380" elapsed="0.000408">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:20.080301" elapsed="0.030596">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:21.125700" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:21.126768" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:21.127708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:21.115385" elapsed="0.012491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:21.134326" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:21.128744" elapsed="0.005652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:21.137896" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:21.134682" elapsed="0.003432"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:21.138356" elapsed="0.003634"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:21.114387" elapsed="0.027782"/>
</kw>
<msg time="2026-05-01T00:50:21.142273" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:21.142318" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:21.113175" elapsed="0.029165"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:21.142583" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:21.142434" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:21.142405" elapsed="0.000258"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:21.143149" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:21.142821" elapsed="0.000355"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:21.143709" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:21.143341" elapsed="0.000442">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:21.112046" elapsed="0.031853">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:22.158975" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:22.159737" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:22.160176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:22.148715" elapsed="0.011567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:22.165061" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:22.160687" elapsed="0.004470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:22.169766" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:22.165528" elapsed="0.004407"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:22.170169" elapsed="0.003610"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:22.147594" elapsed="0.026361"/>
</kw>
<msg time="2026-05-01T00:50:22.174053" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:22.174097" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:22.146045" elapsed="0.028074"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:22.174332" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:22.174205" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:22.174181" elapsed="0.000228"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:22.174890" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:22.174578" elapsed="0.000338"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:22.175384" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:22.175071" elapsed="0.000415">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:22.144882" elapsed="0.030717">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:23.190402" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:23.190940" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:23.191263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:23.181092" elapsed="0.010249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:23.194682" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:23.191642" elapsed="0.003137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:23.199671" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:23.195105" elapsed="0.004799"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:23.200227" elapsed="0.004214"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:23.179737" elapsed="0.024897"/>
</kw>
<msg time="2026-05-01T00:50:23.204734" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:23.204778" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:23.178140" elapsed="0.026661"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:23.205016" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:23.204890" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:23.204863" elapsed="0.000232"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:23.205622" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:23.205249" elapsed="0.000400"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:23.206178" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:23.205807" elapsed="0.000468">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:23.176722" elapsed="0.029675">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:24.221281" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:24.221789" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:24.222100" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:24.210635" elapsed="0.011537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.225993" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:24.222442" elapsed="0.003644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.230850" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:24.226417" elapsed="0.004666"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:24.231404" elapsed="0.003858"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:24.209639" elapsed="0.025858"/>
</kw>
<msg time="2026-05-01T00:50:24.235622" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:24.235668" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.208442" elapsed="0.027248"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.235899" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:24.235776" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.235750" elapsed="0.000227"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.236449" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:24.236131" elapsed="0.000362"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.236967" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:50:24.236653" elapsed="0.000385">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:50:24.207380" elapsed="0.029767">None</status>
</kw>
<msg time="2026-05-01T00:50:24.237232" level="FAIL">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:50:13.899011" elapsed="10.338313">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:50:24.237376" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:50:13.898637" elapsed="10.338789"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>BgpOperations.Check_Example_Bgp_Rib_Does_Not_Contain</arg>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Some Keywords need several tries to finally fail, this keyword passes if and only if the failure ultimately happens.</doc>
<status status="FAIL" start="2026-05-01T00:50:13.898278" elapsed="10.339263">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:50:24.237652" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:50:24.237695" level="INFO">${output} = Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:13.897862" elapsed="10.339856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:50:24.237901" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:50:24.237790" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.237772" elapsed="0.000213"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.238135" elapsed="0.000022"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.238307" elapsed="0.000020"/>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T00:50:13.897452" elapsed="10.340971"/>
</kw>
<msg time="2026-05-01T00:50:24.238503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:13.896989" elapsed="10.341560"/>
</kw>
<arg>${DEFAULT_RIB_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_RIB_CHECK_PERIOD}</arg>
<arg>BgpOperations.Check_Example_Bgp_Rib_Does_Not_Contain</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${JSONKEYSTR}</arg>
<doc>Some positive checks report false success for a short time. This keyword verifies no failure does happen within timeout period.
This implementation needs more complicated logic than, Verify_Keyword_Never_Passes_Within_Timeout,
so use that keyword in case you have a negative check handy.</doc>
<status status="PASS" start="2026-05-01T00:50:13.896529" elapsed="10.342096"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.239967" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:24.239535" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.239517" elapsed="0.000536"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:24.240205" elapsed="0.000335"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.246257" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:24.245777" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:24.246615" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:50:24.246430" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.246407" elapsed="0.000301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.246892" elapsed="0.000025"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.247103" elapsed="0.000023"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.247341" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.247574" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.247822" elapsed="0.000024"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.248023" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.248216" elapsed="0.000023"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:24.245390" elapsed="0.002910"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:24.239303" elapsed="0.009053"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:24.238923" elapsed="0.009478"/>
</kw>
<doc>Check RIB for not containig linkstate-route(s), because update messages were not good.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:13.694147" elapsed="10.554299"/>
</test>
<test id="s1-s11-t5" name="TC1_Disconnect_BGP_Peer" line="97">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:24.252353" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:24.252081" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.253646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:24.253534" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.253516" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.258875" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:24.258769" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.258751" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.260113" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:24.259727" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.260627" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:24.260308" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:24.260699" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:24.260857" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:24.259177" elapsed="0.001705"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.266570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:24.266442" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.266423" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.267871" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:24.267718" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.267700" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:24.268395" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:24.268093" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:24.268831" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:24.268610" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:24.299720" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:24.269408" elapsed="0.030427"/>
</kw>
<msg time="2026-05-01T00:50:24.300014" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:24.300061" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.269020" elapsed="0.031078"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:24.321519" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:24.300651" elapsed="0.020991"/>
</kw>
<msg time="2026-05-01T00:50:24.321821" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:24.321871" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.300275" elapsed="0.021634"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.322268" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:24.322003" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.321976" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.322869" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:24.322532" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.323241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:24.323012" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.322992" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:24.323365" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:24.326134" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:50:24.326351" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:24.325007" elapsed="0.001499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.326793" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.327131" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:24.324334" elapsed="0.002988"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:24.323712" elapsed="0.003679"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:24.267383" elapsed="0.060133"/>
</kw>
<msg time="2026-05-01T00:50:24.327612" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:24.327657" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.266799" elapsed="0.060897"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:24.327885" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:24.327774" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.327755" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.328423" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.328797" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:24.328870" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:24.266098" elapsed="0.062885"/>
</kw>
<msg time="2026-05-01T00:50:24.329080" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:24.329125" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.261271" elapsed="0.067943"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:24.329576" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:24.329294" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:24.329277" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:24.261120" elapsed="0.068560"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:24.260941" elapsed="0.068772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:24.258393" elapsed="0.071377"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:24.253229" elapsed="0.076598"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:24.252797" elapsed="0.077076"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:24.249390" elapsed="0.080537"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:24.331115" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:24.330788" elapsed="0.000354"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:24.331303" elapsed="0.000316"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:50:24.330505" elapsed="0.001186"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.333583" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:50:26.333912" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:50:24.331847" elapsed="2.002129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.335161" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.334442" elapsed="0.000823"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:50:24.330154" elapsed="2.005245"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.351296" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-05-01T00:50:26.365587" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:26.365806" level="INFO">${output_log} = 2026-05-01 00:50:03,757 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:50:03,758 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:50:03,758 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:26.351151" elapsed="0.014716"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.366872" level="INFO">2026-05-01 00:50:03,757 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:50:03,758 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:50:03,758 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:50:03,758 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:50:03,758 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:50:03,759 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:50:03,762 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:50:03,763 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:50:03,763 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010440040047020641040000fbf0
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010440040047020641040000fbf0'
2026-05-01 00:50:03,764 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010440040047020641040000fbf0
2026-05-01 00:50:03,765 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:50:03,765 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:03,766 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:50:03,766 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Length=60 (0x003c)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=37 (0x0025)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x800e2240044704c00002010000050015070000000000000001010203040001000105060708)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):     MP_REACH_NLRI: {'Identifier': 1, 'TunnelID': 1, 'LSPID': 1, 'IPv4TunnelSenderAddress': IPv4Address('1.2.3.4'), 'IPv4TunnelEndPointAddress': IPv4Address('5.6.7.8')}
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:50:03,767 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003c0200000025800e2240044704c00002010000050015070000000000000001010203040001000105060708
2026-05-01 00:50:03,767 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0012254714965820312s
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:03,768 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   Length=23 (0x0017)
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:50:03,769 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:50:03,769 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:50:03,769 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:50:03,769 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:50:03,774 INFO BGP-Thread-1 (job): ... idle for 0.005s
2026-05-01 00:50:03,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.005s
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:50:03,774 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0006' (6)
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'800f03400447'
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Attribute value=0xb'400447'
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'4004'
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'47'
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb''
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: []
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:50:03,775 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:50:03,776 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:50:03,988 INFO BGP-Thread-1 (job): NOTIFICATION message received: 0xffffffffffffffffffffffffffffffff0015030301
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.366253" elapsed="0.001100"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.369137" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc1_bgp_peer.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:50:26.367831" elapsed="0.001435"/>
</kw>
<arg>${BGP_PEER_LOG_FILE}</arg>
<arg>tc1_${BGP_PEER_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.350717" elapsed="0.018774"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.372145" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.371124" elapsed="0.001116"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.371093" elapsed="0.001187"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.372541" elapsed="0.000497"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.380090" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.379647" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:26.380345" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.380197" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.380178" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.380612" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.380792" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.380971" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.381145" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.381316" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.381538" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.381719" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.379309" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.370805" elapsed="0.011044"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:26.370125" elapsed="0.011767"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:24.248834" elapsed="2.133099"/>
</test>
<test id="s1-s11-t6" name="TC1_Deconfigure_iBGP_Peer" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:26.385387" elapsed="0.000268"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:26.385120" elapsed="0.000590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.386758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.386621" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.386596" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.391944" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.391830" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.391813" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.393048" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.392654" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.393589" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:26.393243" elapsed="0.000373"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:26.393716" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:26.393880" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.392246" elapsed="0.001660"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.399776" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.399665" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.399645" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.401049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.400942" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.400924" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:26.401628" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.401271" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.402042" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:26.401821" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.432285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:26.402602" elapsed="0.029880"/>
</kw>
<msg time="2026-05-01T00:50:26.432689" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:26.432736" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.402235" elapsed="0.030538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.452817" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:26.433414" elapsed="0.019520"/>
</kw>
<msg time="2026-05-01T00:50:26.453099" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:26.453145" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.433000" elapsed="0.020182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.453563" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.453274" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.453248" elapsed="0.000400"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.454147" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.453827" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.454529" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.454285" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.454267" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:26.454647" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:26.457400" elapsed="0.000170"/>
</kw>
<msg time="2026-05-01T00:50:26.457632" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.456236" elapsed="0.001567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.458098" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.458438" elapsed="0.000098"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:26.455570" elapsed="0.003078"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:26.454985" elapsed="0.003729"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:26.400639" elapsed="0.058240"/>
</kw>
<msg time="2026-05-01T00:50:26.458975" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:26.459020" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.400007" elapsed="0.059049"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:26.459242" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.459134" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.459116" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.459776" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.460126" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.460198" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:26.399298" elapsed="0.061010"/>
</kw>
<msg time="2026-05-01T00:50:26.460406" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:26.460470" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "1 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.394290" elapsed="0.066220"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.460843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.460588" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.460571" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:26.394139" elapsed="0.066805"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:26.393962" elapsed="0.067017"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:26.391443" elapsed="0.069595"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:26.386304" elapsed="0.074791"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.385868" elapsed="0.075279"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:26.382895" elapsed="0.078307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.461994" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.461383" elapsed="0.000641"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.506510" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.506101" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.507326" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:26.507059" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:26.507523" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:26.506719" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.508105" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.507720" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.508446" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:26.508692" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.508306" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.509130" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.508883" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.510197" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.509921" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.510695" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.510410" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.511389" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.511093" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.512195" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.511964" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.512273" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:50:26.512433" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.511628" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.512636" elapsed="0.000242"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:50:26.510950" elapsed="0.001968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.513485" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.513172" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.514431" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.514063" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.514523" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.514686" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.513701" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.514872" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:50:26.513032" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.515700" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.515385" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.516439" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.516233" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.516531" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.516682" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.515915" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.516861" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:26.515247" elapsed="0.001874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.517688" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.517376" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.518474" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.518250" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.518549" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.518699" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.517905" elapsed="0.000819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.518883" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:26.517239" elapsed="0.001964"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:26.510773" elapsed="0.008468"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:26.519284" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:26.519444" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:26.509591" elapsed="0.009896"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.509253" elapsed="0.010267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.519703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.519546" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.509230" elapsed="0.010549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.520574" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.519926" elapsed="0.000677"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.520651" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.505416" elapsed="0.015361"/>
</kw>
<msg time="2026-05-01T00:50:26.520831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.492279" elapsed="0.028601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.533657" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.546383" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.559093" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.559315" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.559515" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.559916" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.559764" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:26.559748" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.560149" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.560319" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.560504" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:26.559711" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.559596" elapsed="0.001042"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.560796" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.560875" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:50:26.561023" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:26.487781" elapsed="0.073270"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.562284" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.561966" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:26.572666" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:26.572737" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:26.572874" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:26.564760" elapsed="0.008153"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.562415" elapsed="0.010558"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.573247" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.573013" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.562397" elapsed="0.010973"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.578662" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.575008" elapsed="0.003718"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.574675" elapsed="0.004102"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.574648" elapsed="0.004166"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.582768" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.579227" elapsed="0.003610"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.578897" elapsed="0.003990"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.578873" elapsed="0.004051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.583787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.583192" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.584296" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.583931" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.585137" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.584694" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.584415" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.583905" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.586068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.585531" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.586653" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.586210" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.587439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.587020" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.586772" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.586184" elapsed="0.001420"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.587765" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:26.588600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.588284" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.588785" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:26.574005" elapsed="0.017273"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:26.591327" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:50:26.593649" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:50:26.561330" elapsed="0.032346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.593731" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:50:26.462267" elapsed="0.131591"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.595201" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.594806" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.594788" elapsed="0.000500"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.595438" elapsed="0.000328"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.602372" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.601906" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:26.602651" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.602503" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.602483" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.602895" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603074" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603256" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603430" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603622" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603793" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.603961" elapsed="0.000019"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.601582" elapsed="0.002457"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.594586" elapsed="0.009503"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:26.594152" elapsed="0.009978"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:50:26.382301" elapsed="0.221870"/>
</test>
<test id="s1-s11-t7" name="TC2_Configure_iBGP_Peer" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:26.607647" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:26.607304" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.608932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.608821" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.608802" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.614082" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.613974" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.613957" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.615189" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.614803" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.615697" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:26.615382" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:26.615766" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:50:26.615925" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.614407" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.668383" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.668244" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.668219" elapsed="0.000274"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.669816" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.669708" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.669691" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:26.670357" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.670038" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.670804" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:26.670568" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.702858" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:26.671336" elapsed="0.031629"/>
</kw>
<msg time="2026-05-01T00:50:26.703128" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:26.703174" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.670995" elapsed="0.032216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.727101" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:26.703762" elapsed="0.023443"/>
</kw>
<msg time="2026-05-01T00:50:26.727362" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:26.727408" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.703387" elapsed="0.024058"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.727782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.727549" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.727529" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.728309" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.728008" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.728696" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.728470" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.728429" elapsed="0.000413"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:26.728878" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:26.731563" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:50:26.731772" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.730354" elapsed="0.001549"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.732183" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.732552" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:26.729733" elapsed="0.003009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:26.729170" elapsed="0.003636"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:26.669378" elapsed="0.063524"/>
</kw>
<msg time="2026-05-01T00:50:26.732994" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:26.733038" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.668689" elapsed="0.064387"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:26.733260" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.733154" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.733135" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.733768" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.734109" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.734179" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:26.667764" elapsed="0.066526"/>
</kw>
<msg time="2026-05-01T00:50:26.734383" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:26.734427" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.616336" elapsed="0.118149"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.734816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.734564" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.734547" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:26.616187" elapsed="0.118754"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:26.616008" elapsed="0.118968"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:26.613615" elapsed="0.121417"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:26.608530" elapsed="0.126558"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.608077" elapsed="0.127055"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:26.605080" elapsed="0.130104"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.736126" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENC...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.735360" elapsed="0.000795"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.770532" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.770139" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.771380" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:26.771138" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:26.771567" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:26.770765" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.772139" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.771759" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.772486" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:26.772655" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.772330" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.773081" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.772842" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.774101" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.773837" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.774586" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.774310" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.775296" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.774981" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.776078" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.775859" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.776153" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.776304" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.775538" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.776501" elapsed="0.000238"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:50:26.774842" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.777484" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.777029" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.778321" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.778108" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.778397" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.778573" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.777706" elapsed="0.000893"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.778756" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:50:26.776892" elapsed="0.002130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.779629" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.779313" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.780375" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.780167" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.780501" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:26.780657" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.779846" elapsed="0.000836"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.780837" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:26.779175" elapsed="0.001926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.781669" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.781352" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.782415" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.782207" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.782508" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.782660" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.781885" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.782842" elapsed="0.000239"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:50:26.781215" elapsed="0.001907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.783697" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.783383" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.784440" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.784234" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.784533" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.784685" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.783915" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.784865" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:50:26.783245" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.785694" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.785378" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.786437" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.786230" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.786530" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.786679" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.785911" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.786857" elapsed="0.000263"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:50:26.785240" elapsed="0.001923"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.787723" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.787412" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.788659" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.788427" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.788734" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.788885" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.787937" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.789064" elapsed="0.000217"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:26.787275" elapsed="0.002047"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.789883" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.789588" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.790638" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.790413" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.790746" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.790898" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.790097" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.791098" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:50:26.789434" elapsed="0.001924"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.791920" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:26.791627" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:26.792679" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.792468" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:26.792753" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:26.792902" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:26.792135" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.793083" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:26.791490" elapsed="0.001852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:26.774662" elapsed="0.018714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:26.793419" elapsed="0.000056"/>
</return>
<msg time="2026-05-01T00:50:26.793611" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:26.773510" elapsed="0.020128"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.773194" elapsed="0.020475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.793846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.793693" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.773176" elapsed="0.020745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.794831" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.794067" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.794910" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.769504" elapsed="0.025531"/>
</kw>
<msg time="2026-05-01T00:50:26.795122" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.756589" elapsed="0.038583"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.807973" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.820847" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.833705" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.833935" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.834115" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.834497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.834333" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:26.834319" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.834724" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.834897" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.835067" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:26.834290" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.834188" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.835327" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.835405" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:26.835542" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:26.752203" elapsed="0.083366"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.862681" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.862289" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.863487" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:26.863217" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:26.863661" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:26.862878" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.864240" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.863855" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.864583" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:26.864715" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.864430" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.865145" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.864902" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:26.865619" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.865304" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.866154" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.865855" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.865703" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.865286" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.867158" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.866388" elapsed="0.000800"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.867238" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.861667" elapsed="0.005730"/>
</kw>
<msg time="2026-05-01T00:50:26.867476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.848513" elapsed="0.019013"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.880400" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.893409" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.906076" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.906277" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.906474" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.906849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.906699" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:26.906685" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.907076" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.907249" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.907420" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:26.906656" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.906551" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.907729" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.907807" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:26.907942" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:26.845760" elapsed="0.062211"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:26.909238" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:26.909005" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:26.909393" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:26.908658" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.909758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.909507" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.910305" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.910018" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.909840" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.909488" elapsed="0.000899"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.912837" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.910558" elapsed="0.002306"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:26.912916" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.913070" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:26.908311" elapsed="0.004784"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.914486" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.914224" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.914936" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.914699" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.915391" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.915148" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.915888" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.915645" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:26.916755" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:50:26.916560" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:50:26.917107" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:50:26.916936" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.917319" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.917941" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.917696" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:50:26.918027" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:26.918181" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:50:26.916138" elapsed="0.002068"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:26.930775" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Content-Length': '1079', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
            &lt;connect-retry&gt;5&lt;/connect-retry&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:50:26.930842" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:26.930950" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:26.920732" elapsed="0.010243"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.918276" elapsed="0.012745"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.931208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.931048" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.918259" elapsed="0.013038"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.937707" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.932300" elapsed="0.005504"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.932076" elapsed="0.005806"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.932057" elapsed="0.005880"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.942007" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:26.938595" elapsed="0.003458"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.938061" elapsed="0.004026"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.938025" elapsed="0.004087"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.942675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.942281" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.943013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.942773" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.943578" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.943260" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.943094" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.942755" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.944203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.943846" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.944558" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.944298" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.945142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:26.944848" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.944676" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.944281" elapsed="0.000944"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.945379" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:26.946190" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.945912" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.946376" elapsed="0.002435"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:26.931718" elapsed="0.017155"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:26.949047" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.948942" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.948922" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.949287" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.949355" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:50:26.951736" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:26.913425" elapsed="0.038339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.951828" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:26.951981" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:26.741142" elapsed="0.210864"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.952343" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.952103" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.952087" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:26.952488" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:50:26.736433" elapsed="0.216180"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.953872" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:26.953485" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.953453" elapsed="0.000504"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:26.954107" elapsed="0.000311"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.959778" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:26.959335" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:26.960027" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:26.959884" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.959867" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.960265" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.960442" elapsed="0.000038"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.960642" elapsed="0.000055"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.960856" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.961030" elapsed="0.000021"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.961203" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:26.961372" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:26.959025" elapsed="0.002427"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:26.953259" elapsed="0.008260"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:26.952893" elapsed="0.008668"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:50:26.604537" elapsed="0.357062"/>
</test>
<test id="s1-s11-t8" name="TC2_Check_Example_Bgp_Rib_Is_Empty" line="132">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:26.964985" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:26.964716" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.966255" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.966146" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.966128" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.971442" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.971331" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.971313" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.972587" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:26.972183" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:26.973080" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:26.972783" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:26.973152" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:26.973309" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:26.971798" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.979156" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.979047" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.979028" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:26.980446" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:26.980334" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:26.980316" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:26.980993" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:26.980693" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:26.981404" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:26.981187" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.010679" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:26.981959" elapsed="0.028821"/>
</kw>
<msg time="2026-05-01T00:50:27.010941" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:27.010988" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.981616" elapsed="0.029408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.034595" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:27.011656" elapsed="0.023047"/>
</kw>
<msg time="2026-05-01T00:50:27.034863" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:27.034910" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.011247" elapsed="0.023700"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.035251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.035025" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.035005" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.035797" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "_ "I "s "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.035502" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.036185" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.035933" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.035916" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:27.036297" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:27.038819" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:50:27.039023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:27.037757" elapsed="0.001394"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.039432" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.039789" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:27.037112" elapsed="0.002879"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:27.036582" elapsed="0.003474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:26.980028" elapsed="0.060128"/>
</kw>
<msg time="2026-05-01T00:50:27.040246" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:27.040290" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.979384" elapsed="0.060944"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:27.040540" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:50:27.040405" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.040387" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.041026" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.041371" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.041443" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:26.978704" elapsed="0.062868"/>
</kw>
<msg time="2026-05-01T00:50:27.041664" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:27.041708" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.973730" elapsed="0.068016"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.042076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.041822" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.041805" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:26.973582" elapsed="0.068628"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:26.973388" elapsed="0.068855"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:26.970969" elapsed="0.071329"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:26.965857" elapsed="0.076496"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:26.965401" elapsed="0.076997"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:26.962471" elapsed="0.079995"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:27.050714" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:27.051130" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:50:27.051332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${REST_API}/${BGP_RIB_URI}?content=nonconfig</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:27.043127" elapsed="0.008233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.056940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.051577" elapsed="0.005482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.062121" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.057500" elapsed="0.004777"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:50:27.062444" elapsed="0.003043"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>${JSONKEYSTR}</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="PASS" start="2026-05-01T00:50:27.042696" elapsed="0.022864"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.066832" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.066422" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.066403" elapsed="0.000517"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:27.067072" elapsed="0.000313"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.072581" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:27.072155" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:27.072826" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:50:27.072684" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.072666" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073066" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073242" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073419" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073616" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073787" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.073955" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.074122" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:27.071809" elapsed="0.002388"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:27.066210" elapsed="0.008037"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:27.065835" elapsed="0.008454"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:26.961919" elapsed="0.112406"/>
</test>
<test id="s1-s11-t9" name="TC2_Connect_BGP_Peer" line="137">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:27.077555" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:27.077272" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.078812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:27.078704" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.078685" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.084189" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:27.084048" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.084030" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.085272" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:27.084891" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.085780" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:27.085483" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:27.085852" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:27.086008" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:27.084509" elapsed="0.002075"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.092304" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:27.092152" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.092132" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.093582" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:27.093452" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.093431" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:27.094104" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:27.093802" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.094530" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:27.094294" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.123821" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:27.095059" elapsed="0.028868"/>
</kw>
<msg time="2026-05-01T00:50:27.124093" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:27.124139" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.094721" elapsed="0.029454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.143564" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:27.124774" elapsed="0.018956"/>
</kw>
<msg time="2026-05-01T00:50:27.143933" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:27.143980" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.124389" elapsed="0.019631"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.144524" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.144132" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.144099" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.145136" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.144776" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.145529" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.145276" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.145258" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:27.145649" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:27.148332" elapsed="0.000216"/>
</kw>
<msg time="2026-05-01T00:50:27.148614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:27.147266" elapsed="0.001489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.149046" elapsed="0.000297"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.149652" elapsed="0.000085"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:27.146608" elapsed="0.003248"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:27.146005" elapsed="0.003918"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:27.093146" elapsed="0.056877"/>
</kw>
<msg time="2026-05-01T00:50:27.150174" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:27.150220" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.092554" elapsed="0.057704"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:27.150445" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-05-01T00:50:27.150337" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.150318" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.150980" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.151329" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:27.151403" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:27.091804" elapsed="0.059731"/>
</kw>
<msg time="2026-05-01T00:50:27.151631" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:27.151674" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.086983" elapsed="0.064729"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:27.152045" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:27.151788" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:27.151771" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:27.086831" elapsed="0.065317"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:27.086648" elapsed="0.065533"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:27.083685" elapsed="0.068555"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:27.078394" elapsed="0.073904"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:27.077969" elapsed="0.074376"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:27.075039" elapsed="0.077388"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.161428" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:27.161096" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.161901" level="INFO">python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.161643" elapsed="0.000304"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:27.165865" level="INFO">python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<msg time="2026-05-01T00:50:27.165969" level="INFO">${output} = python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:27.162106" elapsed="0.003892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:27.166417" level="INFO">python3 play.py --amount 1 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:27.166169" elapsed="0.000315"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-05-01T00:50:27.160705" elapsed="0.005837"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:50:37.168802" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:50:27.168174" elapsed="10.001429">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.169939" elapsed="0.000037"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:50:27.167899" elapsed="10.002201">No match found for '&gt;' in 10 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:50:27.167481" elapsed="10.002868"/>
</kw>
<msg time="2026-05-01T00:50:37.170482" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:27.167098" elapsed="10.003411"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:50:37.170712" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:50:37.170611" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.170584" elapsed="0.000219"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.171047" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.171277" elapsed="0.000030"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:50:27.166808" elapsed="10.004569"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.172871" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.172429" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.172411" elapsed="0.000550"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:37.173118" elapsed="0.000400"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.180500" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:37.180046" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:37.180756" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:37.180607" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.180589" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.180997" elapsed="0.000023"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.181180" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.181360" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.181550" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.181727" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.181900" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.182071" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:37.179716" elapsed="0.002434"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:37.172218" elapsed="0.009984"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:37.171773" elapsed="0.010471"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:27.074602" elapsed="10.107680"/>
</test>
<test id="s1-s11-t10" name="TC2_Check_Example_Bgp_Rib" line="143">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:37.185739" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:37.185467" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.187028" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:37.186917" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.186899" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.192268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:37.192159" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.192141" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.193417" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:37.193030" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.193925" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:37.193628" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:37.193997" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:37.194156" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:37.192645" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.200325" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:37.200215" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.200196" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.201680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:37.201563" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.201545" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:37.202229" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.201911" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:37.202694" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:37.202434" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:37.233879" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:37.203271" elapsed="0.030716"/>
</kw>
<msg time="2026-05-01T00:50:37.234164" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:37.234213" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:37.202888" elapsed="0.031362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:37.255404" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:37.234819" elapsed="0.020703"/>
</kw>
<msg time="2026-05-01T00:50:37.255682" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:37.255727" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:37.234430" elapsed="0.021334"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.256075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.255846" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.255826" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.256639" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "p "_ "R "i "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:37.256302" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.257072" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.256816" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.256794" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:37.257189" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:37.260285" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:50:37.260533" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:37.258985" elapsed="0.001710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.261081" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.261473" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:37.258216" elapsed="0.003455"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:37.257523" elapsed="0.004216"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:37.201228" elapsed="0.060620"/>
</kw>
<msg time="2026-05-01T00:50:37.261942" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:37.261990" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:37.200590" elapsed="0.061439"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:37.262221" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:37.262109" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.262090" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.262769" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.263130" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.263204" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:37.199863" elapsed="0.063493"/>
</kw>
<msg time="2026-05-01T00:50:37.263468" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:37.263516" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "C "h "e "c "k "_ "E "x "a "m "p "l "e "_ "B "g "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:37.194579" elapsed="0.068976"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.263901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.263636" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.263618" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:37.194414" elapsed="0.069593"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:37.194237" elapsed="0.069801"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:37.191796" elapsed="0.072301"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:37.186626" elapsed="0.077533"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:37.186175" elapsed="0.078030"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:37.183195" elapsed="0.081067"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.264951" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | ROUTE_KEY=AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA== }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>ROUTE_KEY=${ROUTE_KEY}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.264439" elapsed="0.000541"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.320892" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:37.320467" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:37.321851" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.321501" elapsed="0.000449">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:37.322062" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:37.321118" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.322819" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:37.322352" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:37.323187" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:37.323423" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:37.323020" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.323922" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:37.323652" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.325081" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:37.324806" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.325584" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.325296" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.326408" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:37.326001" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:37.327513" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.327087" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:37.327596" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:50:37.327808" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:37.326695" elapsed="0.001149"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.328013" elapsed="0.000318"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:37.325843" elapsed="0.002530"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.328991" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:37.328668" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:37.330090" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.329750" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:37.330170" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:37.330325" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:37.329382" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:37.330537" elapsed="0.000279"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:37.328519" elapsed="0.002341"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:37.325666" elapsed="0.005230"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:37.330939" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:37.331099" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:37.324399" elapsed="0.006726"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:37.324067" elapsed="0.007091"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.331343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.331186" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.324043" elapsed="0.007475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.332287" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:37.331671" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:37.332367" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:37.319801" elapsed="0.012711"/>
</kw>
<msg time="2026-05-01T00:50:37.332629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:37.306493" elapsed="0.026190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.346495" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.359671" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.372682" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.372896" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.373089" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.373515" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.373343" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:37.373326" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.373752" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.373927" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.374099" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:37.373289" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.373172" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.374397" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.374495" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:50:37.374633" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:37.301741" elapsed="0.072919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:37.376106" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.375778" elapsed="0.000404">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:37.376277" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:37.375350" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.376696" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.376417" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.377262" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:37.376964" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:37.376779" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.376397" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.380150" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:37.377526" elapsed="0.002662"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:37.380264" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:50:37.380520" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:37.375002" elapsed="0.005554"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:37.382414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.382018" elapsed="0.000518">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:37.382668" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:37.381522" elapsed="0.001180"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:37.382995" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:50:37.382802" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:37.382775" elapsed="0.000338"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.383325" elapsed="0.000029"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.383624" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.383720" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:50:37.385728" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:37.381020" elapsed="0.004734"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.387267" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:37.386977" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:37.387844" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:37.387549" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:37.398066" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:37.398223" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:37.398352" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.390332" elapsed="0.008475">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:37.387980" elapsed="0.010930">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.399179" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.399004" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:37.387961" elapsed="0.011319">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.399760" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.399957" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:37.399905" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:37.399880" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.400262" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.400370" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.386074" elapsed="0.014473">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.400677" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.276979" elapsed="0.123870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:37.401269" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:37.401006" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:37.400979" elapsed="0.000426"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:37.401475" elapsed="0.000022"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.271035" elapsed="0.130582">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.459085" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:38.458695" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:38.459905" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.459654" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:38.460077" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:38.459298" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.460674" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:38.460272" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:38.461121" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:38.461278" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:38.460975" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.461732" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:38.461484" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.462778" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:38.462519" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.463259" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:38.462990" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.464045" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:38.463693" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:38.465009" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:38.464639" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:38.465089" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:50:38.465252" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:38.464267" elapsed="0.001011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:38.465436" elapsed="0.000308"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:38.463536" elapsed="0.002250"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.466363" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:38.466042" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:38.467435" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:38.467098" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:38.467536" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:38.467692" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:38.466750" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:38.467875" elapsed="0.000271"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:38.465902" elapsed="0.002284"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:38.463340" elapsed="0.004881"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:38.468265" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:50:38.468420" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:38.462173" elapsed="0.006288"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:38.461858" elapsed="0.006637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.468676" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:38.468519" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:38.461833" elapsed="0.006919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.469534" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:38.468933" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:38.469650" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:38.458059" elapsed="0.011722"/>
</kw>
<msg time="2026-05-01T00:50:38.469873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:38.445052" elapsed="0.024871"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.483335" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.496199" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.509317" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.509567" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.509758" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.510159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:38.510005" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:38.509988" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.510391" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.510581" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.510782" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:38.509952" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.509838" elapsed="0.001026"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.511017" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.511094" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:50:38.511244" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:38.440629" elapsed="0.070642"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:38.512687" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.512370" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:38.512856" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:38.511989" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.513289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:38.513023" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.513876" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:38.513578" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:38.513370" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:38.513003" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.516541" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:38.514119" elapsed="0.002449"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:38.516621" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:38.516778" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:38.511634" elapsed="0.005169"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:38.518074" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.517838" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:38.518229" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:38.517497" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:38.518475" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:38.518325" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:38.518306" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.518711" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.518886" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.518953" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:38.520945" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:38.517152" elapsed="0.003820"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.522373" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:38.522121" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:38.522835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:38.522593" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:38.531283" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:38.531428" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:38.531547" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.525093" elapsed="0.006823">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:38.522945" elapsed="0.009054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.532225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:38.532064" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:38.522926" elapsed="0.009388">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.532712" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.532845" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:38.532808" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:38.532791" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.533108" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.533179" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.521287" elapsed="0.011999">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.533361" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.417573" elapsed="0.115900">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:38.533755" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:38.533570" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:38.533552" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:38.533905" elapsed="0.000020"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:38.411929" elapsed="0.122110">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.591104" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:39.590695" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:39.591973" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.591700" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:39.592175" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:39.591318" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.592778" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:39.592372" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:39.593241" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:39.593398" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:39.593098" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.593853" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:39.593605" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.594984" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:39.594726" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.595543" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:39.595218" elapsed="0.000356"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.596377" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:39.596002" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:39.597342" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:39.596991" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:39.597425" elapsed="0.000058"/>
</return>
<msg time="2026-05-01T00:50:39.597616" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:39.596633" elapsed="0.001012"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:39.597810" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:39.595836" elapsed="0.002313"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.598985" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:39.598469" elapsed="0.000544"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:39.599904" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:39.599569" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:39.599982" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:39.600134" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:39.599208" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:39.600316" elapsed="0.000289"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:39.598298" elapsed="0.002349"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:39.595636" elapsed="0.005045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:39.600725" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:39.600882" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:39.594370" elapsed="0.006538"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:39.593979" elapsed="0.006961"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.601120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:39.600967" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:39.593956" elapsed="0.007242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.601981" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:39.601349" elapsed="0.000662"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:39.602061" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:39.590003" elapsed="0.012222"/>
</kw>
<msg time="2026-05-01T00:50:39.602327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:39.576674" elapsed="0.025706"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.615264" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.628236" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.642434" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.642753" elapsed="0.000033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.642982" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.643362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:39.643212" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:39.643195" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.643605" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.643776" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.643946" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:39.643164" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.643058" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.644178" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.644258" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:39.644471" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:39.572244" elapsed="0.072266"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:39.645986" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.645721" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:39.646151" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:39.645342" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.646575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:39.646302" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.647139" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:39.646845" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:39.646658" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:39.646283" elapsed="0.000940"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.649802" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:39.647380" elapsed="0.002450"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:39.649884" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:39.650043" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:39.644956" elapsed="0.005112"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:39.651325" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.651091" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:39.651498" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:39.650748" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:39.651732" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:39.651596" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:39.651578" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.651977" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.652153" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.652219" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:39.654185" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:39.650396" elapsed="0.003815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.655706" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:39.655438" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:39.656155" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:39.655915" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:39.664294" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:39.664518" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:39.664661" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.658433" elapsed="0.006747">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:39.656265" elapsed="0.009036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.665661" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:39.665400" elapsed="0.000360"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:39.656247" elapsed="0.009549">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.666410" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.666628" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:39.666573" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:39.666548" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.666945" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.667051" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.654583" elapsed="0.012623">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.667319" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.548785" elapsed="0.118694">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:39.667888" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:39.667620" elapsed="0.000373"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:39.667595" elapsed="0.000433"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:39.668077" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:39.542712" elapsed="0.125505">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.724865" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:40.724468" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:40.725722" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.725420" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:40.725895" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:40.725076" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.726496" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:40.726091" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:40.726903" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:40.727059" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:40.726759" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.727533" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:40.727249" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.728574" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:40.728299" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.729054" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:40.728784" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.729815" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:40.729464" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:40.730760" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:40.730386" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:40.730839" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:40.731004" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:40.730041" elapsed="0.000988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:40.731190" elapsed="0.000334"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:40.729309" elapsed="0.002258"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.733531" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:40.731825" elapsed="0.001734"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:40.734465" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:40.734113" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:40.734546" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:40.734702" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:40.733758" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:40.734886" elapsed="0.000274"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:40.731685" elapsed="0.003516"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:40.729134" elapsed="0.006103"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:40.735281" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:50:40.735496" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:40.727969" elapsed="0.007555"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:40.727657" elapsed="0.007900"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.735738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:40.735583" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:40.727635" elapsed="0.008181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.736559" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:40.735962" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:40.736637" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:40.723830" elapsed="0.012932"/>
</kw>
<msg time="2026-05-01T00:50:40.736856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:40.710610" elapsed="0.026297"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.749698" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.762418" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.775165" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.775367" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.775596" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.775982" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:40.775831" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:40.775815" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.776207" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.776379" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.776564" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:40.775782" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.775675" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.776797" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.776873" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:40.777002" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:40.706209" elapsed="0.070819"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:40.778338" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.778073" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:40.778520" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:40.777715" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.778916" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:40.778657" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.779527" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:40.779189" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:40.779003" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:40.778638" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.782183" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:40.779770" elapsed="0.002440"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:40.782263" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:40.782420" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:40.777359" elapsed="0.005086"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:40.783714" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.783476" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:40.783871" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:40.783106" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:40.784106" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:40.783968" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:40.783949" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.784345" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.784539" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.784607" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:40.786591" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:40.782776" elapsed="0.003841"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.788069" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:40.787819" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:40.788534" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:40.788275" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:40.796831" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:40.797026" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:40.797185" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.790776" elapsed="0.006953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:40.788643" elapsed="0.009210">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.798199" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:40.797957" elapsed="0.000339"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:40.788625" elapsed="0.009706">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.798930" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.799127" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:40.799071" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:40.799047" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.799489" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.799600" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.786934" elapsed="0.012825">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.799871" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.682665" elapsed="0.117347">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:40.800424" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:40.800151" elapsed="0.000403"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:40.800126" elapsed="0.000463"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:40.800639" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:40.676280" elapsed="0.124501">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.858465" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:41.858063" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:41.859269" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.859022" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:41.859438" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:41.858679" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.860043" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:41.859653" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:41.860446" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:41.860649" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:41.860304" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.861093" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:41.860843" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.862137" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:41.861881" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.862638" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:41.862350" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.863384" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:41.863034" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:41.864327" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:41.863980" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:41.864409" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:50:41.864607" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:41.863630" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:41.864801" elapsed="0.000289"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:41.862893" elapsed="0.002239"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.865889" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:41.865390" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:41.866819" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:41.866476" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:41.866900" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:41.867055" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:41.866112" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:41.867241" elapsed="0.000290"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:41.865249" elapsed="0.002325"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:41.862719" elapsed="0.004891"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:41.867654" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:41.867813" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:41.861548" elapsed="0.006292"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:41.861215" elapsed="0.006657"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.868054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:41.867897" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:41.861194" elapsed="0.006938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.868910" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:41.868282" elapsed="0.000658"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:41.868990" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:41.857429" elapsed="0.011686"/>
</kw>
<msg time="2026-05-01T00:50:41.869209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:41.844416" elapsed="0.024843"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.882128" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.894922" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.907759" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.907960" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.908145" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.908536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:41.908369" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:41.908353" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.908794" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.908970" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.909143" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:41.908323" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.908220" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.909377" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.909469" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:50:41.909597" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:41.840046" elapsed="0.069579"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:41.910888" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.910652" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:41.911045" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:41.910290" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.911431" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:41.911178" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.912011" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:41.911713" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:41.911530" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:41.911159" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.914709" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:41.912252" elapsed="0.002485"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:41.914791" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:41.914947" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:41.909955" elapsed="0.005017"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:41.916207" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.915976" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:41.916364" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:41.915634" elapsed="0.000755"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:41.916649" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:41.916477" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:41.916443" elapsed="0.000292"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.916886" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.917064" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.917132" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:41.919110" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:41.915286" elapsed="0.003850"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.920545" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:41.920285" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:41.921029" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:41.920783" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:41.931291" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:41.931434" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:41.931558" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.923256" elapsed="0.008670">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:41.921138" elapsed="0.010871">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.932243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:41.932079" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:41.921120" elapsed="0.011211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.932773" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.932908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:41.932870" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:41.932853" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.933301" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.933489" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.919465" elapsed="0.014262">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.933896" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.816691" elapsed="0.117420">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:41.934760" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:41.934319" elapsed="0.000603"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:41.934282" elapsed="0.000692"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:41.935052" elapsed="0.000031"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:41.811095" elapsed="0.124167">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.992484" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:42.992077" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:42.993292" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:42.993038" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:42.993482" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:42.992697" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.994124" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:42.993736" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:42.994566" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:42.994727" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:42.994402" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.995161" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:42.994918" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.996194" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:42.995942" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.996687" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:42.996404" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.997435" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:42.997088" elapsed="0.000397"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:42.998416" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:42.998069" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:42.998515" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:50:42.998680" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:42.997717" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:42.998868" elapsed="0.000297"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:42.996942" elapsed="0.002265"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:42.999973" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:42.999486" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:43.000893" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:43.000555" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:43.000971" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:43.001124" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:43.000195" elapsed="0.000955"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:43.001308" elapsed="0.000311"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:42.999324" elapsed="0.002338"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:42.996767" elapsed="0.004930"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:43.001741" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:43.001899" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:42.995614" elapsed="0.006310"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:42.995286" elapsed="0.006671"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.002145" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:43.001983" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:42.995264" elapsed="0.006958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:43.002970" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:43.002372" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:43.003048" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:42.991446" elapsed="0.011727"/>
</kw>
<msg time="2026-05-01T00:50:43.003274" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:42.978405" elapsed="0.024919"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.016199" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.028871" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.041470" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.041706" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.041893" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.042266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:43.042115" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:43.042100" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.042511" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.042686" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.042857" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:43.042071" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.041968" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.043086" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.043161" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:43.043288" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:42.973990" elapsed="0.069325"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:43.044608" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:43.044344" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:43.044766" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:43.043999" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.045162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:43.044906" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:43.045780" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:43.045431" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:43.045243" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:43.044887" elapsed="0.000977"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:43.048395" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:43.046023" elapsed="0.002399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:43.048489" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:43.048646" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:43.043666" elapsed="0.005005"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:43.049928" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:43.049685" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:43.050084" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:43.049311" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:43.050315" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:43.050180" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:43.050162" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.050568" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.050747" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.050813" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:43.052973" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:43.048981" elapsed="0.004019"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:43.054429" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:43.054183" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:43.054891" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:43.054651" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:43.065486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:43.065628" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:43.065750" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:43.057268" elapsed="0.008873">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:43.055125" elapsed="0.011128">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.066594" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:43.066344" elapsed="0.000343"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:43.054983" elapsed="0.011738">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.067256" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.067441" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:43.067388" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:43.067365" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.067764" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.067864" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:43.053319" elapsed="0.014692">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.068117" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:42.950660" elapsed="0.117592">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:43.068660" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:43.068383" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:43.068359" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:43.068841" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:42.944389" elapsed="0.124585">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.125516" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:44.125101" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:44.126318" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.126067" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:44.126505" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:44.125728" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.127104" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:44.126719" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:44.127528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:44.127685" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:44.127368" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.128119" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:44.127875" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.129149" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:44.128893" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.129644" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:44.129359" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.130387" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:44.130040" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:44.131367" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:44.131018" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:44.131462" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:50:44.131625" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:44.130668" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:44.131809" elapsed="0.000290"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:44.129898" elapsed="0.002242"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.132887" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:44.132396" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:44.133802" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:44.133467" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:44.133879" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:44.134032" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:44.133109" elapsed="0.000948"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:44.134220" elapsed="0.000287"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:44.132255" elapsed="0.002293"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:44.129723" elapsed="0.004883"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:44.134650" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:44.134809" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:44.128563" elapsed="0.006271"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:44.128242" elapsed="0.006624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.135046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:44.134892" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:44.128220" elapsed="0.006904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.135869" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:44.135275" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:44.135947" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:44.124479" elapsed="0.011594"/>
</kw>
<msg time="2026-05-01T00:50:44.136163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:44.111042" elapsed="0.025171"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.149007" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.161728" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.174550" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.174779" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.174960" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.175333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:44.175183" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:44.175169" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.175577" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.175751" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.175922" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:44.175140" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.175034" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.176152" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.176227" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:44.176350" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:44.106685" elapsed="0.069691"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:44.177639" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.177390" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:44.177793" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:44.177050" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.178180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:44.177922" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.178776" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:44.178445" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:44.178261" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:44.177903" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.181401" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:44.179017" elapsed="0.002411"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:44.181496" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:44.181652" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:44.176720" elapsed="0.004957"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:44.182933" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.182701" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:44.183087" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:44.182315" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:44.183317" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:44.183183" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:44.183164" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.183567" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.183743" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.183808" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:44.185797" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:44.181986" elapsed="0.003837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.187229" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:44.186978" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:44.187690" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:44.187432" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:44.198325" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:44.198487" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:44.198585" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.189907" elapsed="0.009076">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:44.187799" elapsed="0.011271">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.199618" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:44.199216" elapsed="0.000552"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:44.187781" elapsed="0.012042">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.200696" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.200995" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:44.200911" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:44.200874" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.201506" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.201669" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.186137" elapsed="0.015763">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.202069" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.083671" elapsed="0.118618">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:44.202961" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:44.202530" elapsed="0.000595"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:44.202489" elapsed="0.000689"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:44.203254" elapsed="0.000033"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:44.079120" elapsed="0.124376">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.262641" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:45.262176" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:45.263502" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.263210" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:45.263681" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:45.262860" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.264278" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:45.263884" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:45.264745" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:45.264965" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:45.264595" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.265410" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:45.265161" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.266603" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:45.266281" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.267136" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:45.266841" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.268026" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:45.267594" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:45.269108" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:45.268733" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:45.269201" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:50:45.269385" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:45.268273" elapsed="0.001139"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:45.269594" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:45.267411" elapsed="0.002555"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.272234" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:45.270225" elapsed="0.002042"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:45.273500" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:45.272942" elapsed="0.000590"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:45.273592" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:50:45.273770" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:45.272537" elapsed="0.001261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:45.273996" elapsed="0.000346"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:45.270082" elapsed="0.004309"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:45.267225" elapsed="0.007207"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:45.274515" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:45.274696" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:45.265900" elapsed="0.008824"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:45.265570" elapsed="0.009190"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.274987" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:45.274790" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:45.265538" elapsed="0.009535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.275970" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:45.275251" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:45.276057" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:45.261532" elapsed="0.014669"/>
</kw>
<msg time="2026-05-01T00:50:45.276337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:45.248022" elapsed="0.028381"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.290754" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.303488" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.316227" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.316471" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.316664" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.317068" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:45.316915" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:45.316898" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.317303" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.317493" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.317669" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:45.316862" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.316745" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.317904" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.317983" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:50:45.318123" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:45.243294" elapsed="0.074857"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:45.319556" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.319269" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:45.319727" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:45.318888" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.320147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:45.319876" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.320734" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:45.320417" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:45.320230" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:45.319857" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.323467" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:45.320978" elapsed="0.002518"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:45.323551" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:50:45.323711" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:45.318537" elapsed="0.005200"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:45.325001" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.324752" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:45.325160" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:45.324389" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:45.325394" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:45.325258" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:45.325239" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.325652" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.325831" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.325898" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:45.327933" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:45.324052" elapsed="0.003908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.329399" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:45.329144" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:45.329876" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:45.329626" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:45.341102" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:45.341294" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:45.341442" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.332282" elapsed="0.009699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:45.329989" elapsed="0.012105">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.342464" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:45.342191" elapsed="0.000369"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:45.329971" elapsed="0.012623">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.343131" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.343316" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:45.343264" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:45.343241" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.343636" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.343736" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.328292" elapsed="0.015591">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.343989" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.219713" elapsed="0.124410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:45.344533" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:45.344255" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:45.344231" elapsed="0.000437"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:45.344715" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:45.214502" elapsed="0.130347">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.402343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:46.401941" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:46.403174" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.402914" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:46.403346" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:46.402572" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.403950" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:46.403564" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:46.404365" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:46.404544" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:46.404218" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.404981" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:46.404737" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.406072" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:46.405815" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.406728" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:46.406287" elapsed="0.000467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.407537" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:46.407135" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:46.408499" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:46.408128" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:46.408583" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:50:46.408753" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:46.407771" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:46.408940" elapsed="0.000313"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:46.406989" elapsed="0.002307"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.410085" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:46.409572" elapsed="0.000541"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:46.411010" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:46.410674" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:46.411089" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:46.411243" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:46.410308" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:46.411426" elapsed="0.000288"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:46.409413" elapsed="0.002342"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:46.406809" elapsed="0.004982"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:46.411834" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:46.411993" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:46.405483" elapsed="0.006536"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:46.405148" elapsed="0.006903"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.412233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:46.412078" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:46.405123" elapsed="0.007187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.413098" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:46.412481" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:46.413175" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:46.401299" elapsed="0.012002"/>
</kw>
<msg time="2026-05-01T00:50:46.413409" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:46.388240" elapsed="0.025238"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.426283" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.439051" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.451659" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.451857" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.452039" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.452414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:46.452263" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:46.452247" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.452658" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.452830" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.453029" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:46.452216" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.452114" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.453264" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.453340" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:46.453481" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:46.383832" elapsed="0.069678"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:46.454808" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.454542" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:46.454979" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:46.454176" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.455369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:46.455112" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.455949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:46.455654" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:46.455466" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:46.455093" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.458643" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:46.456190" elapsed="0.002481"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:46.458724" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:46.458879" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:46.453845" elapsed="0.005060"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:46.460131" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.459899" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:46.460286" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:46.459561" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:46.460534" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:46.460383" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:46.460364" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.460770" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.460957" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.461024" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:46.463008" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:46.459217" elapsed="0.003818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.464432" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:46.464184" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:46.464899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:46.464656" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:46.474818" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:46.475004" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:46.475140" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.467186" elapsed="0.008478">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:46.465045" elapsed="0.010733">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.476096" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:46.475871" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:46.465026" elapsed="0.011195">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.476770" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.476994" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:46.476937" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:46.476881" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.477299" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.477399" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.463353" elapsed="0.014217">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.477677" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.359796" elapsed="0.118017">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:46.478208" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:46.477945" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:46.477921" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:46.478388" elapsed="0.000020"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:46.353390" elapsed="0.125155">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.540348" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:47.539918" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:47.541226" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.540944" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:47.541405" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:47.540589" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.542017" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:47.541623" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:47.542470" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:47.542697" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:l...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:47.542308" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.543146" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.542893" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.544281" level="INFO">mapping: {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.544015" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.544788" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.544512" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.545589" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:47.545202" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:47.546547" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.546172" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:47.546630" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:50:47.546802" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:47.545819" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.546989" elapsed="0.000303"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:47.545059" elapsed="0.002276"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.548158" level="INFO">${value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:47.547610" elapsed="0.000576"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:47.549089" level="INFO">${encoded} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.548750" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:47.549167" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:47.549322" level="INFO">${encoded_value} = AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:47.548383" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.549520" elapsed="0.000281"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-05-01T00:50:47.547468" elapsed="0.002376"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:47.544874" elapsed="0.005005"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:47.549924" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:47.550082" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:47.543645" elapsed="0.006463"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:47.543280" elapsed="0.006859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.550320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.550167" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.543253" elapsed="0.007149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.551184" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:47.550575" elapsed="0.000642"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:47.551267" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:47.539198" elapsed="0.012195"/>
</kw>
<msg time="2026-05-01T00:50:47.551501" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:47.525116" elapsed="0.026437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.564493" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.584901" elapsed="0.000107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.599468" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.599704" elapsed="0.000057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.599936" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.600361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.600202" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:47.600184" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.600613" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.600787" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.600957" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:47.600142" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.600019" elapsed="0.001019"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.601192" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.601272" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:50:47.601441" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:47.518870" elapsed="0.082616"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:47.602898" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.602609" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:47.603066" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:47.602189" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.603520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.603232" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.604127" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:47.603824" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:47.603604" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.603212" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.606822" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:47.604372" elapsed="0.002477"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:47.606902" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:47.607062" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:47.601827" elapsed="0.005260"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:47.608335" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.608101" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:47.608506" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:47.607760" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:50:47.608739" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:50:47.608603" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.608585" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.608972" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.609145" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.609223" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:50:47.611237" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:47.607400" elapsed="0.003863"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.612714" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.612445" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.613154" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.612916" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:47.623956" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:47.624097" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:47.624195" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.615385" elapsed="0.009334">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-05-01T00:50:47.613262" elapsed="0.011570">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.625150" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.624923" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-05-01T00:50:47.613244" elapsed="0.012032">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.625821" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.626007" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.625955" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:47.625932" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.626306" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.626404" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.611592" elapsed="0.014979">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.626676" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.493699" elapsed="0.133111">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.627196" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.626939" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:47.626916" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.627383" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:50:47.487152" elapsed="0.140386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<msg time="2026-05-01T00:50:47.627677" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${DEFAULT_RIB_CHECK_TIMEOUT}</arg>
<arg>${DEFAULT_RIB_CHECK_PERIOD}</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:50:37.265163" elapsed="10.362680">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.629698" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.629132" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.629108" elapsed="0.000755"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:47.630083" elapsed="0.000764"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.636413" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:47.635999" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-05-01T00:50:47.636680" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.636537" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.636518" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.637190" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:47.636894" elapsed="0.000322"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:47.637732" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC2_Check_Example_Bgp_Rib</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.637376" elapsed="0.000383"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-01T00:50:47.638100" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-01T00:50:47.637923" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.638639" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:47.638283" elapsed="0.000383"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.639130" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:47.638826" elapsed="0.000332"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.639799" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib&amp;order=bug_status"

Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-05-01T00:50:47.639315" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.640303" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.640012" elapsed="0.000339"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:47.635664" elapsed="0.004743"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:47.628835" elapsed="0.011638"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:47.628298" elapsed="0.012219"/>
</kw>
<doc>Check RIB for linkstate-route(s) and check all of their attributes.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:50:37.182654" elapsed="10.457901">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib&amp;order=bug_status"

Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</status>
</test>
<test id="s1-s11-t11" name="TC2_Disconnect_BGP_Peer" line="156">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:47.643939" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:47.643650" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.645197" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.645086" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.645067" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.650520" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.650367" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.650349" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.651608" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:47.651211" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.652134" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:47.651832" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:47.652205" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:47.652365" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:47.650828" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.658297" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.658169" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.658146" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.659625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:47.659515" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.659497" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:47.660197" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:47.659890" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:47.660626" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:47.660390" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:47.693266" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:47.661160" elapsed="0.032383"/>
</kw>
<msg time="2026-05-01T00:50:47.693786" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:47.693836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:47.660818" elapsed="0.033058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:47.714127" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:47.694648" elapsed="0.019719"/>
</kw>
<msg time="2026-05-01T00:50:47.714639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:47.714687" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:47.694152" elapsed="0.020573"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.715244" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.714852" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.714816" elapsed="0.000528"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.716039" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:47.715528" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.716418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.716188" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.716168" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:47.716562" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:47.719699" elapsed="0.000161"/>
</kw>
<msg time="2026-05-01T00:50:47.719929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:47.718341" elapsed="0.001732"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.720442" elapsed="0.000120"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.720929" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:47.717602" elapsed="0.003808"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:47.716960" elapsed="0.004561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:47.659180" elapsed="0.062451"/>
</kw>
<msg time="2026-05-01T00:50:47.721737" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:47.721783" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:47.658545" elapsed="0.063277"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:47.722033" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:50:47.721910" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.721887" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.722615" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.722990" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:47.723066" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:47.657803" elapsed="0.065388"/>
</kw>
<msg time="2026-05-01T00:50:47.723295" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:47.723341" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "i "s "c "o "n "n "e "c "t "_ "B "G "P "_ "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:47.652782" elapsed="0.070596"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:47.723778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:47.723477" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:47.723443" elapsed="0.000414"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:47.652634" elapsed="0.071248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:47.652444" elapsed="0.071477"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:47.650004" elapsed="0.073980"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:47.644800" elapsed="0.079244"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:47.644354" elapsed="0.079740"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:47.641442" elapsed="0.082710"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:47.725415" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:47.725056" elapsed="0.000387"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:47.725625" elapsed="0.000551"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:50:47.724770" elapsed="0.001469"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:50:49.727148" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:50:49.727582" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:50:47.726398" elapsed="2.001268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.728937" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.728150" elapsed="0.000898"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-05-01T00:50:47.724388" elapsed="2.004800"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:49.743617" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-05-01T00:50:49.756184" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:49.756403" level="INFO">${output_log} = 2026-05-01 00:50:27,241 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:50:27,241 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:50:27,241 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:49.743473" elapsed="0.013137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.757624" level="INFO">2026-05-01 00:50:27,241 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:50:27,241 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:50:27,241 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:50:27,241 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:50:27,241 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:50:27,242 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:50:27,244 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:50:27,245 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:50:27,245 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010440040047020641040000fbf0
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010440040047020641040000fbf0'
2026-05-01 00:50:27,246 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010440040047020641040000fbf0
2026-05-01 00:50:27,247 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:50:27,247 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:27,248 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:50:27,248 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-05-01 00:50:27,249 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Length=80 (0x0050)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=57 (0x0039)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064800e2240044704c00002010000050015070000000000000001010203040001000105060708)
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:50:27,250 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:50:27,251 DEBUG BGP-Thread-1 (job):     MP_REACH_NLRI: {'Identifier': 1, 'TunnelID': 1, 'LSPID': 1, 'IPv4TunnelSenderAddress': IPv4Address('1.2.3.4'), 'IPv4TunnelEndPointAddress': IPv4Address('5.6.7.8')}
2026-05-01 00:50:27,251 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:50:27,251 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff005002000000394001010040020602010000fbf040050400000064800e2240044704c00002010000050015070000000000000001010203040001000105060708
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): All update messages generated.
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): Storing performance results.
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-05-01 00:50:27,251 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.002109050750732422s
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:27,252 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-05-01 00:50:27,253 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:27,253 INFO BGP-Thread-1 (job):   
2026-05-01 00:50:27,253 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-05-01 00:50:27,253 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-05-01 00:50:27,254 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-05-01 00:50:27,254 DEBUG BGP-Thread-1 (job):     MP_REACH_NLRI: {'Identifier': 1, 'TunnelID': 1, 'LSPID': 1, 'IPv4TunnelSenderAddress': IPv4Address('1.2.3.4'), 'IPv4TunnelEndPointAddress': IPv4Address('5.6.7.8')}
2026-05-01 00:50:27,254 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-05-01 00:50:27,254 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-05-01 00:50:27,254 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:50:27,254 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:50:27,254 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:50:27,255 INFO BGP-Thread-1 (job): ... idle for 0.001s
2026-05-01 00:50:27,255 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.001s
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:50:27,255 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0006' (6)
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'800f03400447'
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Attribute value=0xb'400447'
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'4004'
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'47'
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb''
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: []
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:50:27,256 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Allf False
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-05-01 00:50:27,257 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-05-01 00:50:27,259 INFO BGP-Thread-1 (job): NOTIFICATION message received: 0xffffffffffffffffffffffffffffffff0015030301
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.757005" elapsed="0.001088"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:49.759319" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/tc2_bgp_peer.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:50:49.758568" elapsed="0.000875"/>
</kw>
<arg>${BGP_PEER_LOG_FILE}</arg>
<arg>tc2_${BGP_PEER_LOG_FILE}</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:49.743033" elapsed="0.016581"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.762789" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.761811" elapsed="0.001128"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.761760" elapsed="0.001243"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:49.763378" elapsed="0.000796"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.770627" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.770192" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:49.770880" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:50:49.770731" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.770713" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.771131" elapsed="0.000022"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.771314" elapsed="0.000020"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.771508" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.771683" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.771853" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.772024" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.772190" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:49.769877" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.761177" elapsed="0.011140"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:49.760236" elapsed="0.012122"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:50:47.640929" elapsed="2.131468"/>
</test>
<test id="s1-s11-t12" name="TC2_Deconfigure_iBGP_Peer" line="162">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:49.776797" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:49.776523" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.778150" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:49.778036" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.778017" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.783275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:49.783169" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.783151" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.784411" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:49.784010" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.784916" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:49.784624" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:49.785039" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:50:49.785203" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:49.783594" elapsed="0.001634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.790985" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:49.790876" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.790858" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.792307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:49.792200" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.792182" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:49.792861" level="INFO">${karaf_connection_index} = 9</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.792554" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:49.793274" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:49.793053" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:49.821969" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:49.793911" elapsed="0.028167"/>
</kw>
<msg time="2026-05-01T00:50:49.822253" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:49.822300" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:49.793493" elapsed="0.028844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:49.842489" level="INFO">". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:49.822930" elapsed="0.019697"/>
</kw>
<msg time="2026-05-01T00:50:49.842822" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:49.842871" level="INFO">${message_wait} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:49.822565" elapsed="0.020344"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.843284" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.843005" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.842979" elapsed="0.000390"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.843886" level="INFO"> ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.843549" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.844250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.844025" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.844006" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:49.844367" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:49.847423" elapsed="0.000171"/>
</kw>
<msg time="2026-05-01T00:50:49.847659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:49.846077" elapsed="0.001722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.848088" elapsed="0.000327"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.848719" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:49.845339" elapsed="0.003603"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:49.844714" elapsed="0.004309"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:49.791898" elapsed="0.057300"/>
</kw>
<msg time="2026-05-01T00:50:49.849309" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:49.849362" level="INFO">${message} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:49.791252" elapsed="0.058155"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:49.849654" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-05-01T00:50:49.849521" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.849496" elapsed="0.000294"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.850300" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.850760" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.850849" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:49.790539" elapsed="0.060459"/>
</kw>
<msg time="2026-05-01T00:50:49.851110" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:49.851163" level="INFO">${output} =  ". "t "x "t ". "I "b "g "p "[C "P "e "e "r "[C "L "s "p ". "T "C "2 "_ "D "e "c "o "n "f "i "g "u "r "e "_ "i "B "G "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:49.785659" elapsed="0.065550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.851677" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.851308" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.851286" elapsed="0.000484"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:49.785488" elapsed="0.066311"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:49.785285" elapsed="0.066554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:49.782810" elapsed="0.069096"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:49.777709" elapsed="0.074266"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:49.777222" elapsed="0.074809"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:49.773583" elapsed="0.078513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.853148" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.852325" elapsed="0.000855"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.899787" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:49.899387" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:49.900591" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:49.900325" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:49.900768" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:49.899986" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.901355" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:49.900962" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:49.901727" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:49.901936" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:49.901565" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.902377" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.902125" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.903405" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.903148" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.903897" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.903631" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.904623" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:49.904306" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:49.905393" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.905169" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:49.905487" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:49.905679" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:49.904846" elapsed="0.000859"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.905866" elapsed="0.000249"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:50:49.904158" elapsed="0.001998"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.906730" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:49.906410" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:49.907496" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.907271" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:49.907574" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:49.907729" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:49.906948" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.907910" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:50:49.906271" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.908742" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:49.908428" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:49.909510" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.909283" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:49.909586" elapsed="0.000065"/>
</return>
<msg time="2026-05-01T00:50:49.909776" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:49.908961" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.909959" elapsed="0.000224"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:49.908289" elapsed="0.001934"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.910980" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:49.910492" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:49.911780" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.911560" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:49.911856" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:49.912010" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:49.911198" elapsed="0.000836"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.912193" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:49.910337" elapsed="0.002170"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:49.903977" elapsed="0.008568"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:49.912590" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:49.912752" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:49.902819" elapsed="0.009959"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.902511" elapsed="0.010300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.912992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.912837" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.902488" elapsed="0.010582"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.913871" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.913219" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:49.913951" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:49.898762" elapsed="0.015316"/>
</kw>
<msg time="2026-05-01T00:50:49.914134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:49.885332" elapsed="0.028850"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.926970" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.939708" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.952559" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.952792" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.952978" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.953386" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.953232" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:49.953216" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.953657" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.953832" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.954002" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:49.953179" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.953058" elapsed="0.001081"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.954303" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:49.954383" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:50:49.954544" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:49.880896" elapsed="0.073676"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.955772" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.955484" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:49.967678" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node06y38m9bls3vwhbhf7q11w5vh20.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:49.967788" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:49.967988" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:49.958040" elapsed="0.010006"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.955888" elapsed="0.012247"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.968575" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.968192" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.955871" elapsed="0.012892"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.977037" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.971058" elapsed="0.006080"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.970553" elapsed="0.006666"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.970511" elapsed="0.006766"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.980597" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:49.978009" elapsed="0.002634"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.977405" elapsed="0.003273"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.977366" elapsed="0.003337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.981280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.980887" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.981662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.981380" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.982225" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:49.981922" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.981748" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.981362" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.982866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.982499" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.983208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.982964" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.983775" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:49.983477" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.983290" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.982946" elapsed="0.000951"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:49.984056" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:49.984890" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.984596" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:49.985079" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:49.969618" elapsed="0.017946"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:49.987611" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:49.989961" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:50:49.954858" elapsed="0.035131"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:49.990045" elapsed="0.000028"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:50:49.853425" elapsed="0.136746"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.991439" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:49.991054" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.991036" elapsed="0.000506"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:49.991694" elapsed="0.000313"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:49.997133" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:49.996729" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-05-01T00:50:49.997378" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:49.997236" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:49.997218" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.997651" elapsed="0.000023"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.997830" elapsed="0.000021"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.998009" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.998180" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.998359" elapsed="0.000021"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.998546" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:49.998719" elapsed="0.000021"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:50:49.996407" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:49.990844" elapsed="0.008004"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:50:49.990473" elapsed="0.008418"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:50:49.772891" elapsed="0.226037"/>
</test>
<kw name="Teardown_Everything" owner="BgpOperations" type="TEARDOWN">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.000943" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-01T00:50:50.013277" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-05-01T00:50:50.013524" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>ps -elf | egrep python | egrep ${filter} | egrep -v grep</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:50.000643" elapsed="0.012961"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-01T00:50:50.013712" elapsed="0.000069"/>
</return>
<msg time="2026-05-01T00:50:50.014058" level="INFO">${processes} = </msg>
<var>${processes}</var>
<arg>${filter}</arg>
<doc>Only searches for the list of processes, in case something else than kill has to be done with them.</doc>
<status status="PASS" start="2026-05-01T00:50:50.000311" elapsed="0.013802"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.015065" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.014506" elapsed="0.000652"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.017555" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:50.017731" level="INFO">${arg_length} = 0</msg>
<var>${arg_length}</var>
<arg>${pself_lines}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:50.016914" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-05-01T00:50:50.018187" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:50:50.017942" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.017902" elapsed="0.000467"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${commands}</var>
<arg>echo '${pself_lines}' | awk '{print "kill -${signal}",$4}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.018748" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.019145" elapsed="0.000046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.019564" elapsed="0.000048"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-05-01T00:50:50.016197" elapsed="0.003560"/>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="PASS" start="2026-05-01T00:50:50.000002" elapsed="0.019868"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:50.020365" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:50:50.020203" elapsed="0.000344"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:50:50.020883" elapsed="0.000853"/>
</kw>
<doc>Create and Log the diff between expected and actual responses, make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-05-01T00:50:49.999725" elapsed="0.022144"/>
</kw>
<doc>Basic tests for iBGP peers.

Copyright (c) 2015-2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic iBGP functional test case for
carrying LSP State Information in BGP as described in
http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03</doc>
<status status="FAIL" start="2026-05-01T00:50:00.817737" elapsed="49.204207"/>
</suite>
<suite id="s1-s12" name="010 Bgp Functional L3Vpn" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.114621" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.110201" elapsed="0.004471"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:50:50.109971" elapsed="0.004768"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.119631" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:50:50.115846" elapsed="0.003812"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:50:50.119852" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.119740" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.119718" elapsed="0.000202"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.120430" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.120079" elapsed="0.000410"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.120968" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:50:50.120659" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:50:50.121547" elapsed="0.000294"/>
</kw>
<msg time="2026-05-01T00:50:50.121938" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:50.121984" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.121164" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.122559" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:50.122179" elapsed="0.000405"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.123626" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:50.123288" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.124070" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:50.123811" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.124576" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.124262" elapsed="0.000343"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.127908" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.128618" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:50.128278" elapsed="0.000366"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.128804" elapsed="0.000225"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.129871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:50.129575" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:50:50.129945" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:50:50.130103" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.129229" elapsed="0.000900"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:50.130736" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19e38510&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:50:50.130290" elapsed="0.000571"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.131029" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:50:50.127324" elapsed="0.003955"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:50.127125" elapsed="0.004203"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:50:50.124658" elapsed="0.006701"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.131952" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.131551" elapsed="0.000444"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.132584" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.132162" elapsed="0.000466"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.133177" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.132794" elapsed="0.000425"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:50:50.122838" elapsed="0.010438"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:50:50.115498" elapsed="0.017834"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.133576" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.133397" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.133379" elapsed="0.000267"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.136791" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:50.136394" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.137278" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:50.136983" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:50.137350" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:50.137557" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:50.136062" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:50.138634" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.138351" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.139402" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:50.139520" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.139249" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.143126" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:50.142550" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.142531" elapsed="0.000721"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.143916" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:50.144148" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.143481" elapsed="0.000721"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.145150" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.144490" elapsed="0.000765"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.146493" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.145579" elapsed="0.000967"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.148244" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:50.148420" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:50.147894" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.148826" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.150580" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:50:50.464894" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:50:01 UTC 2026

  System load:  0.17               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:50:02 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:50:50.150157" elapsed="0.314863"/>
</kw>
<msg time="2026-05-01T00:50:50.465096" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.149679" elapsed="0.315577"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:50:50.146989" elapsed="0.318410"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.466251" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:50:50.478527" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:50:50.478885" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:50:50.479108" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:50.465782" elapsed="0.013434"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.479938" elapsed="0.001075"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.483661" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.482407" elapsed="0.001590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.484936" elapsed="0.000110"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.484365" elapsed="0.000904"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.484311" elapsed="0.001046"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:50.486074" elapsed="0.000135"/>
</return>
<status status="PASS" start="2026-05-01T00:50:50.485576" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.485531" elapsed="0.000979"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.486651" elapsed="0.000037"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.492139" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.492920" elapsed="0.000302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.493509" elapsed="0.000230"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.487856" elapsed="0.005952"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:50:50.141592" elapsed="0.352389"/>
</kw>
<msg time="2026-05-01T00:50:50.494038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.140742" elapsed="0.353348"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:50:50.140230" elapsed="0.353940"/>
</kw>
<msg time="2026-05-01T00:50:50.494211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.139711" elapsed="0.354546"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.497003" elapsed="0.000321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.497508" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.497815" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.494570" elapsed="0.003390"/>
</kw>
<msg time="2026-05-01T00:50:50.498051" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:50:50.138886" elapsed="0.359189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.498538" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.498274" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:50:50.498623" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:50:50.137988" elapsed="0.360760"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:50.137803" elapsed="0.360982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:50.137671" elapsed="0.361151"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:50:50.133871" elapsed="0.365006"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:50:50.499038" elapsed="0.000208"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.513653" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.513517" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.513491" elapsed="0.000244"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.514094" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:50.514205" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.513925" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.514700" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.514392" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.515233" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.514987" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:50.516106" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:50:50.515871" elapsed="0.000345">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:50:50.516325" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:50:50.516371" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.515447" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.516724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:50.516488" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.516467" elapsed="0.000358"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:50.517643" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.517356" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:50:50.517718" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:50:50.517877" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.517049" elapsed="0.000853"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.518063" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.518788" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:50:50.518888" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.518678" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.519067" elapsed="0.002546"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.522060" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:50:50.719651" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.521787" elapsed="0.198008"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.723264" elapsed="0.000383"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.723819" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.724139" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.720928" elapsed="0.003364"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:50.720212" elapsed="0.004126"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.513106" elapsed="0.211284"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:50.500029" elapsed="0.224408"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.499658" elapsed="0.224853"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:50.499507" elapsed="0.225112"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:50:50.499307" elapsed="0.225350"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:50:50.115033" elapsed="0.609685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.727496" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.727363" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.727342" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.732581" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.732471" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.732440" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.733643" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:50.733237" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.734128" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:50.733835" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:50.734197" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:50:50.734360" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:50.732885" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.741501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.741373" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.741354" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.742822" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:50.742694" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.742676" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:50.743369" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.743042" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.743806" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:50.743578" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.776135" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:50.744518" elapsed="0.031823"/>
</kw>
<msg time="2026-05-01T00:50:50.776646" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:50.776696" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.743997" elapsed="0.032738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.844818" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "1 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "l "3 "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:50.777646" elapsed="0.067359"/>
</kw>
<msg time="2026-05-01T00:50:50.845141" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:50.845187" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.777017" elapsed="0.068207"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.845634" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:50.845325" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.845296" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.846358" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "1 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "l "3 "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:50.845971" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.846852" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:50.846604" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.846585" elapsed="0.000444"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:50.847069" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.849402" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.850226" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:50:50.850883" elapsed="0.000239"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:50.848329" elapsed="0.002884"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:50.847391" elapsed="0.003958"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:50.742386" elapsed="0.109090"/>
</kw>
<msg time="2026-05-01T00:50:50.851576" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:50.851621" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.741733" elapsed="0.109926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:50.851845" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:50.851737" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.851718" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.852351" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.852810" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:50.852898" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:50.741072" elapsed="0.111937"/>
</kw>
<msg time="2026-05-01T00:50:50.853103" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:50.853147" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.734784" elapsed="0.118400"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:50.853530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:50.853260" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:50.853243" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:50.734635" elapsed="0.118997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:50.734441" elapsed="0.119224"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:50.732162" elapsed="0.121560"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:50:50.725364" elapsed="0.128415"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:50.724883" elapsed="0.128940"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:50:50.109654" elapsed="0.744222"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.854389" level="INFO">${tools_system_conn_id} = 7</msg>
<var>${tools_system_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:50:50.854037" elapsed="0.000378"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.854929" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:50:50.854605" elapsed="0.000365"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:50:50.856799" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:50:50.856893" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:50:50.856397" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.857123" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:50:50.858555" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:50:51.445353" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:50:51 UTC 2026

  System load:  0.55               Processes:             106
  Usage of /:   19.6% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:50:02 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:50:50.858220" elapsed="0.587298"/>
</kw>
<msg time="2026-05-01T00:50:51.445600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.857853" elapsed="0.587825"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:50:50.855956" elapsed="0.589833"/>
</kw>
<msg time="2026-05-01T00:50:51.445843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.855560" elapsed="0.590329"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:50:50.855172" elapsed="0.590792"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.452033" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:51.451693" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:51.453568" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:50:51.809572" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:51.809947" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 203ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:50:51.810053" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:50:51.810147" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:51.453367" elapsed="0.356833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.812339" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:50:51.811659" elapsed="0.000818"/>
</kw>
<msg time="2026-05-01T00:50:51.812710" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:50:51.812811" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:51.810754" elapsed="0.002110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.814329" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:51.813267" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.817514" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 203ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:51.816959" elapsed="0.000637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.818167" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:51.817821" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.818809" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:51.818447" elapsed="0.000426"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:50:51.815559" elapsed="0.003392"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:51.814624" elapsed="0.004380"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:51.814573" elapsed="0.004469"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:50:51.819275" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:51.819126" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:51.819102" elapsed="0.000524"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:51.819845" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:50:51.819708" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:51.819684" elapsed="0.000293"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:51.820227" elapsed="0.000033"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:51.452811" elapsed="0.367592"/>
</kw>
<msg time="2026-05-01T00:50:51.820515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.452228" elapsed="0.368359"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:50:51.451060" elapsed="0.369683"/>
</kw>
<msg time="2026-05-01T00:50:51.820822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.447019" elapsed="0.373865"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:50:51.446640" elapsed="0.374393"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:51.830411" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:51.830081" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:51.832332" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:50:53.981031" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:53.981557" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attem...</msg>
<msg time="2026-05-01T00:50:53.981728" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:50:53.981881" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:51.831938" elapsed="2.150028"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:53.987565" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:50:53.986413" elapsed="0.001443"/>
</kw>
<msg time="2026-05-01T00:50:53.988204" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:50:53.988370" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:53.982805" elapsed="0.005677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:53.991706" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:53.989116" elapsed="0.002653"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:53.995509" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:53.994928" elapsed="0.000732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:53.996777" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:53.996207" elapsed="0.000707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:53.998027" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:53.997487" elapsed="0.000686"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:50:53.993425" elapsed="0.004898"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:53.992036" elapsed="0.006537"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:53.991996" elapsed="0.006624"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:50:53.999098" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:53.998709" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:53.998684" elapsed="0.000633"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:53.999668" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-05-01T00:50:53.999399" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:53.999375" elapsed="0.000541"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:54.000148" elapsed="0.000033"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:51.831264" elapsed="2.169156"/>
</kw>
<msg time="2026-05-01T00:50:54.000528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.830618" elapsed="2.169988"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:50:51.829434" elapsed="2.171293"/>
</kw>
<msg time="2026-05-01T00:50:54.000806" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.823796" elapsed="2.177077"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:50:51.822994" elapsed="2.178379"/>
</kw>
<msg time="2026-05-01T00:50:54.001473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.822427" elapsed="2.179114"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:51.821945" elapsed="2.179708"/>
</kw>
<msg time="2026-05-01T00:50:54.001713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:51.821265" elapsed="2.180509"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:51.446268" elapsed="2.555611"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.009758" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:54.009414" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:54.011627" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:50:54.868617" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:54.869128" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setupt...</msg>
<msg time="2026-05-01T00:50:54.869236" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:50:54.869328" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:54.011250" elapsed="0.858133"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.874403" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:50:54.873153" elapsed="0.001567"/>
</kw>
<msg time="2026-05-01T00:50:54.875050" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:50:54.875151" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:54.870106" elapsed="0.005096"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.877685" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:54.875768" elapsed="0.001978"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.881000" level="INFO">Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:54.880664" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.881711" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:54.881378" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.882407" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:54.882076" elapsed="0.000427"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:50:54.879762" elapsed="0.002816"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:54.878168" elapsed="0.004505"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:54.878115" elapsed="0.004588"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:50:54.882910" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:54.882763" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:54.882745" elapsed="0.000289"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:54.883218" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:50:54.883089" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:54.883073" elapsed="0.000305"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:54.883630" elapsed="0.000024"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:54.010622" elapsed="0.873154"/>
</kw>
<msg time="2026-05-01T00:50:54.883834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.009953" elapsed="0.873936"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:50:54.008800" elapsed="0.875190"/>
</kw>
<msg time="2026-05-01T00:50:54.884047" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.004747" elapsed="0.879345"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:50:54.004174" elapsed="0.880010"/>
</kw>
<msg time="2026-05-01T00:50:54.884233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.003787" elapsed="0.880490"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:54.003369" elapsed="0.880995"/>
</kw>
<msg time="2026-05-01T00:50:54.884407" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.002727" elapsed="0.881737"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:54.002182" elapsed="0.882372"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:54.892135" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:54.891808" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:54.893973" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-05-01T00:50:56.417101" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:56.418121" level="INFO">${stdout} = Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to b...</msg>
<msg time="2026-05-01T00:50:56.418528" level="INFO">${stderr} =   error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        ...</msg>
<msg time="2026-05-01T00:50:56.418658" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:54.893606" elapsed="1.525111"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.424199" level="INFO">Length is 1821.</msg>
<msg time="2026-05-01T00:50:56.424928" level="FAIL">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:50:56.423213" elapsed="0.002055">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-05-01T00:50:56.425605" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:50:56.425694" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:56.419610" elapsed="0.006128"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.427395" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:56.426102" elapsed="0.001332"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.430715" level="INFO">Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:56.430213" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.431829" level="INFO">  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-o02ao9xb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:56.431237" elapsed="0.001018"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.433834" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:56.433035" elapsed="0.000951"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:50:56.428925" elapsed="0.005223"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:56.427758" elapsed="0.006598"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:56.427709" elapsed="0.006718"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:50:56.434956" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:56.434624" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:56.434583" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:50:56.435874" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:50:56.435354" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:56.435319" elapsed="0.000867"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:56.436569" elapsed="0.000052"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:50:54.892965" elapsed="1.543926"/>
</kw>
<msg time="2026-05-01T00:50:56.437020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.892332" elapsed="1.544800"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:50:54.891171" elapsed="1.546169"/>
</kw>
<msg time="2026-05-01T00:50:56.437490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.887053" elapsed="1.550541"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:50:54.886499" elapsed="1.551316"/>
</kw>
<msg time="2026-05-01T00:50:56.437925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.886067" elapsed="1.551953"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:54.885690" elapsed="1.552519"/>
</kw>
<msg time="2026-05-01T00:50:56.438303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:54.885294" elapsed="1.553103"/>
</kw>
<arg>exabgp==3.4.16</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:50:54.884762" elapsed="1.553868"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:56.439759" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a15d410&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:50:56.438993" elapsed="0.001675"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.469087" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:50:56.479426" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/exa.cfg' -&gt; '/home/jenkins//exa.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${DEFAULT_EXA_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:50:56.441799" elapsed="0.037737"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.486972" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp-l3vpn-ipv4.cfg' -&gt; '/home/jenkins//bgp-l3vpn-ipv4.cfg'</msg>
<arg>${BGP_L3VPN_DIR}/${L3VPN_EXA_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:50:56.479783" elapsed="0.007270"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.494764" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/exabgp_files/exarpc.py' -&gt; '/home/jenkins//exarpc.py'</msg>
<arg>${EXARPCSCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:50:56.487288" elapsed="0.007559"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.504393" level="INFO">6 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
bgp-l3vpn-ipv4.cfg
exa-md5.cfg
exa.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:50:56.504584" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | bgp-l3vpn-ipv4.cfg | exa-md5.cfg | exa.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:50:56.495081" elapsed="0.009541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.505417" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:50:56.517767" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.505180" elapsed="0.012717"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.518692" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:50:56.567898" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.518267" elapsed="0.049763"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.568762" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:50:56.615925" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.568406" elapsed="0.047656"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.616814" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:50:56.663605" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.616449" elapsed="0.047288"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.664430" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:50:56.712125" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:56.712359" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.664125" elapsed="0.048293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.713611" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:56.712916" elapsed="0.000812"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:50:56.504968" elapsed="0.208837"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.714706" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:50:56.763880" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.714399" elapsed="0.049609"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.764808" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:50:56.812080" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.764389" elapsed="0.047826"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.812960" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:50:56.860355" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.812642" elapsed="0.047898"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.861274" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:50:56.908177" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.860939" elapsed="0.047379"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.909084" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:50:56.955747" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:56.956039" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.908755" elapsed="0.047347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:56.957247" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:56.956610" elapsed="0.000758"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:50:56.714070" elapsed="0.243433"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:56.958649" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:50:57.003561" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:56.958231" elapsed="0.045464"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.004543" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:50:57.051572" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.004120" elapsed="0.047587"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.052398" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:50:57.099946" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.052088" elapsed="0.047943"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.100489" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:50:57.148008" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.100271" elapsed="0.047877"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.148928" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:50:57.195898" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:57.196130" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.148586" elapsed="0.047605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.197376" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.254;
      rd 1.2.3.4:1;
      label 24005;
    }
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:57.196680" elapsed="0.000834"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:50:56.957890" elapsed="0.239704"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.198600" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:50:57.243943" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.198192" elapsed="0.045885"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.244869" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:50:57.291832" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.244486" elapsed="0.047475"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.292689" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:50:57.340281" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.292334" elapsed="0.048103"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.341175" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:50:57.388651" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.340860" elapsed="0.048026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.389984" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:50:57.436063" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:57.436298" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.389527" elapsed="0.046830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.437616" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:57.436887" elapsed="0.000837"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:50:57.197864" elapsed="0.239939"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.438835" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:50:57.484392" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.438431" elapsed="0.046129"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.485352" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:50:57.532169" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.484943" elapsed="0.047358"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.533101" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:50:57.580258" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.532750" elapsed="0.047639"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.581262" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:50:57.628246" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.580803" elapsed="0.047573"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.629109" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-05-01T00:50:57.680172" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:57.680385" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 u...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.628798" elapsed="0.051646"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.681539" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
    ipv4 mpls-vpn;
  }

  process exarpcserver {
    run exarpc.py --host 10.30.170.157;
    encoder json;
    receive-routes;
    neighbor-changes;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:57.680896" elapsed="0.000763"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-05-01T00:50:57.438097" elapsed="0.243638"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.682721" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:50:57.727970" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.682314" elapsed="0.045789"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.728898" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:50:57.780299" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.728519" elapsed="0.051913"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.781184" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:50:57.827978" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.780845" elapsed="0.047265"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.828870" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:50:57.880133" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.828531" elapsed="0.051734"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.880998" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:50:57.928312" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:50:57.928573" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:50:57.880687" elapsed="0.047953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.929745" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:57.929052" elapsed="0.000803"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:50:57.681992" elapsed="0.247941"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:50:56.504719" elapsed="1.425287"/>
</for>
<doc>Uploads exabgp config files and needed scripts</doc>
<status status="PASS" start="2026-05-01T00:50:56.441208" elapsed="1.488944"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:50.109326" elapsed="7.820943"/>
</kw>
<test id="s1-s12-t1" name="Configure_App_Peer" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:57.937930" elapsed="0.000580"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:57.937221" elapsed="0.001436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:57.941197" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:57.940987" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:57.940952" elapsed="0.000347"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:57.947570" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:57.947391" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:57.947364" elapsed="0.000310"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.948939" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:57.948417" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:57.949523" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:57.949189" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:57.949596" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:50:57.949886" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:57.947991" elapsed="0.001921"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:57.955911" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:57.955772" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:57.955744" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:57.957483" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:57.957345" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:57.957324" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:57.958051" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:57.957718" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.958499" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:57.958252" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:57.989448" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:57.959064" elapsed="0.030643"/>
</kw>
<msg time="2026-05-01T00:50:57.989949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:57.989999" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:57.958702" elapsed="0.031335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.032631" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:57.990826" elapsed="0.042062"/>
</kw>
<msg time="2026-05-01T00:50:58.033178" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:58.033230" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "C "o "n "f "i "g "u "r "e...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:57.990321" elapsed="0.042948"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.033840" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.033400" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.033361" elapsed="0.000578"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.034560" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.034100" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.034972" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.034709" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.034686" elapsed="0.000370"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:58.035097" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:58.038175" elapsed="0.000226"/>
</kw>
<msg time="2026-05-01T00:50:58.038517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.036831" elapsed="0.001906"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.039484" elapsed="0.000115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.040001" elapsed="0.000111"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:58.036102" elapsed="0.004171"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:58.035469" elapsed="0.004909"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:57.956967" elapsed="0.083622"/>
</kw>
<msg time="2026-05-01T00:50:58.040799" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.040862" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "C "o "n "f "i "g "u "r "e...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:57.956201" elapsed="0.084714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:58.041235" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:50:58.041073" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.040999" elapsed="0.000365"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.041918" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.042274" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.042347" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:57.955312" elapsed="0.087162"/>
</kw>
<msg time="2026-05-01T00:50:58.042575" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.042642" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "C "o "n "f "i "g "u "r "e...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:57.950331" elapsed="0.092352"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.043023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.042763" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.042744" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:57.950177" elapsed="0.092949"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:57.949976" elapsed="0.093184"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:57.946857" elapsed="0.096362"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:57.940522" elapsed="0.102755"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:57.939052" elapsed="0.104274"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:57.931809" elapsed="0.111572"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.044097" level="INFO">&amp;{mapping} = { BGP_RIB=example-bgp-rib | IP=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.043585" elapsed="0.000540"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.080187" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.079757" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.081189" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.080781" elapsed="0.000489">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.081368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.080405" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.081981" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.081587" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.082325" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.082544" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.082178" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.083065" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.082814" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.084205" level="INFO">mapping: {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.083944" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.084962" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.084420" elapsed="0.000570"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.085711" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.085391" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.086524" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.086282" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.086604" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:50:58.086772" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.085949" elapsed="0.000849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.086961" elapsed="0.000244"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:58.085248" elapsed="0.002001"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.087855" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.087539" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.088654" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.088422" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.088733" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:50:58.088895" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.088087" elapsed="0.000835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.089099" elapsed="0.000235"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:50:58.087368" elapsed="0.002008"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:58.085068" elapsed="0.004346"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:58.089475" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:58.089638" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:58.083588" elapsed="0.006077"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.083195" elapsed="0.006503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.089893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.089730" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.083170" elapsed="0.006800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.090784" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.090125" elapsed="0.000689"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.090865" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.078997" elapsed="0.011997"/>
</kw>
<msg time="2026-05-01T00:50:58.091054" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.065535" elapsed="0.025573"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.104085" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.117136" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.130052" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.130391" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.130606" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.131060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.130901" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.130883" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.131296" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.131489" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.131665" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.130842" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.130692" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.131903" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.131984" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:50:58.132160" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.060881" elapsed="0.071308"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.160429" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.160023" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.161306" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.161040" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.161496" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.160666" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.162164" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.161774" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.162521" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.162696" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.162360" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.163134" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.162890" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:58.163621" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.163267" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.164155" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.163863" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.163712" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.163239" elapsed="0.000999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.165177" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.164391" elapsed="0.000846"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.165305" elapsed="0.000047"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.159356" elapsed="0.006117"/>
</kw>
<msg time="2026-05-01T00:50:58.165531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.146122" elapsed="0.019463"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.178247" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.190873" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.203673" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.203871" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.204096" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.204500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.204336" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.204322" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.204735" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.204906" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.205092" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.204291" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.204178" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.205325" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.205400" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:58.205536" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.143150" elapsed="0.062415"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.206861" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.206596" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.207019" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.206239" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.207363" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.207113" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.207942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.207651" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.207443" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.207095" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.210408" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.208181" elapsed="0.002254"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:58.210500" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.210662" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:58.205909" elapsed="0.004778"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.212213" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.211967" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.212671" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.212418" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.213161" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.212876" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.213623" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.213361" elapsed="0.000344"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:58.214547" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:50:58.214326" elapsed="0.000248"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:50:58.214940" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:50:58.214732" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.215125" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.215765" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.215512" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:50:58.215851" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:58.216008" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:50:58.213917" elapsed="0.002116"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:58.233505" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:50:58.233639" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:50:58 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:58.233873" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:58.219802" elapsed="0.014128"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.216103" elapsed="0.017931"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.234480" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.234094" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.216085" elapsed="0.018603"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.241943" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.236864" elapsed="0.005221"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.236333" elapsed="0.005789"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.236293" elapsed="0.005854"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.244781" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.242430" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.242203" elapsed="0.002658"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.242186" elapsed="0.002699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.245507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.245094" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.245876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.245610" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.246427" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.246128" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.245957" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.245588" elapsed="0.000942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.247064" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.246699" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.247402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.247160" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.248023" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.247727" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.247554" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.247143" elapsed="0.000963"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.248264" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:58.249130" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.248798" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.249317" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:58.235537" elapsed="0.016206"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:58.251916" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:50:58.251809" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.251791" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.252163" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.252230" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:58.254587" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:58.211166" elapsed="0.043447"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.254678" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:50:58.254830" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:58.049101" elapsed="0.205754"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.255198" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.254952" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.254935" elapsed="0.000355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.255323" elapsed="0.000026"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:50:58.044394" elapsed="0.211053"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-05-01T00:50:57.930411" elapsed="0.325178"/>
</test>
<test id="s1-s12-t2" name="Reconfigure_ODL_To_Accept_Connection" line="65">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:58.259094" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:58.258824" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.260388" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.260279" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.260261" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.265602" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.265494" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.265475" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.266675" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.266280" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.267158" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:58.266865" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:58.267227" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:58.267383" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.265900" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.273110" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.273001" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.272982" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.274371" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.274264" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.274247" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:58.274916" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.274617" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.275324" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:58.275105" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.305550" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:58.275873" elapsed="0.029843"/>
</kw>
<msg time="2026-05-01T00:50:58.305909" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:58.305955" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.275531" elapsed="0.030461"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.337002" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:58.306636" elapsed="0.030559"/>
</kw>
<msg time="2026-05-01T00:50:58.337415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:58.337501" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "R "e "c "o "n "f "i "g "u...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.306211" elapsed="0.031352"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.338012" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.337687" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.337650" elapsed="0.000451"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.338671" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.338255" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.339055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.338827" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.338807" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:58.339174" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:58.342163" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:50:58.342380" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.340886" elapsed="0.001656"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.342830" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.343213" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:58.340165" elapsed="0.003241"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:58.339538" elapsed="0.003954"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:58.273966" elapsed="0.069631"/>
</kw>
<msg time="2026-05-01T00:50:58.343791" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.343839" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "R "e "c "o "n "f "i "g "u...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.273335" elapsed="0.070543"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:58.344091" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:50:58.343959" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.343939" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.344634" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.345017" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.345100" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:58.272639" elapsed="0.072588"/>
</kw>
<msg time="2026-05-01T00:50:58.345324" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.345370" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "R "e "c "o "n "f "i "g "u...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.267859" elapsed="0.077550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.345797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.345513" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.345487" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:58.267709" elapsed="0.078193"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:58.267522" elapsed="0.078417"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:58.265119" elapsed="0.080882"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:58.259987" elapsed="0.086072"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.259542" elapsed="0.086566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:58.256337" elapsed="0.089830"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.347072" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB=example-bgp-rib | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB_OPENCONFIG=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.346389" elapsed="0.000713"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.382904" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.382521" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.383774" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.383495" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.383951" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.383103" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.384576" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.384148" elapsed="0.000456"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.384929" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.385148" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.384775" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.385635" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.385339" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.386705" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB': 'example-bgp-rib', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.386388" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.387187" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.386919" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.387955" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.387615" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.388772" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.388526" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.388853" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:50:58.389045" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.388180" elapsed="0.000890"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.389231" elapsed="0.000264"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:50:58.387468" elapsed="0.002069"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.390115" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.389793" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.390885" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.390673" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.390980" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:50:58.391139" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.390334" elapsed="0.000830"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.391320" elapsed="0.000241"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:58.389654" elapsed="0.001948"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.392362" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.391857" elapsed="0.000532"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.393176" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.392944" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.393255" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.393411" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.392603" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.393613" elapsed="0.000226"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:50:58.391718" elapsed="0.002162"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.394479" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.394134" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.395237" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.395028" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.395325" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:50:58.395517" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.394704" elapsed="0.000839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.395703" elapsed="0.000225"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:50:58.393995" elapsed="0.002009"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.396607" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.396264" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.397382" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.397172" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.397472" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:50:58.397653" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.396830" elapsed="0.000849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.397838" elapsed="0.000226"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:50:58.396125" elapsed="0.001980"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.398703" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.398359" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.399488" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.399255" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.399567" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.399740" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.398926" elapsed="0.000843"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.399928" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:50:58.398220" elapsed="0.001977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.400774" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.400468" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:50:58.401605" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.401375" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:50:58.401683" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.401837" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:50:58.401048" elapsed="0.000815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.402039" elapsed="0.000226"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:50:58.400312" elapsed="0.001995"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:50:58.387266" elapsed="0.015077"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:58.402387" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:50:58.402569" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB': 'example-bgp-rib', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:58.386058" elapsed="0.016538"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.385753" elapsed="0.016875"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.402808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.402653" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.385734" elapsed="0.017151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.403762" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.403059" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.403844" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.381857" elapsed="0.022117"/>
</kw>
<msg time="2026-05-01T00:50:58.404029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.368490" elapsed="0.035596"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.417496" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.430548" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.443748" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.443953" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.444136" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.444551" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.444376" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.444353" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.444930" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.445110" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.445282" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.444315" elapsed="0.001021"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.444210" elapsed="0.001153"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.445549" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.445633" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:58.445760" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.363977" elapsed="0.081811"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.473494" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.473104" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.474276" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.474063" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.474490" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.473691" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.475102" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.474688" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.475437" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.475590" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.475300" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.476055" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.475788" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:58.476491" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.476175" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.477072" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB': 'example-bgp-rib', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.476728" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.476577" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.476156" elapsed="0.001008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.477993" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.477318" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.478073" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.472426" elapsed="0.005796"/>
</kw>
<msg time="2026-05-01T00:50:58.478279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.459056" elapsed="0.019270"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.491767" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.504933" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.518006" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.518266" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.518489" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.518882" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.518720" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.518706" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.519109" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.519281" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.519449" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.518676" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.518569" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.519727" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.519804" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:58.519930" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.456248" elapsed="0.063711"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.521327" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.521068" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.521501" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.520687" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.521877" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.521599" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.522433" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.522140" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.521960" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.521581" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.525030" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.522697" elapsed="0.002363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:58.525113" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.525272" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:58.520301" elapsed="0.004996"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.526751" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.526497" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.527213" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.526958" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.527704" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.527429" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.528201" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.527958" elapsed="0.000290"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:58.529147" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:50:58.528942" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:50:58.529568" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:50:58.529345" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.529754" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.530371" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.530124" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:50:58.530486" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:50:58.530661" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:50:58.528495" elapsed="0.002192"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:58.545146" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '295', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:50:58.545206" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:58.545306" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:58.533176" elapsed="0.012156"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.530764" elapsed="0.014614"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.545667" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.545408" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.530743" elapsed="0.015135"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.553779" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.548158" elapsed="0.005666"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.547613" elapsed="0.006246"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.547572" elapsed="0.006313"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.556551" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.554172" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.553943" elapsed="0.002690"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.553926" elapsed="0.002732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.557279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.556878" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.557646" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.557378" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.558225" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.557920" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.557728" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.557360" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.558856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.558491" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.559225" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.558969" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.559846" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.559544" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.559357" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.558943" elapsed="0.000988"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.560114" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:58.561046" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.560665" elapsed="0.000410"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.561248" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:58.546758" elapsed="0.016898"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:50:58.563828" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:50:58.563723" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.563705" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.564072" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.564139" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:58.566533" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:58.525655" elapsed="0.040906"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.566629" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:58.566814" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:58.352230" elapsed="0.214611"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.567196" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.566945" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.566926" elapsed="0.000363"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.567324" elapsed="0.000027"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:50:58.347402" elapsed="0.220047"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:50:58.255808" elapsed="0.311785"/>
</test>
<test id="s1-s12-t3" name="L3vpn_Ipv4_To_Odl" line="80">
<kw name="Setup_Testcase" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:50:58.572037" elapsed="0.000334"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:50:58.571577" elapsed="0.000895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.573967" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.573814" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.573786" elapsed="0.000280"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.581486" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.581311" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.581285" elapsed="0.000303"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.582646" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.582234" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.583134" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:50:58.582840" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:50:58.583249" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:50:58.583428" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.581828" elapsed="0.001643"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.589400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.589290" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.589272" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.590857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.590703" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.590686" elapsed="0.000339"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:50:58.591619" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.591181" elapsed="0.000465"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.592136" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:58.591866" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.625203" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:58.593735" elapsed="0.031641"/>
</kw>
<msg time="2026-05-01T00:50:58.625565" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:50:58.625613" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.592367" elapsed="0.033283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.649380" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "L "3 "v "p "n "_ "I "p "v "4 "_ "T "o "_ "O "d "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:50:58.627199" elapsed="0.022356"/>
</kw>
<msg time="2026-05-01T00:50:58.649705" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:50:58.649750" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "L "3 "v "p "n "_ "I "p "v...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.625891" elapsed="0.023896"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.650218" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.649916" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.649895" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.651162" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "L "3 "v "p "n "_ "I "p "v "4 "_ "T "o "_ "O "d "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.650596" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.651671" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.651354" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.651335" elapsed="0.000528"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:50:58.651900" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:50:58.654425" elapsed="0.000176"/>
</kw>
<msg time="2026-05-01T00:50:58.654645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.653902" elapsed="0.000809"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.654929" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.655150" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:50:58.653040" elapsed="0.002258"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:50:58.652181" elapsed="0.003211"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:50:58.590312" elapsed="0.065255"/>
</kw>
<msg time="2026-05-01T00:50:58.655668" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.655713" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "L "3 "v "p "n "_ "I "p "v...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.589648" elapsed="0.066104"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:50:58.655943" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:50:58.655830" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.655811" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.656476" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.656932" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.657008" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:50:58.588945" elapsed="0.068172"/>
</kw>
<msg time="2026-05-01T00:50:58.657212" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:50:58.657255" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "L "3 "v "p "n "_ "I "p "v...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.583885" elapsed="0.073407"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.657644" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.657369" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.657351" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:50:58.583716" elapsed="0.074030"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:50:58.583533" elapsed="0.074244"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:50:58.580732" elapsed="0.077100"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:50:58.573374" elapsed="0.084512"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.572701" elapsed="0.085230"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:50:58.568816" elapsed="0.089168"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Empty_Reported_Data">
<kw name="Verify_Empty_Data_Neon">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.712093" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.711206" elapsed="0.000929"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.713435" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.712908" elapsed="0.000678">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.713824" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.712370" elapsed="0.001490"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.714735" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.714103" elapsed="0.000671"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.715313" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.715576" level="INFO">${template} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.715017" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.716351" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.715916" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.718496" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.717736" elapsed="0.000944"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.719998" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.719040" elapsed="0.001057"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.721083" elapsed="0.000088"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.721618" elapsed="0.000155"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.722112" elapsed="0.000086"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.720693" elapsed="0.001571"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.720215" elapsed="0.002147"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:50:58.722502" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:50:58.722887" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:50:58.717177" elapsed="0.005744"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.716519" elapsed="0.006445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.723208" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.722999" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.716491" elapsed="0.006820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.724278" level="INFO">${final_text} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.723536" elapsed="0.000780"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.724382" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.710437" elapsed="0.014145"/>
</kw>
<msg time="2026-05-01T00:50:58.724661" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.697151" elapsed="0.027577"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.738856" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.751860" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.764701" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.764971" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.765155" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.765552" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.765382" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.765367" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.765786" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.765959" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.766129" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.765336" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.765229" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.766359" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.766434" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:50:58.766577" level="INFO">${uri} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.692692" elapsed="0.073916"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.767943" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.767671" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.768106" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.767302" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.768477" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.768200" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.769082" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.768752" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.768561" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.768182" elapsed="0.000981"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.771615" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.769318" elapsed="0.002326"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:50:58.771699" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:50:58.771905" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:58.766967" elapsed="0.004965"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.773210" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.773013" elapsed="0.000251"/>
</kw>
<msg time="2026-05-01T00:50:58.773350" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.772622" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.773602" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.773446" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.773426" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.774057" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.774216" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.773888" elapsed="0.000354"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:50:58.774667" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.774407" elapsed="0.000286"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:50:58.774745" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:50:58.774904" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:50:58.772273" elapsed="0.002655"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.776563" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.776295" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.777044" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.776797" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:58.788332" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:58.788616" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '154'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:50:58.788750" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:58.781039" elapsed="0.007793"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.777156" elapsed="0.011725"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.789072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.788908" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.777137" elapsed="0.012021"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.794224" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.790414" elapsed="0.003878"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.790104" elapsed="0.004239"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.790079" elapsed="0.004299"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.798135" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.794803" elapsed="0.003396"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.794480" elapsed="0.003767"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.794434" elapsed="0.003849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.799094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.798550" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.799588" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.799228" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.800397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.799941" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.799706" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.799203" elapsed="0.001339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.801363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.800829" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.801794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.801523" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.802391" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.802093" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.801915" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.801496" elapsed="0.001005"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.802664" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:50:58.803544" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.803215" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:50:58.803755" elapsed="0.002405"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:50:58.789539" elapsed="0.016684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.806403" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:50:58.806294" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.806276" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:58.809417" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.806652" elapsed="0.002793"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:50:58.809514" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:50:58.809678" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:50:58.775282" elapsed="0.034422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.809766" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:50:58.809915" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:50:58.669409" elapsed="0.140531"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.882912" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.882085" elapsed="0.000911"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.884489" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.884227" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:50:58.884785" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:50:58.883269" elapsed="0.001596"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.886077" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.885140" elapsed="0.001018"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:50:58.886836" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:50:58.887106" level="INFO">${template} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:50:58.886441" elapsed="0.000746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.888122" level="INFO">{
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
                "uptodate": "*"
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.887516" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:50:58.889210" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.888387" elapsed="0.000922"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.890193" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.889701" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.889371" elapsed="0.000908"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.888352" elapsed="0.001985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.891584" level="INFO">${final_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:50:58.890568" elapsed="0.001100"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.891754" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:50:58.880931" elapsed="0.011077"/>
</kw>
<msg time="2026-05-01T00:50:58.892064" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.824885" elapsed="0.067231"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.905150" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.917973" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.930907" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.931111" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.931292" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.931737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.931585" elapsed="0.000351"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:50:58.931571" elapsed="0.000393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.932113" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.932285" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.932470" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:50:58.931537" elapsed="0.001023"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.931371" elapsed="0.001217"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.932775" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:50:58.932855" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:50:58.932975" level="INFO">${expected_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:50:58.822134" elapsed="0.110868"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.933184" elapsed="0.002284"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:58.936633" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.936221" elapsed="0.000440"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:50:58.937193" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:50:58.936834" elapsed="0.000387"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:50:58.937386" elapsed="0.000514"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:50:58.935803" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.935550" elapsed="0.002448"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:50:58.938178" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:50:58.938024" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.935531" elapsed="0.002724"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:50:58.811077" elapsed="0.127226"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:50:58.810267" elapsed="0.128113"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.810023" elapsed="0.128403"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.810006" elapsed="0.128443"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:50:58.938501" elapsed="0.000030"/>
</return>
<arg>${BGP_L3VPN_DIR}${/}empty_route</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:50:58.663016" elapsed="0.275617"/>
</kw>
<doc>Verify empty data on neon</doc>
<status status="PASS" start="2026-05-01T00:50:58.658824" elapsed="0.279875"/>
</kw>
<doc>Verfiy empty data response</doc>
<status status="PASS" start="2026-05-01T00:50:58.658583" elapsed="0.280165"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Empty_Reported_Data</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:58.658146" elapsed="0.280646"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.942184" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.941862" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.942634" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.942373" elapsed="0.000305"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.945959" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:58.943288" elapsed="0.002812"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.951336" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:50:58.951583" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:50:58.946608" elapsed="0.005037"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.953209" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.952484" elapsed="0.000836"/>
</kw>
<status status="PASS" start="2026-05-01T00:50:58.951808" elapsed="0.001613"/>
</branch>
<status status="PASS" start="2026-05-01T00:50:58.951763" elapsed="0.001766"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:50:58.942926" elapsed="0.010708"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:50:58.955502" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg</msg>
<msg time="2026-05-01T00:50:58.955595" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:50:58.953821" elapsed="0.001804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.956083" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.955813" elapsed="0.000317"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:50:58.941537" elapsed="0.014649"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.958485" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:50:58.958069" elapsed="0.000454"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.960955" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:50:58.958712" elapsed="0.002272"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:50:58.966862" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:50:58.967001" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:50:58.967110" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:50:58.961157" elapsed="0.005980"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.969850" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:50:58.967312" elapsed="0.002588"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:50:58.972842" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:50:58.970090" elapsed="0.002837">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:50:58.957575" elapsed="0.015480">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:01.976135" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:01.975165" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:01.981262" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:01.976639" elapsed="0.004663"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:01.988955" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:01.990592" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1671'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true},"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true},"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-05-01T00:51:01.990862" level="INFO">${rsp} = &lt;Response [200]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:01.981563" elapsed="0.009340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:01.995118" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.170.157","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true},"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true},"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}}]},"peer-role":"ibgp"}]}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:01.991181" elapsed="0.004027"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-05-01T00:51:01.995473" elapsed="0.003786"/>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="PASS" start="2026-05-01T00:51:01.973907" elapsed="0.025455"/>
</kw>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:50:58.957022" elapsed="3.042424"/>
</kw>
<msg time="2026-05-01T00:51:01.999628" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:01.999694" level="INFO">${value} = None</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:50:58.956370" elapsed="3.043358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.000367" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:01.999885" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:01.999849" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-05-01T00:51:02.000767" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-05-01T00:51:02.000594" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.000571" elapsed="0.000348"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:50:58.941334" elapsed="3.059624"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:50:58.941114" elapsed="3.059897"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.001250" elapsed="0.000031"/>
</kw>
<arg>${cfg_file}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="PASS" start="2026-05-01T00:50:58.939112" elapsed="3.062258"/>
</kw>
<arg>${L3VPN_EXA_CFG}</arg>
<doc>Verifies initial test condition and starts the exabgp</doc>
<status status="PASS" start="2026-05-01T00:50:58.568417" elapsed="3.433063"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Reported_Data">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.057102" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.056697" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.057955" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.057679" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.058128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.057316" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.058735" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.058327" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.059075" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:02.059309" level="INFO">${template} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.058932" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.059776" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.059520" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.060935" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.060621" elapsed="0.000360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.061424" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:02.061150" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.061812" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.062028" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.062208" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.061671" elapsed="0.000595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.061529" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:02.062344" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:02.062532" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:02.060272" elapsed="0.002286"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.059902" elapsed="0.002689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.062777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.062616" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.059879" elapsed="0.002975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.063449" level="INFO">${final_text} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.063005" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.063544" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:02.056046" elapsed="0.007625"/>
</kw>
<msg time="2026-05-01T00:51:02.063727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.042787" elapsed="0.020990"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.077097" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.091118" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.104025" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.104355" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.104565" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.104991" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.104832" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:02.104814" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.105226" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.105399" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.105587" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.104773" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.104649" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.105822" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.105903" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:51:02.106066" level="INFO">${uri} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:02.038353" elapsed="0.067741"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.107558" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.107236" elapsed="0.000397">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.107729" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.106829" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.108133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.107826" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.108718" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.108406" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.108217" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.107807" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.111192" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.108958" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:02.111271" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:02.111432" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:02.106442" elapsed="0.005039"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.112783" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.112526" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.112985" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.112170" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:51:02.113221" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:02.113083" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.113064" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.113564" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.113744" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.113811" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:51:02.115980" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:02.111803" elapsed="0.004205"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.117446" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.117188" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.117912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.117669" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:02.126865" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:02.127211" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '295'} 
 body={"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}} 
 </msg>
<msg time="2026-05-01T00:51:02.127332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:02.120178" elapsed="0.007180"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.118023" elapsed="0.009379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.127620" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.127430" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.118005" elapsed="0.009704"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.132410" level="INFO">{"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","prefix":"1.1.1.0/24","route-distinguisher":"1.2.3.4:1","attributes":{"origin":{"value":"igp"},"ipv4-next-hop":{"global":"10.0.255.254"},"local-pref":{"pref":100}},"label-stack":[{"label-value":24005}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.128872" elapsed="0.003628"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.128607" elapsed="0.003943"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.128588" elapsed="0.003997"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.136537" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.133001" elapsed="0.003604"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.132666" elapsed="0.003990"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.132642" elapsed="0.004051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.137570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.136965" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.138076" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.137715" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.138908" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.138447" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.138197" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.137688" elapsed="0.001343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.139833" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.139274" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.140374" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.140017" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.141135" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.140835" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.140590" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.139989" elapsed="0.001231"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.141383" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:02.142229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.141925" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:02.142415" elapsed="0.002417"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:02.128151" elapsed="0.016749"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.145084" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.144972" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.144953" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.148414" level="INFO">${text_normalized} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.145311" elapsed="0.003133"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:51:02.148513" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:51:02.148684" level="INFO">${response_text} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:02.116338" elapsed="0.032372"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.148774" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:51:02.148929" level="INFO">${response_text} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:02.014469" elapsed="0.134486"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.177846" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.177353" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.178733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.178386" elapsed="0.000477">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.179043" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.178045" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.179706" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.179241" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.180086" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:02.180268" level="INFO">${template} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.179907" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.180794" level="INFO">{
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origin": {
      "value": "igp"
     }
    },
    "label-stack": [
     {
      "label-value": 24005
     }
    ],
    "path-id": 0,
    "prefix": "1.1.1.0/24",
    "route-distinguisher": "1.2.3.4:1",
    "route-key": "WAABAQIDBAABAQEB"
   }
  ]
 }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.180523" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:02.181321" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.180911" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.182085" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.181576" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.181407" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.180892" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.182812" level="INFO">${final_text} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.182321" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.182890" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:02.176733" elapsed="0.006285"/>
</kw>
<msg time="2026-05-01T00:51:02.183072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.163704" elapsed="0.019418"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.196567" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.209219" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/bgp_l3vpn_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.221971" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.222171" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.222353" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.222767" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.222603" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:02.222589" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.223024" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.223198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.223405" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.222557" elapsed="0.000916"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.222432" elapsed="0.001071"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.223659" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.223739" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:02.223863" level="INFO">${expected_text} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:02.161002" elapsed="0.062889"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.224135" elapsed="0.002229"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.227594" level="INFO">${expected_normalized} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.227131" elapsed="0.000492"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.228207" level="INFO">${actual_normalized} = {
 "bgp-vpn-ipv4:vpn-ipv4-routes": {
  "vpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "10.0.255.254"
     },
     "local-pref": {
      "pref": 100
     },
     "origi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.227783" elapsed="0.000452"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:02.228396" elapsed="0.000344"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:02.226709" elapsed="0.002091"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.226445" elapsed="0.002389"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.229015" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.228860" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.226427" elapsed="0.002666"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:51:02.150118" elapsed="0.079023"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:51:02.149296" elapsed="0.079920"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.149040" elapsed="0.080221"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.149023" elapsed="0.080263"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.229320" elapsed="0.000029"/>
</return>
<arg>${BGP_L3VPN_DIR}${/}${exprspdir}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:51:02.007533" elapsed="0.221916"/>
</kw>
<arg>${L3VPN_RSP}</arg>
<doc>Verifies expected response</doc>
<status status="PASS" start="2026-05-01T00:51:02.002419" elapsed="0.227112"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>Verify_Reported_Data</arg>
<arg>${L3VPN_RSP}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:02.001751" elapsed="0.227827"/>
</kw>
<kw name="Teardown_Simple" type="TEARDOWN">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.230623" level="INFO">[?2004l00:50:59 | 2902   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:50:59 | 2902   | [01;34mversion      [0m | [1m4.2.17  [0m
00:50:59 | 2902   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:50:59 | 2902   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:50:59 | 2902   | [01;34minstallation [0m | [1m        [0m
00:50:59 | 2902   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:50:59 | 2902   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:50:59 | 2902   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:50:59 | 2902   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:50:59 | 2902   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:50:59 | 2902   | configuration[0m | . local-as         | '64496'[0m
00:50:59 | 2902   | configuration[0m | . peer-as          | '64496'[0m
00:50:59 | 2902   | configuration[0m | &gt; family           | [0m
00:50:59 | 2902   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:50:59 | 2902   | configuration[0m | &lt; family           | [0m
00:50:59 | 2902   | configuration[0m | &gt; static           | [0m
00:50:59 | 2902   | configuration[0m | &gt; route            | '1.1.1.0/24'[0m
00:50:59 | 2902   | configuration[0m | . next-hop         | '10.0.255.254'[0m
00:50:59 | 2902   | configuration[0m | . rd               | '1.2.3.4:1'[0m
00:50:59 | 2902   | configuration[0m | . label            | '24005'[0m
00:50:59 | 2902   | configuration[0m | &lt; route            | [0m
00:50:59 | 2902   | configuration[0m | &lt; static           | [0m
00:50:59 | 2902   | configuration[0m | &lt; neighbor         | [0m
00:50:59 | 2902   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:50:59 | 2902   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:50:59 | 2902   | reactor      [0m | initialising connection to peer-1[0m
00:50:59 | 2902   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8002 0641 0400 00FB F002 0206 00[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 mpls-vpn), Extended Message(65535), ASN4(64496)][0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 00D9 01[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload ( 198) 04FB F000 B4C0 0002 02BC 02BA 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0001 0004 0104 0001 0085 0104 0002 0004 0104 0001 0081 0104 0001 0084 0104 0002 0081 0104 0002 0080 0104 0001 0086 0104 0002 0086 0104 0002 0085 0104 0002 0005 0104 0001 0080 0104 0001 0005 0104 4004 0047 0104 0019 0046 0104 0002 0001 4046 003C 4004 4700 0001 0100 0002 8600 0001 0500 0001 8400 0002 8500 0002 8100 0001 8600 0002 8000 0001 8500 0002 0400 0001 8100 0001 8000 0001 0400 0002 0100 0019 4600 0002 0500 4700[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv4 nlri-mpls,ipv4 flow,ipv6 nlri-mpls,ipv4 unknown safi 129,ipv4 rtc,ipv6 unknown safi 129,ipv6 mpls-vpn,ipv4 flow-vpn,ipv6 flow-vpn,ipv6 flow,ipv6 unknown safi 5,ipv4 mpls-vpn,ipv4 unknown safi 5,bgp-ls bgp-ls,l2vpn evpn,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 60 bgp-ls/bgp-ls=0x0 ipv4/unicast=0x0 ipv6/flow-vpn=0x0 ipv4/unknown safi 5=0x0 ipv4/rtc=0x0 ipv6/flow=0x0 ipv6/unknown safi 129=0x0 ipv4/flow-vpn=0x0 ipv6/mpls-vpn=0x0 ipv4/flow=0x0 ipv6/nlri-mpls=0x0 ipv4/unknown safi 129=0x0 ipv4/mpls-vpn=0x0 ipv4/nlri-mpls=0x0 ipv6/unicast=0x0 l2vpn/evpn=0x0 ipv6/unknown safi 5=0x0, ASN4(64496), Unassigned 71][0m
00:50:59 | 2902   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/nlri-mpls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unicast[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 5[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 129[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for l2vpn/evpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 5[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/nlri-mpls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 129[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/mpls-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/rtc[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for bgp-ls/bgp-ls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:50:59 | 2902   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:50:59 | 2902   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  79) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004F 0200 0000 3840 0101 0040 0200 4003 040A 00FF FE40 0504 0000 0064 800E 2000 0180 0C00 0000 0000 0000 000A 00FF FE00 7005 DC51 0001 0102 0304 0001 0101 01[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0180[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; EOR ipv4 mpls-vpn[0m
00:50:59 | 2902   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0180[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0180[0m
00:50:59 | 2902   | routes       [0m | withdrawn NLRI none[0m
00:50:59 | 2902   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 80[0m
00:50:59 | 2902   | routes       [0m | announced NLRI none[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/128 (ipv4 mpls-vpn)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:51:00 | 2902   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:51:00 | 2902   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:51:01 | 2902   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:51:01 | 2902   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:51:02 | 2902   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:51:02 | 2902   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-05-01T00:51:02.230922" level="INFO">${output} = [?2004l00:50:59 | 2902   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:50:59 | 2902   | [01;34mversion      [0m | [1m4.2.17  [0m
00:50:59 | 2902   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:51:02.230481" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.231364" level="INFO">[?2004l00:50:59 | 2902   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:50:59 | 2902   | [01;34mversion      [0m | [1m4.2.17  [0m
00:50:59 | 2902   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:50:59 | 2902   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:50:59 | 2902   | [01;34minstallation [0m | [1m        [0m
00:50:59 | 2902   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:50:59 | 2902   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:50:59 | 2902   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:50:59 | 2902   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:50:59 | 2902   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:50:59 | 2902   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:50:59 | 2902   | configuration[0m | . local-as         | '64496'[0m
00:50:59 | 2902   | configuration[0m | . peer-as          | '64496'[0m
00:50:59 | 2902   | configuration[0m | &gt; family           | [0m
00:50:59 | 2902   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:50:59 | 2902   | configuration[0m | &lt; family           | [0m
00:50:59 | 2902   | configuration[0m | &gt; static           | [0m
00:50:59 | 2902   | configuration[0m | &gt; route            | '1.1.1.0/24'[0m
00:50:59 | 2902   | configuration[0m | . next-hop         | '10.0.255.254'[0m
00:50:59 | 2902   | configuration[0m | . rd               | '1.2.3.4:1'[0m
00:50:59 | 2902   | configuration[0m | . label            | '24005'[0m
00:50:59 | 2902   | configuration[0m | &lt; route            | [0m
00:50:59 | 2902   | configuration[0m | &lt; static           | [0m
00:50:59 | 2902   | configuration[0m | &lt; neighbor         | [0m
00:50:59 | 2902   | reactor      [0m | new peer: neighbor 10.30.170.185 local-ip 10.30.170.157 local-as 64496 peer-as 64496 router-id 10.30.170.157 family-allowed in-open[0m
00:50:59 | 2902   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:50:59 | 2902   | reactor      [0m | initialising connection to peer-1[0m
00:50:59 | 2902   | outgoing-1   [0m | attempting connection to 10.30.170.185:1790[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AA9D 1402 0601 0400 0100 8002 0641 0400 00FB F002 0206 00[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.170.157 capabilities=[Multiprotocol(ipv4 mpls-vpn), Extended Message(65535), ASN4(64496)][0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 00D9 01[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload ( 198) 04FB F000 B4C0 0002 02BC 02BA 4104 0000 FBF0 0600 0200 0104 0001 0001 0104 0001 0004 0104 0001 0085 0104 0002 0004 0104 0001 0081 0104 0001 0084 0104 0002 0081 0104 0002 0080 0104 0001 0086 0104 0002 0086 0104 0002 0085 0104 0002 0005 0104 0001 0080 0104 0001 0005 0104 4004 0047 0104 0019 0046 0104 0002 0001 4046 003C 4004 4700 0001 0100 0002 8600 0001 0500 0001 8400 0002 8500 0002 8100 0001 8600 0002 8000 0001 8500 0002 0400 0001 8100 0001 8000 0001 0400 0002 0100 0019 4600 0002 0500 4700[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; OPEN version=4 asn=64496 hold_time=180 router_id=192.0.2.2 capabilities=[Multiprotocol(ipv4 unicast,ipv4 nlri-mpls,ipv4 flow,ipv6 nlri-mpls,ipv4 unknown safi 129,ipv4 rtc,ipv6 unknown safi 129,ipv6 mpls-vpn,ipv4 flow-vpn,ipv6 flow-vpn,ipv6 flow,ipv6 unknown safi 5,ipv4 mpls-vpn,ipv4 unknown safi 5,bgp-ls bgp-ls,l2vpn evpn,ipv6 unicast), Route Refresh, Extended Message(65535), Graceful Restart Flags 0x0 Time 60 bgp-ls/bgp-ls=0x0 ipv4/unicast=0x0 ipv6/flow-vpn=0x0 ipv4/unknown safi 5=0x0 ipv4/rtc=0x0 ipv6/flow=0x0 ipv6/unknown safi 129=0x0 ipv4/flow-vpn=0x0 ipv6/mpls-vpn=0x0 ipv4/flow=0x0 ipv6/nlri-mpls=0x0 ipv4/unknown safi 129=0x0 ipv4/mpls-vpn=0x0 ipv4/nlri-mpls=0x0 ipv6/unicast=0x0 l2vpn/evpn=0x0 ipv6/unknown safi 5=0x0, ASN4(64496), Unassigned 71][0m
00:50:59 | 2902   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/nlri-mpls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unicast[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 5[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 129[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for l2vpn/evpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 5[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/nlri-mpls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 129[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/mpls-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/rtc[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow-vpn[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for bgp-ls/bgp-ls[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:50:59 | 2902   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:50:59 | 2902   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:50:59 | 2902   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.170.157-10.30.170.185[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  79) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 004F 0200 0000 3840 0101 0040 0200 4003 040A 00FF FE40 0504 0000 0064 800E 2000 0180 0C00 0000 0000 0000 000A 00FF FE00 7005 DC51 0001 0102 0304 0001 0101 01[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:50:59 | 2902   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0180[0m
00:50:59 | 2902   | outgoing-1   [0m | &gt;&gt; EOR ipv4 mpls-vpn[0m
00:50:59 | 2902   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0180[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0180[0m
00:50:59 | 2902   | routes       [0m | withdrawn NLRI none[0m
00:50:59 | 2902   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 80[0m
00:50:59 | 2902   | routes       [0m | announced NLRI none[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/128 (ipv4 mpls-vpn)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:50:59 | 2902   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:50:59 | 2902   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:50:59 | 2902   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:50:59 | 2902   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:50:59 | 2902   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:51:00 | 2902   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:51:00 | 2902   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:51:01 | 2902   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:51:01 | 2902   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:51:02 | 2902   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:51:02 | 2902   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.231115" elapsed="0.000507"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.232481" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.232156" elapsed="0.000355"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:02.232672" elapsed="0.000281"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:51:02.231836" elapsed="0.001177"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.351329" level="INFO">^C00:51:02 | 2902   | [00;31mreactor      [0m | [1m^C received[0m
00:51:02 | 2902   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:51:02 | 2902   | outgoing-1   [0m | stop, message [shutting down][0m
00:51:02 | 2902   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:51:02.351555" level="INFO">${output} = ^C00:51:02 | 2902   | [00;31mreactor      [0m | [1m^C received[0m
00:51:02 | 2902   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:51:02 | 2902   | outgoing-1   [0m | stop, messag...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:51:02.233182" elapsed="0.118408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.352240" level="INFO">^C00:51:02 | 2902   | [00;31mreactor      [0m | [1m^C received[0m
00:51:02 | 2902   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:51:02 | 2902   | outgoing-1   [0m | stop, message [shutting down][0m
00:51:02 | 2902   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.170.157-10.30.170.185, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.351850" elapsed="0.000447"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.353806" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:02.353056" elapsed="0.000824"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.354817" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:51:02.354905" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:51:02.354046" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.355826" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.355566" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.355008" elapsed="0.000921"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.354985" elapsed="0.000972"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:51:02.352614" elapsed="0.003393"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:51:02.230165" elapsed="0.125894"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Empty_Reported_Data">
<kw name="Verify_Empty_Data_Neon">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.412690" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.411994" elapsed="0.000731"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.413666" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.413252" elapsed="0.000509">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.413927" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.412906" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.414611" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.414128" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.415177" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:02.415344" level="INFO">${template} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.414808" elapsed="0.000563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.415920" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.415551" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.417694" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.416974" elapsed="0.000869"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.419100" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:02.418121" elapsed="0.001063"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.419923" elapsed="0.000072"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.420296" elapsed="0.000170"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.420758" elapsed="0.000072"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.419632" elapsed="0.001248"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.419275" elapsed="0.001681"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:02.421052" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:51:02.421354" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:02.416405" elapsed="0.004976"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.416054" elapsed="0.005359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.421632" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.421439" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.416031" elapsed="0.005680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.422519" level="INFO">${final_text} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.421859" elapsed="0.000689"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.422598" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:02.411296" elapsed="0.011428"/>
</kw>
<msg time="2026-05-01T00:51:02.422778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.397940" elapsed="0.024905"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.436064" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.450559" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.463298" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.463525" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.463713" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.464198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.463983" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:02.463967" elapsed="0.000313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.464429" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.464620" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.464793" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.463932" elapsed="0.000914"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.463796" elapsed="0.001077"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.465025" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.465103" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:02.465237" level="INFO">${uri} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:02.393240" elapsed="0.072025"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.466658" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.466359" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.466828" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.465987" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.467184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.466924" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.467760" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.467466" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.467265" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.466906" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.470389" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.468017" elapsed="0.002399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:02.470482" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:02.470639" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:02.465615" elapsed="0.005050"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.471913" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.471704" elapsed="0.000263"/>
</kw>
<msg time="2026-05-01T00:51:02.472052" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.471345" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.472285" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.472149" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.472130" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.472685" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:02.472831" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.472518" elapsed="0.000339"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:51:02.473292" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.473054" elapsed="0.000266"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:51:02.473368" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:02.473542" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:02.470978" elapsed="0.002590"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.475039" level="INFO">/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.474792" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.475491" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.475241" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:02.484794" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:02.485155" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '153'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true}}]} 
 </msg>
<msg time="2026-05-01T00:51:02.485294" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:02.477875" elapsed="0.007456"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.475602" elapsed="0.009789"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.485675" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.485428" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.475584" elapsed="0.010212"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.491144" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":true}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.487270" elapsed="0.003942"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.486956" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.486931" elapsed="0.004366"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.497156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.491720" elapsed="0.005485"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.491374" elapsed="0.005868"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.491351" elapsed="0.005917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.497875" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.497449" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.498219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.497975" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.498790" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.498489" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.498301" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.497956" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.499404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.499043" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.499761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.499519" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.500349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.500050" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.499842" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.499500" elapsed="0.000933"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.500655" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:02.501500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.501185" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:02.501686" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:02.486304" elapsed="0.017818"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.504300" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.504193" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.504174" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.507318" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.504535" elapsed="0.002811"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:51:02.507398" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:02.507575" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:02.473884" elapsed="0.033718"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.507665" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:51:02.507820" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:02.369547" elapsed="0.138298"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.582298" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.581435" elapsed="0.000948"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.583738" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.583443" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:02.584052" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.582693" elapsed="0.001442"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.585755" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.584705" elapsed="0.001135"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:02.586470" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_ipv4/empty_route/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:02.586751" level="INFO">${template} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:02.586101" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.587789" level="INFO">{
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
                "uptodate": "*"
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.587088" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:02.589278" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.588148" elapsed="0.001249"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.590421" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.589840" elapsed="0.000641"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.589477" elapsed="0.001066"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.588104" elapsed="0.002503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.591993" level="INFO">${final_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:02.590869" elapsed="0.001219"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.592188" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:02.579875" elapsed="0.012755"/>
</kw>
<msg time="2026-05-01T00:51:02.592705" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.523115" elapsed="0.069674"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.606432" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.620800" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.634498" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.634727" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.634928" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.635437" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.635256" elapsed="0.000424"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:02.635239" elapsed="0.000476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.635921" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.636127" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.636326" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:02.635194" elapsed="0.001196"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.635019" elapsed="0.001403"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.636608" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.636755" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:51:02.636911" level="INFO">${expected_text} = {
    "bgp-rib:tables": [
        {
            "afi": "bgp-types:ipv4-address-family",
            "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family",
            "attributes": {
        ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:02.520332" elapsed="0.116608"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.637148" elapsed="0.002911"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.641357" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.640951" elapsed="0.000435"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:02.641924" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:02.641566" elapsed="0.000386"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:02.642116" elapsed="0.000519"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:02.640432" elapsed="0.002265"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.640154" elapsed="0.002577"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.642913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.642757" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.640129" elapsed="0.002860"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:51:02.509081" elapsed="0.133958"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:51:02.508212" elapsed="0.134907"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:02.507968" elapsed="0.135199"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.507951" elapsed="0.135241"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:02.643228" elapsed="0.000033"/>
</return>
<arg>${BGP_L3VPN_DIR}${/}empty_route</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:51:02.362220" elapsed="0.281143"/>
</kw>
<doc>Verify empty data on neon</doc>
<status status="PASS" start="2026-05-01T00:51:02.356916" elapsed="0.286510"/>
</kw>
<doc>Verfiy empty data response</doc>
<status status="PASS" start="2026-05-01T00:51:02.356655" elapsed="0.286836"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Empty_Reported_Data</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:02.356225" elapsed="0.287311"/>
</kw>
<doc>Testcse teardown with data verification</doc>
<status status="PASS" start="2026-05-01T00:51:02.229795" elapsed="0.413799"/>
</kw>
<doc>Testing mpls vpn ipv4 routes reported to odl from exabgp</doc>
<status status="PASS" start="2026-05-01T00:50:58.567951" elapsed="4.075691"/>
</test>
<test id="s1-s12-t4" name="Start_Play" line="86">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:02.647303" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:02.647035" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.648640" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.648529" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.648510" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.653796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.653690" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.653673" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.654869" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.654489" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.655397" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:02.655102" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:02.655484" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:02.655641" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:02.654095" elapsed="0.001570"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.661487" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.661364" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.661346" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.662732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.662626" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.662608" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:02.663255" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:02.662952" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.663683" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:02.663447" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.694665" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:02.664242" elapsed="0.030528"/>
</kw>
<msg time="2026-05-01T00:51:02.694933" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:02.694978" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.663904" elapsed="0.031111"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.718368" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "S "t "a "r "t "_ "P "l "a "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:02.695562" elapsed="0.022950"/>
</kw>
<msg time="2026-05-01T00:51:02.718683" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:02.718729" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "S "t "a "r "t "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.695192" elapsed="0.023576"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.719111" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.718859" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.718836" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.719699" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "S "t "a "r "t "_ "P "l "a "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.719347" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.720086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.719857" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.719837" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:02.720200" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:02.722998" elapsed="0.000187"/>
</kw>
<msg time="2026-05-01T00:51:02.723266" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:02.721761" elapsed="0.001646"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.723742" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.724187" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:02.721090" elapsed="0.003352"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:02.720534" elapsed="0.004026"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:02.662300" elapsed="0.062367"/>
</kw>
<msg time="2026-05-01T00:51:02.724765" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:02.724811" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "S "t "a "r "t "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.661720" elapsed="0.063129"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:02.725040" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:02.724928" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.724909" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.725634" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.726082" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.726184" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:02.661027" elapsed="0.065310"/>
</kw>
<msg time="2026-05-01T00:51:02.726576" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:02.726641" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "S "t "a "r "t "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.656063" elapsed="0.070629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.727091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.726796" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.726772" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:02.655913" elapsed="0.071283"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:02.655719" elapsed="0.071511"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:02.653317" elapsed="0.073973"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:02.648216" elapsed="0.079133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.647748" elapsed="0.079648"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:02.644846" elapsed="0.082628"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.740955" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:51:02.727660" elapsed="0.013387"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.743890" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:51:02.776637" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:51:02.777011" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:51:02.777120" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:51:02.777218" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:02.743183" elapsed="0.034097"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.779540" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:51:02.778811" elapsed="0.000844"/>
</kw>
<msg time="2026-05-01T00:51:02.779952" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:51:02.780062" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:02.777851" elapsed="0.002266"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.781642" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:02.780575" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.782994" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:02.781912" elapsed="0.001249"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.781858" elapsed="0.001375"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:51:02.783702" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-05-01T00:51:02.783407" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.783364" elapsed="0.000598"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:51:02.784170" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:02.784091" elapsed="0.000170"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:02.784056" elapsed="0.000254"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.784683" elapsed="0.000051"/>
</kw>
<msg time="2026-05-01T00:51:02.785048" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:51:02.742567" elapsed="0.042543"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:51:02.785528" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:51:02.785277" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:02.785238" elapsed="0.000482"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:02.786087" elapsed="0.000051"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:51:02.741606" elapsed="0.044675"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:51:02.786684" elapsed="0.000316"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Start_Bgp_Peer">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.789843" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:02.789513" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:02.790281" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:02.790036" elapsed="0.000292"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:02.814085" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:51:02.814186" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:02.790498" elapsed="0.023716"/>
</kw>
<arg>--amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug --allf --wfr 1</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:51:02.789053" elapsed="0.025225"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:51:08.816628" level="FAIL">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.815959" elapsed="6.001475">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.817821" elapsed="0.000043"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:51:02.815652" elapsed="6.002340">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:51:02.815221" elapsed="6.002917"/>
</kw>
<msg time="2026-05-01T00:51:08.818261" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:02.814857" elapsed="6.003431"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:51:08.818521" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:51:08.818393" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.818365" elapsed="0.000252"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.818869" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.819053" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:51:02.814569" elapsed="6.004567"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-05-01T00:51:02.788493" elapsed="6.030797"/>
</kw>
<arg>3x</arg>
<arg>1s</arg>
<arg>Start_Bgp_Peer</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:02.787390" elapsed="6.031991"/>
</kw>
<doc>Start Python speaker to connect to ODL. We need to do WUKS until odl really starts to accept incomming bgp connection. The failure happens if the incomming connection comes too quickly after configuring the peer in the previous test case.</doc>
<status status="PASS" start="2026-05-01T00:51:02.644032" elapsed="6.175502"/>
</test>
<test id="s1-s12-t5" name="Play_To_Odl_rt_constrain_type_0" line="94">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:08.823744" elapsed="0.000285"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:08.823431" elapsed="0.000666"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:08.825224" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:08.825084" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.825060" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:08.830575" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:08.830442" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.830422" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.832009" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:08.831564" elapsed="0.000474"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.832533" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:08.832210" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:08.832604" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:51:08.832772" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:08.830896" elapsed="0.001900"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:08.838502" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:08.838376" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.838358" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:08.839831" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:08.839722" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.839703" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:08.840370" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.840057" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:08.840812" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:08.840585" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:08.870682" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:08.841350" elapsed="0.029571"/>
</kw>
<msg time="2026-05-01T00:51:08.871360" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:08.871531" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:08.841006" elapsed="0.030614"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:08.901912" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:08.872712" elapsed="0.029392"/>
</kw>
<msg time="2026-05-01T00:51:08.902367" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:08.902437" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "P "l "a "y "_ "T "o "_ "O...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:08.872038" elapsed="0.030483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.903058" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:08.902663" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.902624" elapsed="0.000658"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.904076" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:08.903576" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.904654" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:08.904292" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.904264" elapsed="0.000510"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:08.904829" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:08.908788" elapsed="0.000210"/>
</kw>
<msg time="2026-05-01T00:51:08.909086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:08.907140" elapsed="0.002135"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.909705" elapsed="0.000108"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.910178" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:08.906171" elapsed="0.004270"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:08.905288" elapsed="0.005270"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:08.839390" elapsed="0.071308"/>
</kw>
<msg time="2026-05-01T00:51:08.910829" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:08.910892" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "P "l "a "y "_ "T "o "_ "O...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:08.838734" elapsed="0.072212"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:08.911214" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:51:08.911061" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.911034" elapsed="0.000369"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.912011" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.912368" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:08.912441" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:08.838035" elapsed="0.074535"/>
</kw>
<msg time="2026-05-01T00:51:08.912665" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:08.912710" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "P "l "a "y "_ "T "o "_ "O...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:08.833193" elapsed="0.079557"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.913084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:08.912826" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.912809" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:08.833041" elapsed="0.080144"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:08.832856" elapsed="0.080363"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:08.830054" elapsed="0.083224"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:08.824772" elapsed="0.088564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:08.824265" elapsed="0.089118"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:08.820708" elapsed="0.092732"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:08.914431" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:08.914646" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:08.914148" elapsed="0.000526"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:08.914834" elapsed="0.002963"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:08.917985" elapsed="0.001727"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.920498" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.919914" elapsed="0.000626"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.975640" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:08.975159" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:08.976522" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:08.976215" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:08.976704" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:08.975861" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.977304" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:08.976904" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:08.977667" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:08.977850" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:08.977518" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.978294" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:08.978044" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.979518" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:08.979125" elapsed="0.000441"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.980012" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.979734" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.980878" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:08.980424" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:08.982195" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.981630" elapsed="0.000668"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:08.982381" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:51:08.982722" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:08.981105" elapsed="0.001643"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.982912" elapsed="0.000447"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:51:08.980278" elapsed="0.003127"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.984334" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:08.983685" elapsed="0.000678"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:08.985656" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.985098" elapsed="0.000660"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:08.985836" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:51:08.986135" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:08.984637" elapsed="0.001663"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:08.986472" elapsed="0.000368"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:08.983541" elapsed="0.003342"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:08.980095" elapsed="0.006824"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:08.986963" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:51:08.987122" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:08.978788" elapsed="0.008359"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:08.978423" elapsed="0.008756"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:08.987387" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:08.987206" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:08.978397" elapsed="0.009085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:08.988269" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:08.987637" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:08.988348" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:08.974434" elapsed="0.014076"/>
</kw>
<msg time="2026-05-01T00:51:08.988570" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:08.961149" elapsed="0.027474"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.001666" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.014493" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.027175" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.027464" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.027663" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.028214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.028027" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.028008" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.028464" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.028641" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.028811" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.027962" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.027824" elapsed="0.001068"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.029045" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.029125" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:51:09.029288" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:08.956705" elapsed="0.072613"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.030788" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.030473" elapsed="0.000394">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.030962" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.030050" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.031351" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.031057" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.031948" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.031647" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.031440" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.031039" elapsed="0.001008"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.034687" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.032219" elapsed="0.002495"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:09.034767" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:51:09.034929" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:09.029684" elapsed="0.005270"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.036251" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.035999" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.036409" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.035656" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:51:09.036658" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:09.036522" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.036503" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.036895" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.037076" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.037202" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:51:09.039184" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:09.035275" elapsed="0.003936"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.040669" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.040393" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.041118" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.040876" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:09.049289" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:09.049708" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '361'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:51:09.049813" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:09.043471" elapsed="0.006369"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.041229" elapsed="0.008655"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.050070" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.049911" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.041210" elapsed="0.008946"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.054802" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.051228" elapsed="0.003644"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.050991" elapsed="0.003931"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.050971" elapsed="0.003987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.058679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.055392" elapsed="0.003352"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.055038" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.055015" elapsed="0.003813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.059672" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.059080" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.060153" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.059809" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.060950" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.060529" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.060268" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.059783" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.061831" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.061300" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.062309" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.061965" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.063092" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.062681" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.062423" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.061941" elapsed="0.001332"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.063532" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:09.064710" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.064268" elapsed="0.000479"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.064973" elapsed="0.003255"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:09.050561" elapsed="0.017732"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.068493" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.068364" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.068345" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:09.071613" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.068722" elapsed="0.002921"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:51:09.071695" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:09.071859" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:09.039568" elapsed="0.032318"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.071948" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:51:09.072101" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:08.933369" elapsed="0.138759"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.101670" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.101142" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.102561" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.102228" elapsed="0.000467">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.102872" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.101879" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.103541" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.103071" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.103900" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.104082" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.103735" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.104613" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-extended-community": {
                    "global-administrator": 64496,
                    "local-administrator": "AAAAZQ=="
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.104318" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:09.105174" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.104740" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.105951" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.105414" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.105262" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.104717" elapsed="0.001323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.106708" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.106195" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.106789" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.100498" elapsed="0.006425"/>
</kw>
<msg time="2026-05-01T00:51:09.106981" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.087130" elapsed="0.019901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.119921" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.132870" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.145505" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.145729" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.145916" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.146330" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.146176" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.146157" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.146649" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.146826" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.146997" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.146119" elapsed="0.000931"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.145996" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.147231" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.147334" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:51:09.147526" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:09.084303" elapsed="0.063253"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.147741" elapsed="0.003873"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:09.152921" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.152475" elapsed="0.000475"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:09.153516" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.153115" elapsed="0.000429"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.153704" elapsed="0.000338"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.152018" elapsed="0.002085"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.151753" elapsed="0.002383"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.154314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.154162" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.151733" elapsed="0.002657"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:51:09.073286" elapsed="0.081151"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:51:09.072478" elapsed="0.082051"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.072213" elapsed="0.082362"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.072196" elapsed="0.082402"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.154633" elapsed="0.000035"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:51:08.927440" elapsed="0.227326"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:08.920786" elapsed="0.234037"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:51:08.913756" elapsed="0.241131"/>
</kw>
<doc>This keyword sends route-target route containg route-target argument so odl
can identify this peer as appropriate for advertizement when it recieves such route.</doc>
<status status="PASS" start="2026-05-01T00:51:08.819942" elapsed="0.335063"/>
</test>
<test id="s1-s12-t6" name="Odl_To_Play_l3vpn_rt_arg" line="99">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:09.158367" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:09.158027" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.159666" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.159556" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.159537" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.164819" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.164714" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.164696" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.165894" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.165514" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.166382" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:09.166090" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:09.166466" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:09.166625" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.165120" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.172439" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.172331" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.172312" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.173723" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.173616" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.173598" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:09.174291" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.173975" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.174742" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:09.174504" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.204643" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:09.175280" elapsed="0.029474"/>
</kw>
<msg time="2026-05-01T00:51:09.204935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:09.204981" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.174936" elapsed="0.030081"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.232284" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "r "t "_ "a "r "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:09.205586" elapsed="0.026854"/>
</kw>
<msg time="2026-05-01T00:51:09.232655" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:09.232700" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "O "d "l "_ "T "o "_ "P "l...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.205199" elapsed="0.027538"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.233141" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.232846" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.232813" elapsed="0.000414"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.233770" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "r "t "_ "a "r "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.233382" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.234132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.233912" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.233893" elapsed="0.000391"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:09.234324" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:09.237040" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:51:09.237249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.235973" elapsed="0.001413"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.237795" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.238143" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:09.235250" elapsed="0.003078"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:09.234673" elapsed="0.003721"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:09.173288" elapsed="0.065220"/>
</kw>
<msg time="2026-05-01T00:51:09.238604" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:09.238648" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "O "d "l "_ "T "o "_ "P "l...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.172685" elapsed="0.066001"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:09.238872" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:09.238765" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.238746" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.239406" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.239783" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.239856" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:09.171991" elapsed="0.067975"/>
</kw>
<msg time="2026-05-01T00:51:09.240061" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:09.240105" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "O "d "l "_ "T "o "_ "P "l...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.167027" elapsed="0.073118"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.240504" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.240223" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.240205" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:09.166880" elapsed="0.073729"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:09.166704" elapsed="0.073939"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:09.164341" elapsed="0.076361"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:09.159229" elapsed="0.081531"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.158801" elapsed="0.082006"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:09.155841" elapsed="0.085019"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.241822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/announce_l3vpn_rt_arg.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/announce_l3vpn_rt_arg.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.242006" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.241612" elapsed="0.000425"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:09.242418" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.242201" elapsed="0.000303"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.242865" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/withdraw_l3vpn_rt_arg.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/withdraw_l3vpn_rt_arg.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.242995" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.242674" elapsed="0.000348"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:09.243425" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.243182" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.244019" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.243541" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.243523" elapsed="0.000574"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.279518" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.278939" elapsed="0.000630"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.280466" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.280151" elapsed="0.000403">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.280651" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.279775" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.281245" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.280852" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.281599" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.281772" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.281439" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.282217" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.281964" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.283265" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.283007" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.283776" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.283506" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.284509" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.284191" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.285544" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.285058" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.285624" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:51:09.285791" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.284733" elapsed="0.001082"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.285976" elapsed="0.000253"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:51:09.284041" elapsed="0.002228"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.287076" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.286713" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.288114" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.287705" elapsed="0.000436"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.288191" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:09.288346" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.287361" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.288543" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:09.286386" elapsed="0.002423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.283856" elapsed="0.004988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.288889" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:51:09.289050" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:09.282670" elapsed="0.006405"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.282340" elapsed="0.006767"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.289289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.289133" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.282317" elapsed="0.007049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.290148" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.289548" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.290225" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.278295" elapsed="0.012055"/>
</kw>
<msg time="2026-05-01T00:51:09.290406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.265132" elapsed="0.025353"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.303331" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.316101" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.328845" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.329059" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.329245" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.329724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.329569" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.329552" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.329955" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.330135" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.330307" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.329515" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.329385" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.330557" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.330637" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:09.330773" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:09.260724" elapsed="0.070076"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.356570" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.356161" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.357396" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.357116" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.357592" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.356774" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.358171" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.357788" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.358524" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.358772" level="INFO">${template} = &lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
   ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.358365" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.359217" level="INFO">&lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
    &lt;/label-stack&gt;
    &lt;attributes&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;route-target-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
                &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
            &lt;/route-target-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.0.255.254&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
    &lt;route-distinguisher&gt;1.2.3.4:1&lt;/route-distinguisher&gt;
    &lt;prefix&gt;1.1.1.0/24&lt;/prefix&gt;
&lt;/vpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.358968" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:09.359732" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.359384" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.360319" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.360022" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.359868" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.359359" elapsed="0.001045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.361031" level="INFO">${final_text} = &lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
   ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.360574" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.361111" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.355530" elapsed="0.005715"/>
</kw>
<msg time="2026-05-01T00:51:09.361303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.342228" elapsed="0.019123"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.374169" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.386926" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.399661" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.399868" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.400052" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.400468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.400302" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.400286" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.400700" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.400872" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.401042" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.400252" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.400134" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.401274" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.401400" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:09.401568" level="INFO">${data} = &lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
   ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:09.341318" elapsed="0.060280"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.402965" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.402680" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.403132" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.402293" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.403527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.403226" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.404093" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.403798" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.403609" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.403208" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.406796" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.404332" elapsed="0.002491"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:09.406875" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:51:09.407031" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:09.401947" elapsed="0.005108"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.408649" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.408381" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.409093" level="INFO">&lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
    &lt;/label-stack&gt;
    &lt;attributes&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;route-target-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
                &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
            &lt;/route-target-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.0.255.254&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
    &lt;route-distinguisher&gt;1.2.3.4:1&lt;/route-distinguisher&gt;
    &lt;prefix&gt;1.1.1.0/24&lt;/prefix&gt;
&lt;/vpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.408851" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.409562" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.409304" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.410002" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.409761" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:09.410881" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:51:09.410679" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:51:09.411275" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:51:09.411099" elapsed="0.000215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.411485" elapsed="0.000217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.412156" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.411900" elapsed="0.000300"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:51:09.412243" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:09.412401" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:51:09.410254" elapsed="0.002171"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:09.429592" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '933', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;vpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;WAABAQIDBAABAQEB&lt;/route-key&gt;
    &lt;label-stack&gt;
        &lt;label-value&gt;24005&lt;/label-value&gt;
    &lt;/label-stack&gt;
    &lt;attributes&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;route-target-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
                &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
            &lt;/route-target-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.0.255.254&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
    &lt;route-distinguisher&gt;1.2.3.4:1&lt;/route-distinguisher&gt;
    &lt;prefix&gt;1.1.1.0/24&lt;/prefix&gt;
&lt;/vpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:51:09.429682" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes/vpn-route=WAABAQIDBAABAQEB,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:09.429835" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:09.414637" elapsed="0.015232"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.412513" elapsed="0.017416"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.430176" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.429962" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.412494" elapsed="0.017775"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.436590" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.431690" elapsed="0.004988"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.431368" elapsed="0.005377"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.431340" elapsed="0.005458"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.441211" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.437354" elapsed="0.003914"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.436913" elapsed="0.004397"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.436880" elapsed="0.004460"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.442179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.441571" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.442658" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.442307" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.443425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.442998" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.442766" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.442282" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.444255" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.443777" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.444731" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.444388" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.445413" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.445075" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.444844" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.444362" elapsed="0.001231"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.445798" elapsed="0.000410"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:09.446810" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.446404" elapsed="0.000440"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.447061" elapsed="0.003204"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:09.430762" elapsed="0.019586"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:09.450617" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:51:09.450448" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.450423" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.450949" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.451041" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:51:09.454225" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:09.407422" elapsed="0.046839"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.454351" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:51:09.454579" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:09.249174" elapsed="0.205439"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.455085" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.454756" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.454732" elapsed="0.000477"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.455254" elapsed="0.000035"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:51:09.244348" elapsed="0.211097"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.459449" level="INFO">${update} = ffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.456666" elapsed="0.002896"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.459757" elapsed="0.002814"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:09.462636" elapsed="0.000041"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:51:09.456286" elapsed="0.006522"/>
</kw>
<msg time="2026-05-01T00:51:09.462910" level="INFO">${update} = ffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:09.455702" elapsed="0.007243"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.464086" level="INFO">Length is 166.</msg>
<msg time="2026-05-01T00:51:09.464219" level="INFO">${len_1} = 166</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:09.463769" elapsed="0.000495"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.464970" level="INFO">Length is 166.</msg>
<msg time="2026-05-01T00:51:09.465111" level="INFO">${len_2} = 166</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:09.464584" elapsed="0.000574"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.465485" elapsed="0.000561"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.466939" level="INFO">${sum_1} = 2527</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:09.466357" elapsed="0.000624"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.467681" level="INFO">${sum_2} = 2527</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:09.467275" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.468010" elapsed="0.000593"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:09.463231" elapsed="0.005486"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:09.469014" elapsed="0.002358"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.525097" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.524716" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.525913" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.525657" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.526089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.525298" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.526684" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.526285" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.527016" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.527164" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.526878" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.527655" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.527389" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.528741" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.528414" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.529222" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.528950" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.530074" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.529658" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.531260" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.530772" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.531550" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:51:09.531791" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.530295" elapsed="0.001521"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.531978" elapsed="0.000424"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:51:09.529514" elapsed="0.002931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.533216" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.532750" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.534557" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.533898" elapsed="0.000743"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.534825" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:09.535062" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.533441" elapsed="0.001648"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.535250" elapsed="0.000440"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:09.532581" elapsed="0.003153"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.529303" elapsed="0.006469"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.535817" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:09.535981" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:09.528087" elapsed="0.007921"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.527772" elapsed="0.008268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.536225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.536067" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.527750" elapsed="0.008555"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.537056" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.536471" elapsed="0.000614"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.537136" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.524062" elapsed="0.013202"/>
</kw>
<msg time="2026-05-01T00:51:09.537320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.510986" elapsed="0.026385"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.550879" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.563561" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.576443" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.576659" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.576840" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.577216" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.577067" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.577052" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.577500" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.577675" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.577844" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.577022" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.576916" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.578072" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.578148" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:51:09.578272" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:09.506566" elapsed="0.071732"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.579477" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.579170" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:09.590926" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:09.590975" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:09.591098" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:09.581682" elapsed="0.009454"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.579593" elapsed="0.011600"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.591510" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.591232" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.579575" elapsed="0.012059"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.597157" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.593192" elapsed="0.004027"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.592837" elapsed="0.004432"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.592808" elapsed="0.004497"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.600789" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.597729" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.597385" elapsed="0.003486"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.597361" elapsed="0.003535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.601496" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.601088" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.601841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.601596" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.602390" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.602092" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.601921" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.601577" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.603019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.602659" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.603431" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.603154" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.604004" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.603704" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.603531" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.603136" elapsed="0.000972"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.604277" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:09.605095" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.604807" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.605280" elapsed="0.002397"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:09.592172" elapsed="0.015570"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:09.607787" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:51:09.610174" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:51:09.578589" elapsed="0.031612"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.610257" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:51:09.473768" elapsed="0.136614"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.472776" elapsed="0.137661"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:51:09.471898" elapsed="0.138617"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.613811" level="INFO">${update} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.611487" elapsed="0.002354"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.614022" elapsed="0.002220"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:09.616293" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:51:09.611163" elapsed="0.005257"/>
</kw>
<msg time="2026-05-01T00:51:09.616518" level="INFO">${update} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:09.610689" elapsed="0.005865"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.617469" level="INFO">Length is 138.</msg>
<msg time="2026-05-01T00:51:09.617547" level="INFO">${len_1} = 138</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:09.617185" elapsed="0.000386"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.617981" level="INFO">Length is 138.</msg>
<msg time="2026-05-01T00:51:09.618054" level="INFO">${len_2} = 138</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:09.617730" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.618236" elapsed="0.000334"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.618914" level="INFO">${sum_1} = 1777</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:09.618732" elapsed="0.000207"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:09.619270" level="INFO">${sum_2} = 1777</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:09.619095" elapsed="0.000219"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:09.619491" elapsed="0.000306"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:09.616796" elapsed="0.003061"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.665491" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.665102" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.666310" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.666027" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:09.666497" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:09.665692" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.667097" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.666691" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.667475" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:09.667642" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:09.667323" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.668066" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.667828" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.669104" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.668851" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.669597" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.669312" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.670552" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.669989" elapsed="0.000590"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.671734" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.671254" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.671898" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:51:09.672125" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.670773" elapsed="0.001378"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.672449" elapsed="0.000621"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:51:09.669850" elapsed="0.003263"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.673932" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:09.673365" elapsed="0.000596"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:09.675496" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.674842" elapsed="0.000699"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:09.675658" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:51:09.675878" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:09.674326" elapsed="0.001578"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.676060" elapsed="0.000501"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:09.673227" elapsed="0.003376"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.669676" elapsed="0.006962"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:09.676681" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:51:09.676839" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:09.668498" elapsed="0.008366"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.668180" elapsed="0.008716"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.677115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.676953" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.668160" elapsed="0.009032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.677932" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.677336" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.678009" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.664426" elapsed="0.013706"/>
</kw>
<msg time="2026-05-01T00:51:09.678188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.651195" elapsed="0.027052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.691218" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.703948" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.716988" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.717213" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.717401" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.717856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.717700" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:09.717681" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.718106" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.718286" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.718470" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:09.717632" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.717490" elapsed="0.001062"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.718712" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.718788" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:51:09.718974" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:09.646693" elapsed="0.072310"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.720208" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.719911" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:09.730204" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:09.730622" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '380'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-types:mpls-labeled-vpn-subsequent-address-family']/bgp-vpn-ipv4:vpn-ipv4-routes",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:09.730784" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:51:09.730831" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.722402" elapsed="0.008834">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:09.720322" elapsed="0.011036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.731576" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.731396" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-05-01T00:51:09.720304" elapsed="0.011358">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.742581" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.733840" elapsed="0.008827">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:09.733246" elapsed="0.009572">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:51:09.733190" elapsed="0.009707">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.746261" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.743683" elapsed="0.002612">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:09.743065" elapsed="0.003292">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:51:09.743023" elapsed="0.003366">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.746987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.746601" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.747344" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.747086" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.747965" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.747623" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.747426" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.747068" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.748597" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.748216" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.748932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.748694" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.749496" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:09.749185" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:09.749014" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.748676" elapsed="0.000904"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.749735" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:09.750562" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.750255" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:51:09.753095" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.750749" elapsed="0.002379">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.732103" elapsed="0.021162">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:09.753326" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:09.755786" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:51:09.755816" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:51:09.719275" elapsed="0.036570">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:09.755910" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:51:09.620917" elapsed="0.135162">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.620498" elapsed="0.135644"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:51:09.620087" elapsed="0.136113"/>
</kw>
<arg>l3vpn_rt_arg</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<arg>False</arg>
<status status="PASS" start="2026-05-01T00:51:09.241183" elapsed="0.515066"/>
</kw>
<doc>Same as TC before but fluorine and further this l3vpn route also needs to contain route-target argument.</doc>
<status status="PASS" start="2026-05-01T00:51:09.155233" elapsed="0.601144"/>
</test>
<test id="s1-s12-t7" name="Kill_Talking_BGP_Speaker" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:09.759948" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:09.759677" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.761225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.761114" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.761096" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.766352" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.766246" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.766227" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.767517" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.767051" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.768056" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:09.767752" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:09.768127" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:09.768282" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.766672" elapsed="0.001635"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.773962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.773814" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.773795" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.775430" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.775276" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.775258" elapsed="0.000273"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:09.775986" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.775683" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.776397" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:09.776176" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.808228" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:09.776949" elapsed="0.031463"/>
</kw>
<msg time="2026-05-01T00:51:09.808672" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:09.808720" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.776608" elapsed="0.032150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.837059" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:09.809758" elapsed="0.027417"/>
</kw>
<msg time="2026-05-01T00:51:09.837342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:09.837390" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "K "i "l "l "_ "T "a "l "k...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.809013" elapsed="0.028415"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.837823" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.837555" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.837524" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.838382" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.838059" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.838762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.838540" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.838522" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:09.838878" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:09.841620" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:51:09.841831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:09.840478" elapsed="0.001488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.842245" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.842609" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:09.839813" elapsed="0.003043"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:09.839207" elapsed="0.003715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:09.774972" elapsed="0.068049"/>
</kw>
<msg time="2026-05-01T00:51:09.843114" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:09.843159" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "K "i "l "l "_ "T "a "l "k...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.774190" elapsed="0.069008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:09.843425" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-05-01T00:51:09.843275" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.843256" elapsed="0.000275"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.843951" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.844307" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.844379" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:09.773476" elapsed="0.071030"/>
</kw>
<msg time="2026-05-01T00:51:09.844602" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:09.844647" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "K "i "l "l "_ "T "a "l "k...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.768703" elapsed="0.075982"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.845016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:09.844760" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.844743" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:09.768552" elapsed="0.076566"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:09.768360" elapsed="0.076791"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:09.765888" elapsed="0.079321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:09.760830" elapsed="0.084435"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.760376" elapsed="0.084934"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:09.757287" elapsed="0.088077"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.846601" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:09.846271" elapsed="0.000357"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:09.846787" elapsed="0.000289"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:51:09.845994" elapsed="0.001141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.869195" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:51:09.847688" elapsed="0.021568"/>
</kw>
<msg time="2026-05-01T00:51:09.869348" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:09.869392" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.847330" elapsed="0.022086"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.870069" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:51:09.882341" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:51:09.882502" level="INFO">${output_log} = 2026-05-01 00:51:02,884 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:02,884 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:09.869924" elapsed="0.012617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.883132" level="INFO">2026-05-01 00:51:02,884 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:51:02,885 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eaa9d6002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eaa9d6002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:02,910 INFO BGP-Thread-1 (job): ... idle for 0.017s
2026-05-01 00:51:02,910 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.017s
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:03,921 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:03,921 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.018s
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:04,923 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:04,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.019s
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.021s
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:05,926 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.022s
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.023s
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:08,930 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.024s
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:09,449 INFO BGP-Thread-1 (job): ... idle for 0.518s
2026-05-01 00:51:09,449 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.542s
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0053' (83)
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:09,593 INFO BGP-Thread-1 (job): ... idle for 0.142s
2026-05-01 00:51:09,594 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.684s
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:09,595 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:09,595 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.882775" elapsed="0.000834"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:51:09.869635" elapsed="0.014057"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:51:09.883943" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:51:09.883783" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.883756" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.884507" elapsed="0.000054"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:09.884922" elapsed="0.000048"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:51:09.845668" elapsed="0.039436"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.901058" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:51:09.932256" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:51:09.932533" level="INFO">${output_log} = 2026-05-01 00:51:02,884 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:02,884 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:09.900919" elapsed="0.031681"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.933668" level="INFO">2026-05-01 00:51:02,884 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:51:02,884 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:51:02,885 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:51:02,888 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:51:02,889 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:51:02,889 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eaa9d6002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-05-01 00:51:02,890 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eaa9d6002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:02,892 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,893 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:02,893 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:02,910 INFO BGP-Thread-1 (job): ... idle for 0.017s
2026-05-01 00:51:02,910 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.017s
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,911 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,912 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,913 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,914 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,916 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,917 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,918 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:02,919 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:02,920 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:02,920 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:03,921 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:03,921 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.018s
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:03,922 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:04,923 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:04,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.019s
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:04,924 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.021s
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:05,925 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:05,926 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.022s
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:06,927 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.023s
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:07,929 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:08,930 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.024s
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:08,931 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:09,449 INFO BGP-Thread-1 (job): ... idle for 0.518s
2026-05-01 00:51:09,449 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.542s
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0053' (83)
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:09,450 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:09,451 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:09,593 INFO BGP-Thread-1 (job): ... idle for 0.142s
2026-05-01 00:51:09,594 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.684s
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:51:09,594 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:51:09,595 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:51:09,595 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:09,595 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:09] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:09.933013" elapsed="0.001420"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:09.935807" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/010_l3vpn_play.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/010_l3vpn_play.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:51:09.934920" elapsed="0.001022"/>
</kw>
<arg>play.py.out</arg>
<arg>010_l3vpn_play.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.900577" elapsed="0.035515"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-05-01T00:51:09.756792" elapsed="0.179564"/>
</test>
<test id="s1-s12-t8" name="Delete_Bgp_Peer_Configuration" line="109">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:09.942754" elapsed="0.000389"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:09.942361" elapsed="0.000878"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.944848" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.944675" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.944644" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.952426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.952319" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.952301" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.953527" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:09.953127" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:09.954015" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:09.953723" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:09.954090" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:09.954250" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:09.952745" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.960073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.959960" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.959942" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:09.961346" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:09.961239" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:09.961221" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:09.961897" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:09.961593" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.962303" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:09.962088" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:09.992066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:09.962855" elapsed="0.029316"/>
</kw>
<msg time="2026-05-01T00:51:09.992335" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:09.992381" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.962514" elapsed="0.029903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.021481" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:09.992969" elapsed="0.028623"/>
</kw>
<msg time="2026-05-01T00:51:10.021752" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:10.021796" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "l "e "t "e "_ "B "g...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.992623" elapsed="0.029210"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.022190" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.021912" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.021892" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.022757" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.022419" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.023122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.022898" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.022879" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:10.023233" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:10.025827" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:51:10.026031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.024745" elapsed="0.001418"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.026441" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.026800" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:10.024104" elapsed="0.002881"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:10.023568" elapsed="0.003487"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:09.960915" elapsed="0.066257"/>
</kw>
<msg time="2026-05-01T00:51:10.027280" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:10.027339" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "l "e "t "e "_ "B "g...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.960299" elapsed="0.067079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:10.027590" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:10.027479" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.027438" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.028108" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.028478" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.028552" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:09.959622" elapsed="0.069041"/>
</kw>
<msg time="2026-05-01T00:51:10.028757" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:10.028800" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "l "e "t "e "_ "B "g...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.954679" elapsed="0.074158"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.029167" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.028912" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.028895" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:09.954530" elapsed="0.074737"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:09.954332" elapsed="0.074966"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:09.951838" elapsed="0.077514"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:09.944199" elapsed="0.085209"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:09.943517" elapsed="0.085950"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:09.938610" elapsed="0.090919"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.030216" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.029749" elapsed="0.000495"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.074248" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.073870" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:10.075038" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:10.074803" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:10.075209" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:10.074465" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.075832" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.075430" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:10.076162" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:10.076312" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:10.076026" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.076755" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.076513" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.077765" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.077508" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.078232" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.077973" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.078927" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:10.078633" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:10.079724" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.079503" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:10.079806" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:10.079960" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:10.079145" elapsed="0.000839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.080142" elapsed="0.000236"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:51:10.078492" elapsed="0.001927"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.080987" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:10.080690" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:10.081907" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.081543" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:10.081988" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:10.082140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:10.081208" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.082322" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:10.080551" elapsed="0.002049"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:10.078305" elapsed="0.004366"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:10.082717" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:51:10.082877" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:10.077170" elapsed="0.005732"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.076868" elapsed="0.006067"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.083119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.082960" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.076849" elapsed="0.006346"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.083943" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.083352" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:10.084020" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:10.073237" elapsed="0.010913"/>
</kw>
<msg time="2026-05-01T00:51:10.084204" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.060227" elapsed="0.024022"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.096933" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.109611" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.122259" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.122470" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.122651" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.123015" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.122867" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:10.122853" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.123237" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.123434" elapsed="0.000033"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.123621" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:10.122824" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.122723" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.123893" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.123969" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:51:10.124091" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:10.055828" elapsed="0.068290"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.125223" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.124971" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:10.136494" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:10.136543" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:10.136634" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:10.127427" elapsed="0.009233"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.125335" elapsed="0.011364"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.136880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.136725" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.125318" elapsed="0.011643"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.141960" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.138335" elapsed="0.003685"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.138026" elapsed="0.004042"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.138001" elapsed="0.004102"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.145793" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.142516" elapsed="0.003339"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.142181" elapsed="0.003722"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.142158" elapsed="0.003779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.146717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.146177" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.147191" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.146853" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.148011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.147594" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.147302" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.146828" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.148657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.148276" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.148992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.148754" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.149559" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.149245" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.149077" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.148736" elapsed="0.000941"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.149836" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:10.150645" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.150349" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.150831" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:10.137441" elapsed="0.015793"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:10.153280" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:10.155607" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:51:10.124383" elapsed="0.031251"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:10.155688" elapsed="0.000027"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:51:10.030493" elapsed="0.125319"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:51:09.937069" elapsed="0.218855"/>
</test>
<test id="s1-s12-t9" name="Deconfigure_App_Peer" line="117">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:10.159198" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:10.158926" elapsed="0.000596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.160520" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.160394" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.160376" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.165722" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.165616" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.165598" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.166797" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.166397" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.167441" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:10.166987" elapsed="0.000495"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:10.167528" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:10.167683" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:10.166020" elapsed="0.001688"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.173809" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.173690" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.173671" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.175058" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.174950" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.174932" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:10.175627" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.175277" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.176038" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:10.175816" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.205808" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:10.176584" elapsed="0.029325"/>
</kw>
<msg time="2026-05-01T00:51:10.206204" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:10.206252" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.176229" elapsed="0.030061"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.233030" level="INFO">". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:10.206838" elapsed="0.026297"/>
</kw>
<msg time="2026-05-01T00:51:10.233296" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:10.233342" level="INFO">${message_wait} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "c "o "n "f "i "g "u...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.206492" elapsed="0.026887"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.233713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.233482" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.233437" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.234238" level="INFO"> ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.233938" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.234617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.234381" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.234363" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:10.234728" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:10.237398" elapsed="0.000164"/>
</kw>
<msg time="2026-05-01T00:51:10.237624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.236189" elapsed="0.001566"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.238036" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.238380" elapsed="0.000096"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:10.235569" elapsed="0.003061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:10.234995" elapsed="0.003700"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:10.174650" elapsed="0.064142"/>
</kw>
<msg time="2026-05-01T00:51:10.238882" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:10.238925" level="INFO">${message} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "c "o "n "f "i "g "u...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.174045" elapsed="0.064918"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:10.239145" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:10.239040" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.239021" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.239736" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.240100" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.240188" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:10.173296" elapsed="0.067005"/>
</kw>
<msg time="2026-05-01T00:51:10.240394" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:10.240437" level="INFO">${output} =  ". "t "x "t ". "0 "1 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n ". "D "e "c "o "n "f "i "g "u...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.168076" elapsed="0.072415"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.240861" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.240603" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.240585" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:10.167928" elapsed="0.073034"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:10.167760" elapsed="0.073230"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:10.165244" elapsed="0.075802"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:10.160107" elapsed="0.081004"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.159678" elapsed="0.081478"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:10.156743" elapsed="0.084465"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.241842" level="INFO">&amp;{mapping} = { IP=10.30.170.185 | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.241376" elapsed="0.000493"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.285669" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.285281" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:10.286428" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:10.286196" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:10.286608" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:10.285862" elapsed="0.000770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.287175" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.286797" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:10.287548" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:10.287687" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:10.287393" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.288113" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.287872" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.289109" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.288856" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.289590" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.289314" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.290269" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:10.289967" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:10.291041" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.290831" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:10.291116" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:10.291267" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:10.290502" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.291513" elapsed="0.000232"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:51:10.289829" elapsed="0.001957"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.292331" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:10.292037" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:10.293238" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.292888" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:10.293316" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:10.293482" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:10.292564" elapsed="0.000944"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.293664" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:10.291899" elapsed="0.002025"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:10.289663" elapsed="0.004295"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:10.294001" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:51:10.294154" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:10.288533" elapsed="0.005646"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.288224" elapsed="0.005986"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.294385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.294234" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.288206" elapsed="0.006269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.295350" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.294624" elapsed="0.000756"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:10.295432" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:10.284668" elapsed="0.010904"/>
</kw>
<msg time="2026-05-01T00:51:10.295626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.271706" elapsed="0.023966"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.308352" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.321065" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.334556" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.334917" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.335106" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.335554" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.335380" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:10.335365" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.335786" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.335968" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.336138" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:10.335300" elapsed="0.000891"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.335182" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.336373" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.336464" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:10.336603" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:10.267137" elapsed="0.069493"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.337756" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.337491" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:10.348584" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01uopemze9p14no1zaibvwr4js21.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:10.348632" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:10.348723" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:10.340159" elapsed="0.008590"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.337868" elapsed="0.010921"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.348973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.348815" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.337851" elapsed="0.011206"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.352675" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.350062" elapsed="0.002658"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.349835" elapsed="0.002921"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.349818" elapsed="0.002963"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.355439" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.353061" elapsed="0.002439"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.352837" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.352820" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.356150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.355732" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.356698" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.356332" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.357485" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.357049" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.356814" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.356306" elapsed="0.001298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.358338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.357836" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.358832" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.358493" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.359629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.359179" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.358946" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.358448" elapsed="0.001298"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.359961" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:10.361086" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:10.360703" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.361344" elapsed="0.003194"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:10.349416" elapsed="0.015186"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:10.364648" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:10.366955" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:51:10.336905" elapsed="0.030076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:10.367035" elapsed="0.000030"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:51:10.242096" elapsed="0.125067"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:51:10.156221" elapsed="0.211051"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.373726" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.373388" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.375226" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:51:10.408636" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:51:10.408894" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:51:10.408991" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:51:10.409080" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:10.375042" elapsed="0.034089"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.410972" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:51:10.410360" elapsed="0.000712"/>
</kw>
<msg time="2026-05-01T00:51:10.411278" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:51:10.411426" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.409587" elapsed="0.001918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.412645" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.411969" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.416563" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.413840" elapsed="0.002785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.417261" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.416921" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.417887" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.417557" elapsed="0.000389"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:51:10.413318" elapsed="0.004704"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:10.412803" elapsed="0.005274"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.412773" elapsed="0.005341"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.418335" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.418191" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.418169" elapsed="0.000263"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:51:10.418653" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:51:10.418528" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.418506" elapsed="0.000269"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.418983" elapsed="0.000030"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:51:10.374440" elapsed="0.044708"/>
</kw>
<msg time="2026-05-01T00:51:10.419221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.373916" elapsed="0.045386"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:51:10.372782" elapsed="0.046644"/>
</kw>
<msg time="2026-05-01T00:51:10.419514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.368817" elapsed="0.050773"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:51:10.368238" elapsed="0.051456"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:51:10.368006" elapsed="0.051757"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:51:10.419969" elapsed="0.000644"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:10.420947" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:51:10.420842" elapsed="0.000209"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:51:10.367743" elapsed="0.053379"/>
</kw>
<doc>Functional test suite for bgp - l3vpn-ipv4

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising and receiveing routes with l3vpn content.
It uses odl and exabgp as bgp peers. Routes advertized from odl
are configured via application peer. Routes advertised from exabgp is
statically configured in exabgp config file.

For fluorine and further, instead of exabgp, play.py is used. When sending
routes from odl to peer, first route containg route-target argument have to
be send from peer to odl, so odl can identify this peer. Than it sends l3vpn
route containg this argument to odl app peer, and we check that app peer
advertizes this route back to the peer.</doc>
<status status="PASS" start="2026-05-01T00:50:50.023291" elapsed="20.397873"/>
</suite>
<suite id="s1-s13" name="030 Bgp Functional Evpn" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.561092" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:10.556228" elapsed="0.004924"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:51:10.555921" elapsed="0.005309"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.566154" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:51:10.562469" elapsed="0.003714"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:10.566399" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.566272" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.566245" elapsed="0.000252"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.567016" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:10.566658" elapsed="0.000404"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.567672" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:51:10.567231" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:51:10.568222" elapsed="0.000308"/>
</kw>
<msg time="2026-05-01T00:51:10.568628" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:10.568675" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:10.567872" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.569242" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.568868" elapsed="0.000400"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.570268" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:10.570005" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.570722" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:10.570447" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.571208" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.570913" elapsed="0.000322"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.574567" elapsed="0.000217"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.575271" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.574948" elapsed="0.000349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.575486" elapsed="0.000234"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.576535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.576222" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:51:10.576609" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:51:10.576772" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:51:10.575920" elapsed="0.000878"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:10.577389" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19307c90&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:51:10.576958" elapsed="0.000583"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.577707" elapsed="0.000188"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:51:10.573990" elapsed="0.003963"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:10.573793" elapsed="0.004204"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:51:10.571293" elapsed="0.006735"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.578609" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:10.578193" elapsed="0.000461"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.579220" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:10.578821" elapsed="0.000441"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.579856" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:10.579468" elapsed="0.000430"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:51:10.569550" elapsed="0.010406"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:51:10.562103" elapsed="0.017910"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:10.580200" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:10.580085" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.580063" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.583543" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:10.583058" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.584035" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:10.583738" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:10.584106" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:10.584260" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:10.582726" elapsed="0.001559"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:10.585278" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.585016" elapsed="0.000289"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.586070" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:51:10.586172" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:51:10.585900" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:10.589744" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:10.589152" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:10.589133" elapsed="0.000738"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.590531" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:51:10.590762" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:51:10.590073" elapsed="0.000741"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.591796" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:10.591085" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.593068" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:10.592173" elapsed="0.000949"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:10.594842" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:51:10.595017" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:10.594491" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.595447" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:51:10.597054" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:51:11.235386" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:51:10 UTC 2026

  System load:  0.05               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:50:50 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:51:10.596732" elapsed="0.638852"/>
</kw>
<msg time="2026-05-01T00:51:11.235676" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.596269" elapsed="0.639599"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:51:10.593586" elapsed="0.642562"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.237095" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:51:11.250564" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:51:11.250978" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:51:11.251222" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:11.236579" elapsed="0.014783"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.252148" elapsed="0.001204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.256212" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:11.254841" elapsed="0.001535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.257031" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.256664" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.256625" elapsed="0.000647"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:51:11.257737" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-05-01T00:51:11.257391" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.257367" elapsed="0.000633"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.258087" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.262933" elapsed="0.000709"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.264044" elapsed="0.000592"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.265046" elapsed="0.000323"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:11.258803" elapsed="0.006688"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:51:10.588203" elapsed="0.677546"/>
</kw>
<msg time="2026-05-01T00:51:11.265829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.587565" elapsed="0.678338"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:51:10.586891" elapsed="0.679124"/>
</kw>
<msg time="2026-05-01T00:51:11.266071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.586359" elapsed="0.679775"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.269441" elapsed="0.000330"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.269941" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.270241" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:11.266632" elapsed="0.003759"/>
</kw>
<msg time="2026-05-01T00:51:11.270498" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:51:10.585539" elapsed="0.684985"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.270956" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:11.270708" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:51:11.271040" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:51:10.584660" elapsed="0.686509"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:10.584479" elapsed="0.686728"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:10.584337" elapsed="0.686907"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:51:10.580570" elapsed="0.690731"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:51:11.271493" elapsed="0.000215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.286900" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.286784" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.286765" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.287294" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:51:11.287437" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.287146" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.287900" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:11.287636" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.288335" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:11.288099" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:11.289152" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:51:11.288926" elapsed="0.000335">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:51:11.289367" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:51:11.289413" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.288553" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.289754" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:11.289529" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.289509" elapsed="0.000342"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:11.290605" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.290324" elapsed="0.000308"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:51:11.290680" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:11.290829" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:51:11.290054" elapsed="0.000800"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.291011" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.291729" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:51:11.291829" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.291624" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.292006" elapsed="0.002357"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.295135" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:51:11.455304" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.294548" elapsed="0.161003"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.459284" elapsed="0.000410"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.459866" elapsed="0.000181"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.460278" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:11.456881" elapsed="0.003556"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:11.456060" elapsed="0.004452"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.286475" elapsed="0.174092"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:11.272540" elapsed="0.188078"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.272105" elapsed="0.188574"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:11.271962" elapsed="0.188759"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:51:11.271807" elapsed="0.188955"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:51:10.561565" elapsed="0.899263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.463717" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.463571" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.463542" elapsed="0.000264"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.468916" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.468779" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.468754" elapsed="0.000249"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.470132" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:11.469664" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.470652" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:11.470328" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:11.470723" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:51:11.470894" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:11.469295" elapsed="0.001624"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.476774" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.476663" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.476644" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.478105" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.477978" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.477961" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:11.478700" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.478348" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.479127" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:11.478894" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.510648" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:11.479929" elapsed="0.030878"/>
</kw>
<msg time="2026-05-01T00:51:11.510966" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:11.511015" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.479315" elapsed="0.031735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.583126" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "3 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "e "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:11.511866" elapsed="0.071927"/>
</kw>
<msg time="2026-05-01T00:51:11.584002" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:11.584052" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.511268" elapsed="0.072821"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.584653" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:11.584231" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.584189" elapsed="0.000667"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.585516" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "3 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "e "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:11.585016" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.586029" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:11.585701" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.585676" elapsed="0.000589"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:11.586317" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.588930" elapsed="0.000575"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.589964" elapsed="0.000412"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:51:11.590866" elapsed="0.000266"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:11.588032" elapsed="0.003200"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:11.586734" elapsed="0.004678"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:11.477691" elapsed="0.113919"/>
</kw>
<msg time="2026-05-01T00:51:11.591711" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:11.591757" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.477000" elapsed="0.114793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:11.592003" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:51:11.591886" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.591866" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.592581" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.592953" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.593028" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:11.476353" elapsed="0.116796"/>
</kw>
<msg time="2026-05-01T00:51:11.593246" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:11.593303" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.471332" elapsed="0.122010"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.593784" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:11.593440" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.593417" elapsed="0.000463"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:11.471181" elapsed="0.122728"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:11.470986" elapsed="0.122967"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:11.468371" elapsed="0.125660"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:51:11.461480" elapsed="0.132674"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.460994" elapsed="0.133221"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:51:10.555311" elapsed="1.038977"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.594995" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:51:11.594534" elapsed="0.000492"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.595773" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:11.595238" elapsed="0.000596"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.597816" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:51:11.597894" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:11.597525" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.598082" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.599677" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:51:11.929084" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:50:51 UTC 2026

  System load:  0.55               Processes:             106
  Usage of /:   19.6% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:50:51 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:51:11.599259" elapsed="0.329992"/>
</kw>
<msg time="2026-05-01T00:51:11.929339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.598869" elapsed="0.330554"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:51:11.597059" elapsed="0.332503"/>
</kw>
<msg time="2026-05-01T00:51:11.929615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:11.596613" elapsed="0.333049"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:51:11.596102" elapsed="0.333637"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:11.930379" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18b7e850&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:51:11.929992" elapsed="0.000583"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.938078" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:51:11.951524" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:51:11.930752" elapsed="0.020911"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:51:11.954895" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:51:11.987184" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:51:11.987514" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:51:11.987618" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:51:11.987708" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:51:11.954426" elapsed="0.033331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.989688" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:51:11.989061" elapsed="0.000730"/>
</kw>
<msg time="2026-05-01T00:51:11.990003" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:51:11.990105" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:11.988193" elapsed="0.001967"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:11.991676" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:11.990608" elapsed="0.001138"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.992916" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:11.992084" elapsed="0.000975"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.992031" elapsed="0.001086"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:51:11.993494" elapsed="0.000075"/>
</return>
<status status="PASS" start="2026-05-01T00:51:11.993242" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.993208" elapsed="0.000497"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:51:11.993910" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:11.993830" elapsed="0.000170"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:11.993796" elapsed="0.000251"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.994375" elapsed="0.000047"/>
</kw>
<msg time="2026-05-01T00:51:11.994754" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:51:11.953529" elapsed="0.041285"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:51:11.995183" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:51:11.994974" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:11.994935" elapsed="0.000426"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:11.995794" elapsed="0.000051"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:51:11.952381" elapsed="0.043599"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.001082" level="INFO">${EVPN_CONF_URL} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes</msg>
<arg>${EVPN_CONF_URL}</arg>
<arg>/rests/data/bgp-rib:application-rib=${ODL_SYSTEM_IP}/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:11.996217" elapsed="0.004913"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.005700" level="INFO">${EVPN_LOC_RIB} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<arg>${EVPN_LOC_RIB}</arg>
<arg>/rests/data/bgp-rib:bgp-rib/rib=${RIB_NAME}/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:12.001302" elapsed="0.004446"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.010439" level="INFO">${EVPN_FAMILY_LOC_RIB} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig</msg>
<arg>${EVPN_FAMILY_LOC_RIB}</arg>
<arg>/rests/data/bgp-rib:bgp-rib/rib=${RIB_NAME}/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:12.005928" elapsed="0.004570"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.035625" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/empty_routes.vanadium/empty_routes.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.035201" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.036470" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/empty_routes.vanadium/empty_routes.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.036167" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/empty_routes.vanadium/empty_routes.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.036649" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.035825" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.037225" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/empty_routes/empty_routes.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.036841" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.037569" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/empty_routes/empty_routes.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/empty_routes/empty_routes.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:12.037746" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
   ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:12.037415" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.038238" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.037981" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:12.038675" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.038351" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.039201" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.038909" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.038760" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.038333" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.039929" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
   ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.039479" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.040008" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.040163" level="INFO">${EMPTY_ROUTES} = {
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
   ...</msg>
<var>${EMPTY_ROUTES}</var>
<arg>${EVPN_DIR}/empty_routes</arg>
<arg>empty_routes.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.033033" elapsed="0.007156"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.040681" level="INFO">${EMPTY_ROUTES} = {
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
   ...</msg>
<arg>${EMPTY_ROUTES}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:51:12.040360" elapsed="0.000364"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:10.554822" elapsed="1.485959"/>
</kw>
<test id="s1-s13-t1" name="Configure_App_Peer" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:12.044051" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:12.043786" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.045307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.045195" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.045177" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.050582" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.050471" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.050440" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.051672" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.051260" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.052160" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:12.051862" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:12.052229" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.052383" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.050886" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.057944" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.057835" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.057816" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.059194" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.059082" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.059064" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:12.059752" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.059426" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.060162" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.059944" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.091512" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:12.060745" elapsed="0.030863"/>
</kw>
<msg time="2026-05-01T00:51:12.091792" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:12.091838" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.060384" elapsed="0.031488"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.116965" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:12.092388" elapsed="0.024683"/>
</kw>
<msg time="2026-05-01T00:51:12.117236" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:12.117283" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.092044" elapsed="0.025274"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.117655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.117398" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.117378" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.118194" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.117886" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.118568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.118329" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.118310" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:12.118683" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.121275" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:51:12.121499" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.120195" elapsed="0.001436"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.122051" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.122395" elapsed="0.000096"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:12.119570" elapsed="0.003035"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:12.118973" elapsed="0.003698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:12.058784" elapsed="0.063986"/>
</kw>
<msg time="2026-05-01T00:51:12.122861" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.122906" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.058170" elapsed="0.064772"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:12.123128" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:12.123018" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.123000" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.123666" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.124010" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.124081" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:12.057501" elapsed="0.066732"/>
</kw>
<msg time="2026-05-01T00:51:12.124412" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.124495" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.052805" elapsed="0.071741"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.125008" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.124653" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.124628" elapsed="0.000489"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:12.052660" elapsed="0.072490"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:12.052481" elapsed="0.072710"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:12.050086" elapsed="0.075181"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:12.044908" elapsed="0.080436"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.044484" elapsed="0.080922"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:12.041553" elapsed="0.083947"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.126370" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.125740" elapsed="0.000668"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.160646" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.160256" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.161412" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.161173" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.161599" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.160840" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.162169" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.161789" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.162513" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:12.162673" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:12.162361" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.163102" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.162858" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.164129" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.163870" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.165924" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.164340" elapsed="0.001611"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.166643" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.166322" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.167437" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.167185" elapsed="0.000293"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.167564" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:12.167723" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.166864" elapsed="0.000885"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.167905" elapsed="0.000242"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:12.166181" elapsed="0.002007"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.168754" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.168439" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.169518" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.169290" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.169595" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.169748" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.168970" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.169930" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:51:12.168303" elapsed="0.001896"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:12.166007" elapsed="0.004228"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:12.170278" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:51:12.170435" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:12.163542" elapsed="0.006934"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.163214" elapsed="0.007295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.170689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.170535" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.163196" elapsed="0.007570"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.171531" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.170911" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.171611" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.159642" elapsed="0.012095"/>
</kw>
<msg time="2026-05-01T00:51:12.171790" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.146816" elapsed="0.025020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.184564" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.197211" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.210035" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.210310" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.210509" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.210904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.210754" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:12.210738" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.211130" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.211299" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.211506" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:12.210704" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.210592" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.211744" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.211823" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:12.211963" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:12.142536" elapsed="0.069455"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.239041" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.238662" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.239854" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.239612" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.240021" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.239235" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.240615" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.240213" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.240945" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:12.241102" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:12.240807" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.241552" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.241288" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:12.241965" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.241669" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.242511" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.242199" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.242050" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.241650" elapsed="0.000981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.243369" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.242785" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.243477" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.238034" elapsed="0.005575"/>
</kw>
<msg time="2026-05-01T00:51:12.243663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.225167" elapsed="0.018543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.256256" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.268834" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.281525" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.281724" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.281904" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.282271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.282124" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:12.282110" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.282507" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.282679" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.282846" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:12.282082" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.281979" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.283072" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.283150" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:12.283272" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:12.222446" elapsed="0.060855"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.284691" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.284421" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.284847" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.284070" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.285189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.284942" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.285764" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.285470" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.285271" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.284924" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.288213" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.286003" elapsed="0.002237"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:12.288292" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.288448" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:12.283740" elapsed="0.004747"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.289882" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.289634" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.290322" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.290084" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.290844" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.290596" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.291278" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.291040" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:12.292811" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:51:12.292610" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:51:12.293190" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:51:12.293017" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.293365" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.293993" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.293747" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:51:12.294079" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.294235" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:51:12.292185" elapsed="0.002075"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:12.311008" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:51:12.311166" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:51:12 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:12.311517" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:12.296625" elapsed="0.014936"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.294329" elapsed="0.017301"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.311915" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.311671" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.294312" elapsed="0.017797"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.320149" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.314268" elapsed="0.005925"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.313774" elapsed="0.006454"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.313734" elapsed="0.006519"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.322845" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.320546" elapsed="0.002344"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.320308" elapsed="0.002617"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.320292" elapsed="0.002658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.323598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.323141" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.323942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.323697" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.324506" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.324192" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.324024" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.323679" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.325118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.324755" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.325464" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.325214" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.326003" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.325712" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.325548" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.325197" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.326240" elapsed="0.000462"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:12.327178" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.326874" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.327360" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:12.312952" elapsed="0.016830"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:12.329960" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:51:12.329850" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.329831" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.330212" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.330280" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:51:12.332667" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:12.288830" elapsed="0.043866"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.332819" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.332981" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:12.131644" elapsed="0.201362"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.333359" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.333106" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.333089" elapsed="0.000377"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.333501" elapsed="0.000027"/>
</return>
<arg>${BGP_DIR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:51:12.126803" elapsed="0.206825"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-05-01T00:51:12.040848" elapsed="0.292904"/>
</test>
<test id="s1-s13-t2" name="Reconfigure_ODL_To_Accept_Connection" line="54">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:12.337289" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:12.337023" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.338589" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.338477" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.338444" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.346129" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.346021" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.346002" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.347217" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.346834" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.347739" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:12.347429" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:12.347810" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:12.347967" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.346436" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.353545" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.353421" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.353402" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.354800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.354693" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.354675" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:12.355321" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.355017" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.355779" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.355554" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.397513" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:12.356303" elapsed="0.041403"/>
</kw>
<msg time="2026-05-01T00:51:12.397970" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:12.398036" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.355967" elapsed="0.042118"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.430862" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:12.398948" elapsed="0.032136"/>
</kw>
<msg time="2026-05-01T00:51:12.431362" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:12.431488" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.398377" elapsed="0.033171"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.432126" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.431703" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.431657" elapsed="0.000593"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.432968" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.432480" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.433497" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.433169" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.433142" elapsed="0.000466"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:12.433662" elapsed="0.000058"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.437072" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:51:12.437283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.435884" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.437914" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.438259" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:12.434923" elapsed="0.003541"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:12.434115" elapsed="0.004419"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:12.354367" elapsed="0.084265"/>
</kw>
<msg time="2026-05-01T00:51:12.438726" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.438770" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.353767" elapsed="0.085039"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:12.438990" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:12.438883" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.438864" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.439528" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.439873" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.439944" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:12.353082" elapsed="0.086968"/>
</kw>
<msg time="2026-05-01T00:51:12.440143" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.440186" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.348380" elapsed="0.091842"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.440564" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.440297" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.440280" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:12.348234" elapsed="0.092480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:12.348053" elapsed="0.092696"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:12.345659" elapsed="0.095146"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:12.338170" elapsed="0.102692"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.337727" elapsed="0.103181"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:12.334757" elapsed="0.106205"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.441765" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB_OPENCONFIG=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.441139" elapsed="0.000655"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.475749" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.475335" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.476559" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.476285" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.476733" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.475944" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.477304" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.476923" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.477647" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:12.477836" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:12.477509" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.478261" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.478019" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.479266" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.479011" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.479926" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.479497" elapsed="0.000455"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.480643" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.480323" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.481402" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.481185" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.481496" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:51:12.481653" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.480862" elapsed="0.000817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.481837" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:51:12.480185" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.482729" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.482411" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.483518" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.483260" elapsed="0.000285"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.483595" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.483747" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.482944" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.483926" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:51:12.482272" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.484750" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.484437" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.485504" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.485282" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.485581" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.485731" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.484965" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.485911" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:51:12.484302" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.486726" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.486417" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.487504" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.487256" elapsed="0.000282"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.487594" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.487747" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.486939" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.487924" elapsed="0.000228"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:51:12.486282" elapsed="0.001911"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.488781" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.488482" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.489538" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.489313" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.489622" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:51:12.489808" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.488995" elapsed="0.000844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.490026" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:51:12.488325" elapsed="0.001968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.491050" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:51:12.490560" elapsed="0.000516"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:51:12.491859" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.491649" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:51:12.491935" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.492086" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:51:12.491265" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.492265" elapsed="0.000255"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:51:12.490407" elapsed="0.002155"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:51:12.480005" elapsed="0.012595"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:51:12.492715" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.492877" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:51:12.478689" elapsed="0.014214"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.478375" elapsed="0.014560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.493113" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.492961" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.478355" elapsed="0.014834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.493999" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.493333" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.494076" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.474721" elapsed="0.019478"/>
</kw>
<msg time="2026-05-01T00:51:12.494254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.461862" elapsed="0.032439"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.506952" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.519774" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.532313" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.532528" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.532711" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.533087" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.532940" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:12.532924" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.533309" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.533493" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.533666" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:12.532894" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.532789" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.533895" elapsed="0.000106"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.534066" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:51:12.534197" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:12.457559" elapsed="0.076665"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.560870" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.560487" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.561682" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.561404" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.561854" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.561067" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.562429" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.562044" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.562775" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:12.562950" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:12.562637" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.563381" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.563140" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:12.563853" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.563550" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.564603" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.564082" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.563936" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.563530" elapsed="0.001159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.565602" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.564839" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.565682" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.559854" elapsed="0.005960"/>
</kw>
<msg time="2026-05-01T00:51:12.565922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.547019" elapsed="0.018951"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.578510" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.591087" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.603700" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.603899" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.604076" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.604469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.604307" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:51:12.604292" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.604696" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.604866" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.605034" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:51:12.604260" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.604155" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.605262" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.605337" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:51:12.605492" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:51:12.544361" elapsed="0.061161"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:12.606824" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.606552" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:12.607024" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.606191" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.607368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.607118" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.607959" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.607669" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.607480" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.607100" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.610396" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.608197" elapsed="0.002225"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:51:12.610487" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:12.610642" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:51:12.605859" elapsed="0.004808"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.612060" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.611818" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.612509" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.612260" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.612958" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.612719" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.613439" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.613160" elapsed="0.000349"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:12.614527" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:51:12.614294" elapsed="0.000260"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:51:12.614883" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:51:12.614711" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.615061" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.615900" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.615440" elapsed="0.000505"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:51:12.615989" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:12.616154" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:51:12.613738" elapsed="0.002441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:12.643961" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1090', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:51:12.644206" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:12.644433" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:12.618387" elapsed="0.026140"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.616252" elapsed="0.028385"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.645079" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.644701" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.616233" elapsed="0.029055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.653530" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.647673" elapsed="0.005963"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.647079" elapsed="0.006639"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.647036" elapsed="0.006743"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.657792" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.654480" elapsed="0.003357"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.653912" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.653873" elapsed="0.004024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.658493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.658077" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.658834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.658592" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.659374" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.659080" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.658915" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.658574" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.660011" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.659653" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.660346" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.660107" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.660895" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.660604" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:12.660425" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.660089" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.661131" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:51:12.661939" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:12.661656" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.662121" elapsed="0.002367"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:51:12.646203" elapsed="0.018346"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:51:12.664721" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:12.664616" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.664598" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.664959" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.665026" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:51:12.667319" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:51:12.610993" elapsed="0.056352"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.667486" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:12.667654" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:51:12.446571" elapsed="0.221108"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.668024" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.667780" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.667763" elapsed="0.000353"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:51:12.668150" elapsed="0.000026"/>
</return>
<arg>${BGP_DIR}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:51:12.442067" elapsed="0.226209"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:51:12.334102" elapsed="0.334299"/>
</test>
<test id="s1-s13-t3" name="Start_Bgp_Peer" line="66">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:12.672201" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:12.671927" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.673471" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.673349" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.673330" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.678547" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.678426" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.678409" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.679643" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:12.679221" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.680122" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:12.679831" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:12.680190" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:12.680342" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:12.678842" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.685927" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.685819" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.685800" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.687169" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:12.687062" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.687045" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:12.687729" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:12.687382" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.688137" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.687918" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.715600" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:12.688683" elapsed="0.027019"/>
</kw>
<msg time="2026-05-01T00:51:12.715868" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:12.715914" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.688328" elapsed="0.027620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.742593" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:12.716495" elapsed="0.026232"/>
</kw>
<msg time="2026-05-01T00:51:12.742888" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:12.742934" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.716126" elapsed="0.026843"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.743275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.743048" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.743028" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.744084" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.743776" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.744436" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.744217" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.744199" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:12.744567" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:12.747136" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:51:12.747341" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:12.746035" elapsed="0.001469"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.747784" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.748155" elapsed="0.000101"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:12.745398" elapsed="0.003009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:12.744848" elapsed="0.003674"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:12.686764" elapsed="0.061887"/>
</kw>
<msg time="2026-05-01T00:51:12.748767" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.748823" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.686149" elapsed="0.062720"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:12.749108" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:51:12.748972" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.748947" elapsed="0.000269"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.749740" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.750191" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:12.750282" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:12.685481" elapsed="0.064939"/>
</kw>
<msg time="2026-05-01T00:51:12.750552" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:12.750603" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.680767" elapsed="0.069876"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:12.750975" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:12.750720" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:12.750702" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:12.680618" elapsed="0.070481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:12.680423" elapsed="0.070714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:12.678072" elapsed="0.073132"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:12.673065" elapsed="0.078250"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:12.672638" elapsed="0.078732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:12.669577" elapsed="0.081894"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Start_Bgp_Peer">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.753369" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:12.753047" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:12.753932" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:12.753626" elapsed="0.000368"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:12.757350" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:51:12.757477" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:12.754197" elapsed="0.003311"/>
</kw>
<arg>--amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_TOOL_LOG_LEVEL} --evpn --wfr 1</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:51:12.752587" elapsed="0.004997"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:51:18.759792" level="FAIL">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.759208" elapsed="6.003597">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.763105" elapsed="0.000036"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:51:12.758938" elapsed="6.004321">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:51:12.758529" elapsed="6.004865"/>
</kw>
<msg time="2026-05-01T00:51:18.763520" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:12.758155" elapsed="6.005392"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:51:18.763740" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:51:18.763646" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.763621" elapsed="0.000211"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.764068" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.764265" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:51:12.757867" elapsed="6.006478"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-05-01T00:51:12.752230" elapsed="6.012169"/>
</kw>
<arg>3x</arg>
<arg>1s</arg>
<arg>Start Bgp Peer</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:12.751695" elapsed="6.012746"/>
</kw>
<doc>Start Python speaker to connect to ODL. We need to do WUKS until odl really starts to accept incomming bgp connection. The failure happens if the incomming connection comes too quickly after configuring the peer in the previous test case.</doc>
<status status="PASS" start="2026-05-01T00:51:12.668760" elapsed="6.095812"/>
</test>
<test id="s1-s13-t4" name="Odl_To_Play_route_es_arb" line="71">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:18.768566" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:18.768279" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:18.769865" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:18.769746" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.769727" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:18.774961" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:18.774853" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.774835" elapsed="0.000279"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.776181" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:18.775756" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.776692" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:18.776374" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:18.776763" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:18.776922" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:18.775353" elapsed="0.001594"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:18.782649" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:18.782539" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.782521" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:18.784260" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:18.784027" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.784009" elapsed="0.000418"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:18.785017" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:18.784598" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:18.785710" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:18.785429" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:18.816767" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:18.787626" elapsed="0.029288"/>
</kw>
<msg time="2026-05-01T00:51:18.817083" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:18.817176" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:18.786080" elapsed="0.031166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:18.845197" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:18.819276" elapsed="0.026067"/>
</kw>
<msg time="2026-05-01T00:51:18.845505" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:18.845604" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:18.817687" elapsed="0.027989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.846406" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:18.846000" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.845971" elapsed="0.000636"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.847368" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.846765" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.848047" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:18.847688" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.847667" elapsed="0.000653"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:18.848365" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:18.852103" elapsed="0.000178"/>
</kw>
<msg time="2026-05-01T00:51:18.852326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:18.851528" elapsed="0.000869"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.852711" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.852937" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:18.850725" elapsed="0.002435"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:18.848725" elapsed="0.004523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:18.783582" elapsed="0.069863"/>
</kw>
<msg time="2026-05-01T00:51:18.853566" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:18.853612" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:18.782875" elapsed="0.070774"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:18.853840" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:18.853730" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.853710" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.854411" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.854948" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:18.855025" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:18.782187" elapsed="0.072950"/>
</kw>
<msg time="2026-05-01T00:51:18.855233" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:18.855278" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:18.777328" elapsed="0.077986"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:18.855669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:18.855392" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.855373" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:18.777179" elapsed="0.078593"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:18.777003" elapsed="0.078806"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:18.774488" elapsed="0.081381"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:18.769436" elapsed="0.086490"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:18.768999" elapsed="0.086972"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:18.766043" elapsed="0.089984"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.869148" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.869429" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:18.869699" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.856507" elapsed="0.013250"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:18.870135" elapsed="0.006304"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.883659" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.883943" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:18.884052" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.876631" elapsed="0.007447"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:18.890166" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:18.889738" elapsed="0.000468"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:18.890838" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:18.890428" elapsed="0.000448"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:18.891102" elapsed="0.000491"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:18.884375" elapsed="0.007307"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:18.856208" elapsed="0.035551"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:18.765494" elapsed="0.126322"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:18.892985" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:18.893260" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:18.892688" elapsed="0.000613"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:18.893824" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:18.894002" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
         ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:18.893553" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:18.894552" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/announce_route_es_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/announce_route_es_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:18.894730" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:18.894263" elapsed="0.000505"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:18.895286" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:18.894992" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:18.895836" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/withdraw_route_es_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/withdraw_route_es_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:18.896013" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:18.895568" elapsed="0.000482"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:18.896561" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:18.896324" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.896996" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.896750" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.897499" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.897240" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.897945" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.897704" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.898389" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.898144" elapsed="0.000290"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:18.898605" elapsed="0.002451"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.915887" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '706', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:18.915989" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.916186" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.901252" elapsed="0.014974"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.922912" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.916624" elapsed="0.006406"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.929976" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.930353" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '339'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:18.930539" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.923518" elapsed="0.007052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.934070" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.930803" elapsed="0.003340"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.942002" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.942700" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '339'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:18.942909" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.935713" elapsed="0.007239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.947285" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.943315" elapsed="0.004044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:18.947620" elapsed="0.003598"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:18.953640" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:18.951393" elapsed="0.002278"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:18.953861" elapsed="0.002347"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:18.956307" elapsed="0.000063"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:18.935169" elapsed="0.021372"/>
</kw>
<msg time="2026-05-01T00:51:18.956642" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:18.934402" elapsed="0.022269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.957210" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.956903" elapsed="0.000354"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.958251" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:18.958327" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:18.957963" elapsed="0.000388"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.958788" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:18.958862" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:18.958530" elapsed="0.000355"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:18.959046" elapsed="0.000306"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:18.959733" level="INFO">${sum_1} = 1851</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:18.959542" elapsed="0.000217"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:18.960094" level="INFO">${sum_2} = 1851</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:18.959914" elapsed="0.000206"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:18.960348" elapsed="0.000336"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:18.957552" elapsed="0.003196"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:18.960903" elapsed="0.002043"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.969177" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.969379" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '339'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:18.969565" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.963783" elapsed="0.005911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.974079" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.969964" elapsed="0.004188"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:18.974394" elapsed="0.003237"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:18.985367" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:18.985770" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '339'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:18.986084" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.977810" elapsed="0.008345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:18.991061" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:18.986698" elapsed="0.004433"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:18.991360" elapsed="0.003544"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:18.998265" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:18.995034" elapsed="0.003305"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:18.994996" elapsed="0.003376"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.005083" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.005130" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.005232" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:18.998619" elapsed="0.006641"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:18.963327" elapsed="0.042009"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.012138" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.012271" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:19.012365" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:19.006388" elapsed="0.006002"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.016014" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.012661" elapsed="0.003536"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:19.016420" elapsed="0.003502"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:19.022338" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:19.020190" elapsed="0.002177"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:19.022569" elapsed="0.002153"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:19.024772" elapsed="0.000041"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:19.006036" elapsed="0.018878"/>
</kw>
<msg time="2026-05-01T00:51:19.024993" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:19.005542" elapsed="0.019476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.025427" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.025183" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.026347" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:19.026422" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:19.026086" elapsed="0.000379"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.026874" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:19.026948" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:19.026624" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:19.027128" elapsed="0.000302"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:19.027787" level="INFO">${sum_1} = 1404</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:19.027608" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:19.028138" level="INFO">${sum_2} = 1404</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:19.027965" elapsed="0.000223"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:19.028342" elapsed="0.000448"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:19.025723" elapsed="0.003150"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.034929" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.035079" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:19.035206" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:19.029682" elapsed="0.005559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.039177" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.035506" elapsed="0.003736"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:19.039483" elapsed="0.003502"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.051735" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.051851" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:19.052013" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:19.043210" elapsed="0.008831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.057700" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.052261" elapsed="0.005545"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:19.058154" elapsed="0.005810"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:19.066622" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:51:19.064142" elapsed="0.002553"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.064094" elapsed="0.002627"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.066877" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:19.029233" elapsed="0.037739"/>
</kw>
<arg>route_es_arb</arg>
<status status="PASS" start="2026-05-01T00:51:18.892205" elapsed="0.174816"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:18.765004" elapsed="0.302135"/>
</test>
<test id="s1-s13-t5" name="Play_To_Odl_route_es_arb" line="73">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:19.070999" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:19.070736" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:19.072282" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:19.072170" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.072138" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:19.077357" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:19.077250" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.077232" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.078433" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:19.078050" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.078934" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:19.078640" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:19.079004" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:19.079161" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:19.077672" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:19.084960" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:19.084853" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.084834" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:19.086485" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:19.086282" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.086264" elapsed="0.000385"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:19.087214" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:19.086801" elapsed="0.000475"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:19.087910" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:19.087645" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:19.119089" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:19.089856" elapsed="0.029361"/>
</kw>
<msg time="2026-05-01T00:51:19.119352" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:19.119811" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:19.088308" elapsed="0.031579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:19.146791" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:19.121889" elapsed="0.025032"/>
</kw>
<msg time="2026-05-01T00:51:19.147053" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:19.147146" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:19.120321" elapsed="0.026895"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.147907" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:19.147544" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.147522" elapsed="0.000560"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.148849" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.148260" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.149514" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:19.149140" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.149120" elapsed="0.000568"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:19.149726" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:19.153310" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:51:19.153519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:19.152762" elapsed="0.000824"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.153805" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.154024" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:19.151958" elapsed="0.002284"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:19.150015" elapsed="0.004314"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:19.085844" elapsed="0.068678"/>
</kw>
<msg time="2026-05-01T00:51:19.154619" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:19.154663" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:19.085187" elapsed="0.069513"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:19.154885" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:19.154778" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.154759" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.155443" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.155886" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:19.155960" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:19.084514" elapsed="0.071558"/>
</kw>
<msg time="2026-05-01T00:51:19.156193" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:19.156240" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:19.079590" elapsed="0.076686"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.156663" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:19.156392" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.156373" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:19.079425" elapsed="0.077340"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:19.079244" elapsed="0.077554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:19.076892" elapsed="0.079965"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:19.071868" elapsed="0.085045"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:19.071413" elapsed="0.085547"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:19.068558" elapsed="0.088456"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.163183" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.163325" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:19.163422" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:19.157442" elapsed="0.006005"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:19.163636" elapsed="0.003953"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.172428" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.172605" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:19.172752" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:19.167825" elapsed="0.004965"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:19.177098" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:19.176677" elapsed="0.000460"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:19.177758" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:19.177357" elapsed="0.000439"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:19.178017" elapsed="0.000472"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:19.173111" elapsed="0.005464"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:19.157167" elapsed="0.021484"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:19.068014" elapsed="0.110694"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:19.179717" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:19.179923" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:19.179420" elapsed="0.000590"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.207406" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_arb.vanadium/route_es_arb.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:19.207015" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:19.208238" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb.vanadium/route_es_arb.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:19.207963" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb.vanadium/route_es_arb.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:19.208407" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:19.207618" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.209000" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:19.208615" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:19.209324" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/route_es_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:19.209475" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
         ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:19.209190" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.209904" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.209664" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:19.210345" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:19.210025" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.210889" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:19.210596" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:19.210431" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:19.210003" elapsed="0.000969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.211609" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
         ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:19.211130" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:19.211688" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:51:19.211849" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
         ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:19.204676" elapsed="0.007199"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:19.212254" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/announce_route_es_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/announce_route_es_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:19.212379" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:19.212036" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:19.212797" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/withdraw_route_es_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_arb/withdraw_route_es_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:19.212917" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:19.212597" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.213399" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.213153" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.213863" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.213625" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.214303" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.214065" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:19.214755" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:19.214516" elapsed="0.000284"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:19.214951" elapsed="0.002626"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:19.217735" elapsed="0.001671"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:19.227626" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:19.227788" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:19.227921" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:19.220399" elapsed="0.008094">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.228758" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:19.229084" elapsed="0.000034"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:19.220029" elapsed="0.009231">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:21.236508" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:21.236694" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '339'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:21.236874" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:21.230261" elapsed="0.006641"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:21.237399" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:21.239736" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:21.237096" elapsed="0.002690"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:21.243039" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:21.242597" elapsed="0.000471"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:21.243635" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:21.243226" elapsed="0.000437"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:21.243822" elapsed="0.000329"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:21.240022" elapsed="0.004194"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:21.229762" elapsed="0.014509"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:19.219610" elapsed="2.024709"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:21.244501" elapsed="0.002387"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:21.253748" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:21.253868" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:21.253964" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:21.247814" elapsed="0.006176"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:21.254157" elapsed="0.002825"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:21.261942" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:21.262362" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:21.262490" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:21.257150" elapsed="0.005369"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:21.265647" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:21.265291" elapsed="0.000386"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:21.266292" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:21.265835" elapsed="0.000485"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:21.266812" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:21.267015" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:21.266497" elapsed="0.000597">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:21.262756" elapsed="0.004480">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:21.247535" elapsed="0.019822">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.276951" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.277144" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.277288" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.268796" elapsed="0.008530"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.277598" elapsed="0.003665"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.287948" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.288172" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:23.288317" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.281521" elapsed="0.006834"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.292750" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.292310" elapsed="0.000481"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.293421" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.293035" elapsed="0.000445"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.293736" elapsed="0.000463"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.288721" elapsed="0.005565"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.267950" elapsed="0.026411"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:21.247087" elapsed="2.047329"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:23.295193" elapsed="0.002495"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.304974" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.305086" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.305191" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.299289" elapsed="0.005928"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.305384" elapsed="0.002544"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.313404" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.313581" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:23.313724" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.308092" elapsed="0.005669"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.318143" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.317743" elapsed="0.000439"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.318799" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.318400" elapsed="0.000437"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.319053" elapsed="0.000473"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.314083" elapsed="0.005597"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.298574" elapsed="0.021181"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:23.297961" elapsed="0.021848"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:23.294700" elapsed="0.025184"/>
</kw>
<arg>route_es_arb</arg>
<status status="PASS" start="2026-05-01T00:51:19.179005" elapsed="4.140944"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:19.067521" elapsed="4.252578"/>
</test>
<test id="s1-s13-t6" name="Odl_To_Play_route_es_as" line="76">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:23.325377" elapsed="0.000310"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:23.325006" elapsed="0.000758"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.327189" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.327020" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.326989" elapsed="0.000304"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.333122" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.333013" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.332994" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.334211" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:23.333828" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.334717" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:23.334402" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:23.334789" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:51:23.334983" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:23.333426" elapsed="0.001588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.340771" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.340656" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.340637" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.342330" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.342141" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.342121" elapsed="0.000396"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:23.343101" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:23.342684" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.343815" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:23.343537" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.375712" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:23.345823" elapsed="0.030205"/>
</kw>
<msg time="2026-05-01T00:51:23.376376" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:23.376654" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.344196" elapsed="0.032619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.403699" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:23.379223" elapsed="0.024608"/>
</kw>
<msg time="2026-05-01T00:51:23.403966" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:23.404060" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.377660" elapsed="0.026471"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.404884" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.404434" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.404411" elapsed="0.000704"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.405866" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.405269" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.406534" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.406160" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.406140" elapsed="0.000570"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:23.406749" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:23.410322" elapsed="0.001710"/>
</kw>
<msg time="2026-05-01T00:51:23.412078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:23.409783" elapsed="0.002363"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.412365" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.412614" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:23.409003" elapsed="0.003833"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:23.407034" elapsed="0.005888"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:23.341694" elapsed="0.071472"/>
</kw>
<msg time="2026-05-01T00:51:23.413259" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:23.413303" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.341018" elapsed="0.072321"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:23.413549" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:23.413417" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.413398" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.414107" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.414603" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.414679" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:23.340296" elapsed="0.074496"/>
</kw>
<msg time="2026-05-01T00:51:23.414885" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:23.414930" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.335401" elapsed="0.079564"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.415297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.415041" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.415024" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:23.335252" elapsed="0.080147"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:23.335071" elapsed="0.080358"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:23.332625" elapsed="0.082897"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:23.326607" elapsed="0.088972"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.325976" elapsed="0.089647"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:23.321942" elapsed="0.093732"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.422331" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.422535" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.422686" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.416138" elapsed="0.006584"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.422956" elapsed="0.003704"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.431937" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.432042" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:23.432143" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.426895" elapsed="0.005275"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.435261" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.434958" elapsed="0.000331"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.435733" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.435445" elapsed="0.000317"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.435917" elapsed="0.000325"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.432399" elapsed="0.003904"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.415863" elapsed="0.020495"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:23.321233" elapsed="0.115164"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.437186" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.437349" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.436984" elapsed="0.000393"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.437743" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.437867" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
       ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.437552" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.438237" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/announce_route_es_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/announce_route_es_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.438358" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.438049" elapsed="0.000363"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:23.438801" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:23.438588" elapsed="0.000240"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.439175" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/withdraw_route_es_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/withdraw_route_es_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.439300" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.438987" elapsed="0.000339"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:23.439701" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:23.439499" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.440132" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.439888" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.440601" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.440341" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.441100" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.440804" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.441577" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.441303" elapsed="0.000337"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:23.441857" elapsed="0.002715"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.454996" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '754', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:23.455084" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.455227" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.444829" elapsed="0.010435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.458983" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.455534" elapsed="0.003509"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.466436" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.466920" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:23.467068" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.459308" elapsed="0.007797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.470772" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.467341" elapsed="0.003500"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.477768" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.478234" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:23.478373" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.472168" elapsed="0.006241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.482085" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.478672" elapsed="0.003483"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.482375" elapsed="0.003635"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.488490" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.486239" elapsed="0.002321"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.488785" elapsed="0.003105"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:23.491966" elapsed="0.000049"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:23.471710" elapsed="0.020444"/>
</kw>
<msg time="2026-05-01T00:51:23.492266" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:23.471080" elapsed="0.021223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.492906" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.492558" elapsed="0.000441"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.494228" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:23.494333" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:23.493865" elapsed="0.000501"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.494969" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:23.495072" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:23.494612" elapsed="0.000492"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.495371" elapsed="0.000456"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.496303" level="INFO">${sum_1} = 2075</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:23.496050" elapsed="0.000289"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.496824" level="INFO">${sum_2} = 2075</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:23.496574" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.497097" elapsed="0.000448"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:23.493330" elapsed="0.004299"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:23.497840" elapsed="0.001922"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.506824" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.506972" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:23.507070" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.500276" elapsed="0.006820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.512818" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.507267" elapsed="0.005659"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.513297" elapsed="0.004877"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.523902" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.524015" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:23.524119" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.518336" elapsed="0.005809"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.527279" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.524315" elapsed="0.003033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.527592" elapsed="0.003501"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:23.534435" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.531202" elapsed="0.003314"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.531174" elapsed="0.003374"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.541235" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.541317" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.541420" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.534758" elapsed="0.006690"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:23.500000" elapsed="0.041538"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.549039" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.549191" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.549320" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.542486" elapsed="0.006869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.553046" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.549621" elapsed="0.003494"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.553333" elapsed="0.003490"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.559477" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.557071" elapsed="0.002472"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.559764" elapsed="0.003223"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:23.563059" elapsed="0.000043"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:23.542139" elapsed="0.021100"/>
</kw>
<msg time="2026-05-01T00:51:23.563352" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:23.541703" elapsed="0.021685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.563986" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.563641" elapsed="0.000408"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.565280" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:23.565384" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:23.564900" elapsed="0.000516"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.566009" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:23.566110" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:23.565658" elapsed="0.000485"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.566356" elapsed="0.000447"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.567265" level="INFO">${sum_1} = 1628</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:23.567020" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:23.567785" level="INFO">${sum_2} = 1628</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:23.567535" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.568035" elapsed="0.000442"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:23.564369" elapsed="0.004194"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.575100" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.575208" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.575301" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.569417" elapsed="0.005910"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.578172" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.575518" elapsed="0.002703"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.578377" elapsed="0.002518"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.585370" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.585549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.585694" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.581091" elapsed="0.004640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.589391" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.585971" elapsed="0.003506"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.589700" elapsed="0.003705"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:23.596766" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:51:23.593535" elapsed="0.003317"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.593507" elapsed="0.003380"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.597116" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:23.568993" elapsed="0.028247"/>
</kw>
<arg>route_es_as</arg>
<status status="PASS" start="2026-05-01T00:51:23.436672" elapsed="0.160630"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.320541" elapsed="0.276907"/>
</test>
<test id="s1-s13-t7" name="Play_To_Odl_route_es_as" line="78">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:23.602325" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:23.602062" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.603589" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.603477" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.603442" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.608802" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.608695" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.608677" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.609958" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:23.609571" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.610443" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:23.610147" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:23.610532" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:23.610692" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:23.609140" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.616517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.616391" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.616372" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.618032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:23.617848" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.617830" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:23.618770" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:23.618348" elapsed="0.000483"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.619439" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:23.619177" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.650909" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:23.621362" elapsed="0.029701"/>
</kw>
<msg time="2026-05-01T00:51:23.651210" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:23.651307" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.619825" elapsed="0.031553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:23.675379" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:23.653468" elapsed="0.022062"/>
</kw>
<msg time="2026-05-01T00:51:23.675664" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:23.675758" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.651838" elapsed="0.023990"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.676537" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.676132" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.676109" elapsed="0.000609"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.677494" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.676871" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.678143" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.677793" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.677773" elapsed="0.000545"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:23.678355" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:23.681980" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:51:23.682167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:23.681420" elapsed="0.000816"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.682470" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.682750" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:23.680632" elapsed="0.002340"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:23.678655" elapsed="0.004402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:23.617387" elapsed="0.065848"/>
</kw>
<msg time="2026-05-01T00:51:23.683330" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:23.683376" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.616742" elapsed="0.066670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:23.683620" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:23.683506" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.683487" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.684175" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.684639" elapsed="0.000194"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:23.684882" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:23.616049" elapsed="0.068971"/>
</kw>
<msg time="2026-05-01T00:51:23.685118" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:23.685161" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.611098" elapsed="0.074098"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.685568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.685272" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.685254" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:23.610952" elapsed="0.074719"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:23.610774" elapsed="0.074928"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:23.608314" elapsed="0.077444"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:23.603176" elapsed="0.082640"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:23.602752" elapsed="0.083109"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:23.599157" elapsed="0.086758"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.692025" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.692166" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.692264" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.686337" elapsed="0.005952"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:23.692482" elapsed="0.002900"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.701933" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.702133" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:23.702279" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:23.695565" elapsed="0.006750"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.706679" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.706234" elapsed="0.000485"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:23.707328" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:23.706943" elapsed="0.000423"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.707611" elapsed="0.000450"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:23.702669" elapsed="0.005477"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.686063" elapsed="0.022159"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:23.598509" elapsed="0.109769"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.709348" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.709570" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.709056" elapsed="0.000543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.735280" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_as.vanadium/route_es_as.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:23.734886" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.736105" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as.vanadium/route_es_as.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:23.735847" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as.vanadium/route_es_as.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:23.736279" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:23.735499" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.736877" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:23.736490" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.737240" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/route_es_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.737381" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.737101" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.737825" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.737583" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:23.738289" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:23.737950" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.738887" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:23.738539" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.738374" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:23.737928" elapsed="0.001044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.739579" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:23.739122" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:23.739660" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:51:23.739823" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
       ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:23.732557" elapsed="0.007293"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.740205" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/announce_route_es_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/announce_route_es_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.740331" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.740011" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:23.740723" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/withdraw_route_es_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_as/withdraw_route_es_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:23.740844" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:23.740528" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.741299" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.741055" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.741763" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.741524" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.742198" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.741963" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:23.742687" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:23.742393" elapsed="0.000339"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:23.742882" elapsed="0.002722"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:23.745855" elapsed="0.002138"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:23.755013" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:23.755187" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:23.755366" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:23.749358" elapsed="0.006578">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.756199" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:23.756552" elapsed="0.000037"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:23.748876" elapsed="0.007856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:25.767472" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:25.767683" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:25.767829" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:25.758533" elapsed="0.009333"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:25.768560" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:25.771796" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:25.768122" elapsed="0.003744"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:25.776502" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:25.775863" elapsed="0.000680"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:25.777311" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:25.776761" elapsed="0.000589"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:25.777610" elapsed="0.000459"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:25.772182" elapsed="0.005975"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:25.757449" elapsed="0.020783"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:23.748259" elapsed="2.030039"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:25.778540" elapsed="0.002038"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:25.786513" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:25.786689" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:25.786785" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:25.781518" elapsed="0.005293"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:25.786977" elapsed="0.002820"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:25.795137" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:25.795747" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '504'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:25.795897" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:25.789964" elapsed="0.005971"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:25.800315" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:25.799923" elapsed="0.000431"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:25.801218" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:25.800592" elapsed="0.000665"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:25.801964" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "as-generated": {
        "as": 16843009,
        "local-discriminator": 2000
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:25.802237" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:25.801519" elapsed="0.000820">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:25.796249" elapsed="0.006308">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:25.781198" elapsed="0.021732">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQUBAQEBAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.812477" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.812698" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:27.812860" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.804549" elapsed="0.008351"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:27.813175" elapsed="0.004178"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.823343" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.823530" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:27.823681" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.817635" elapsed="0.006088"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.828137" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.827706" elapsed="0.000471"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.828811" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.828400" elapsed="0.000449"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.829072" elapsed="0.000492"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.824069" elapsed="0.005584"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:27.803695" elapsed="0.026037"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:25.780775" elapsed="2.049015"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:27.830662" elapsed="0.002427"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.838897" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.839010" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:27.839190" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.834359" elapsed="0.004858"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:27.839384" elapsed="0.002601"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.847017" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.847172" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:27.847316" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.842153" elapsed="0.005200"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.851821" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.851395" elapsed="0.000466"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.852481" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.852081" elapsed="0.000441"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.852745" elapsed="0.000455"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.847708" elapsed="0.005580"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:27.833753" elapsed="0.019610"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:27.833290" elapsed="0.020127"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:27.830124" elapsed="0.023390"/>
</kw>
<arg>route_es_as</arg>
<status status="PASS" start="2026-05-01T00:51:23.708598" elapsed="4.144986"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:23.597878" elapsed="4.255859"/>
</test>
<test id="s1-s13-t8" name="Odl_To_Play_route_es_lacp" line="81">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:27.859565" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:27.859252" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:27.860879" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:27.860755" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.860730" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:27.866093" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:27.865965" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.865942" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.867198" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:27.866812" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.867704" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:27.867389" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:27.867775" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:51:27.867942" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:27.866413" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:27.873772" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:27.873656" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.873638" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:27.875390" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:27.875201" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.875182" elapsed="0.000401"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:27.876157" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:27.875738" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:27.876863" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:27.876587" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:27.905991" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:27.878880" elapsed="0.027242"/>
</kw>
<msg time="2026-05-01T00:51:27.906261" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:27.906356" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:27.877238" elapsed="0.029189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:27.931034" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:27.908425" elapsed="0.022752"/>
</kw>
<msg time="2026-05-01T00:51:27.931310" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:27.931412" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:27.906855" elapsed="0.024660"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.932190" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:27.931826" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.931804" elapsed="0.000562"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.933131" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.932534" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.933794" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:27.933424" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.933404" elapsed="0.000624"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:27.934075" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:27.937665" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:51:27.937851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:27.937080" elapsed="0.000876"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.938183" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.938415" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:27.936315" elapsed="0.002336"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:27.934373" elapsed="0.004430"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:27.874751" elapsed="0.064235"/>
</kw>
<msg time="2026-05-01T00:51:27.939082" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:27.939126" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:27.874028" elapsed="0.065133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:27.939348" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:27.939239" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.939220" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.940012" elapsed="0.000069"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.940501" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:27.940575" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:27.873299" elapsed="0.067388"/>
</kw>
<msg time="2026-05-01T00:51:27.940781" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:27.940826" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:27.868350" elapsed="0.072511"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:27.941191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:27.940936" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:27.940919" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:27.868203" elapsed="0.073089"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:27.868024" elapsed="0.073299"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:27.865573" elapsed="0.075807"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:27.860434" elapsed="0.081001"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:27.859988" elapsed="0.081520"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:27.856329" elapsed="0.085233"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.946770" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.946896" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:27.947005" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.942019" elapsed="0.005012"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:27.947198" elapsed="0.002592"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.955362" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.955491" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:27.955597" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.949982" elapsed="0.005642"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.959955" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.959527" elapsed="0.000468"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:27.960672" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:27.960215" elapsed="0.000542"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.960987" elapsed="0.000452"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:27.955928" elapsed="0.005621"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:27.941709" elapsed="0.019915"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:27.855135" elapsed="0.106545"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:27.962864" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:27.963117" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:27.962578" elapsed="0.000579"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:27.963668" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:27.963844" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
   ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:27.963380" elapsed="0.000501"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:27.964362" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/announce_route_es_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/announce_route_es_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:27.964556" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:27.964100" elapsed="0.000493"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:27.965102" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:27.964815" elapsed="0.000324"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:27.965644" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/withdraw_route_es_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/withdraw_route_es_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:27.965818" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:27.965358" elapsed="0.000496"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:27.966477" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:27.966164" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.966986" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.966738" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.967433" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.967194" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.967894" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.967652" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.968366" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.968126" elapsed="0.000286"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:27.968576" elapsed="0.002183"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.978982" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '803', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:27.979069" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQHyDN2An%2FcAFgAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.979200" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.970947" elapsed="0.008289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.983205" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.979512" elapsed="0.003753"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.989075" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:27.989601" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:27.989750" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.983509" elapsed="0.006278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:27.993492" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:27.990069" elapsed="0.003494"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:27.999992" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.000485" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:28.000664" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:27.995005" elapsed="0.005696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.004363" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.000939" elapsed="0.003493"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.004670" elapsed="0.003596"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.010655" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:28.008528" elapsed="0.002170"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.010919" elapsed="0.003069"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:28.014078" elapsed="0.000066"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:27.994543" elapsed="0.019767"/>
</kw>
<msg time="2026-05-01T00:51:28.014425" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:27.993798" elapsed="0.020684"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.014975" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.014724" elapsed="0.000297"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.015938" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:28.016012" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:28.015672" elapsed="0.000363"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.016445" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:28.016537" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:28.016190" elapsed="0.000370"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.016717" elapsed="0.000307"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.017368" level="INFO">${sum_1} = 2883</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:28.017183" elapsed="0.000210"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.017743" level="INFO">${sum_2} = 2883</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:28.017562" elapsed="0.000206"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.017922" elapsed="0.000364"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:28.015268" elapsed="0.003079"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:28.018515" elapsed="0.001616"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.025436" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.025580" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:28.025676" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.020681" elapsed="0.005021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.029868" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.025872" elapsed="0.004181"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.030253" elapsed="0.002525"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.037527" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.037689" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:28.037835" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.032943" elapsed="0.004929"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.041544" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.038151" elapsed="0.003463"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.041832" elapsed="0.003583"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:28.048899" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:28.045553" elapsed="0.003410"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.045523" elapsed="0.003473"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.056036" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.056082" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.056183" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.049207" elapsed="0.007002"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:28.020381" elapsed="0.035894"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.062858" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.063013" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:28.063144" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.057436" elapsed="0.005743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.066894" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.063417" elapsed="0.003544"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.067181" elapsed="0.003579"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.073159" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:28.071008" elapsed="0.002293"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.073644" elapsed="0.003930"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:28.077662" elapsed="0.000057"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:28.057045" elapsed="0.020840"/>
</kw>
<msg time="2026-05-01T00:51:28.078084" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:28.056481" elapsed="0.021654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.079858" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.078483" elapsed="0.001438"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.081081" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:28.081168" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:28.080736" elapsed="0.000456"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.081764" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:28.081867" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:28.081395" elapsed="0.000504"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.082135" elapsed="0.000430"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.083015" level="INFO">${sum_1} = 2436</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:28.082780" elapsed="0.000267"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:28.083503" level="INFO">${sum_2} = 2436</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:28.083248" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.083744" elapsed="0.000403"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:28.080233" elapsed="0.003996"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.090038" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.090179" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:28.090298" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.084982" elapsed="0.005352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.094028" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.090584" elapsed="0.003494"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.094236" elapsed="0.003113"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.103900" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.104098" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:28.104345" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.097571" elapsed="0.006825"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.109215" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.104693" elapsed="0.004615"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.109633" elapsed="0.003595"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:28.116192" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:51:28.113324" elapsed="0.002951"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.113297" elapsed="0.003012"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.116483" elapsed="0.000025"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:28.084582" elapsed="0.031994"/>
</kw>
<arg>route_es_lacp</arg>
<status status="PASS" start="2026-05-01T00:51:27.962103" elapsed="0.154518"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:27.854378" elapsed="0.262369"/>
</test>
<test id="s1-s13-t9" name="Play_To_Odl_route_es_lacp" line="83">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:28.121790" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:28.121421" elapsed="0.000685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:28.123287" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:28.123173" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.123154" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:28.129441" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:28.129300" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.129275" elapsed="0.000281"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.130882" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:28.130373" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.131518" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:28.131128" elapsed="0.000422"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:28.131611" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:51:28.131814" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:28.129833" elapsed="0.002010"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:28.139507" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:28.139347" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.139323" elapsed="0.000281"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:28.141405" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:28.141204" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.141184" elapsed="0.000455"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:28.142372" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:28.141819" elapsed="0.000652"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:28.143182" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:28.142900" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:28.175980" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:28.145684" elapsed="0.030451"/>
</kw>
<msg time="2026-05-01T00:51:28.176278" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:28.176377" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:28.143705" elapsed="0.032776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:28.207486" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:28.178524" elapsed="0.029099"/>
</kw>
<msg time="2026-05-01T00:51:28.207762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:28.207857" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:28.176894" elapsed="0.031036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.208627" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:28.208237" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.208214" elapsed="0.000592"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.209545" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.208956" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.210288" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:28.209842" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.209822" elapsed="0.000663"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:28.210526" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:28.214295" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:51:28.214560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:28.213588" elapsed="0.001042"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.214850" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.215068" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:28.212787" elapsed="0.002686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:28.210833" elapsed="0.004738"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:28.140677" elapsed="0.075075"/>
</kw>
<msg time="2026-05-01T00:51:28.215847" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:28.215891" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:28.139814" elapsed="0.076115"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:28.216116" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:28.216007" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.215988" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.216692" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.217119" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:28.217193" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:28.138924" elapsed="0.078380"/>
</kw>
<msg time="2026-05-01T00:51:28.217399" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:28.217443" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:28.132337" elapsed="0.085160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.217830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:28.217574" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.217557" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:28.132135" elapsed="0.085796"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:28.131910" elapsed="0.086138"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:28.128835" elapsed="0.089293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:28.122865" elapsed="0.095332"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:28.122289" elapsed="0.095955"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:28.118714" elapsed="0.099585"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.224403" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.224560" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:28.224658" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.218879" elapsed="0.005806"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:28.224850" elapsed="0.003273"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.233584" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.233735" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:28.233879" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:28.228353" elapsed="0.005564"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:28.238444" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:28.237940" elapsed="0.000566"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:28.239136" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:28.238737" elapsed="0.000440"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.239408" elapsed="0.000500"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:28.234331" elapsed="0.005667"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:28.218595" elapsed="0.021483"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:28.117811" elapsed="0.122324"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:28.241203" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:28.241421" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:28.240906" elapsed="0.000578"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.267856" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_lacp.vanadium/route_es_lacp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:28.267476" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:28.268721" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp.vanadium/route_es_lacp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:28.268440" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp.vanadium/route_es_lacp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:28.268897" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:28.268094" elapsed="0.000828"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.269496" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:28.269090" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:28.269825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/route_es_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:28.269952" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
   ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:28.269690" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.270465" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.270201" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:28.270905" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:28.270589" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.271434" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:28.271140" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:28.270990" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:28.270568" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.272138" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
   ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:28.271688" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:28.272219" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:51:28.272379" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
   ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:28.265118" elapsed="0.007287"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:28.272779" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/announce_route_es_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/announce_route_es_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:28.272904" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:28.272584" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:28.273277" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/withdraw_route_es_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lacp/withdraw_route_es_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:28.273397" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:28.273088" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.273873" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.273629" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.274415" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.274169" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.274878" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.274637" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:28.275315" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:28.275077" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:28.275527" elapsed="0.002395"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:28.278157" elapsed="0.001831"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:28.285265" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:28.285421" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:28.285577" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:28.280952" elapsed="0.005183">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.286416" elapsed="0.000051"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:28.286770" elapsed="0.000032"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:28.280625" elapsed="0.006320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:30.296216" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:30.296547" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:30.296775" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:30.288591" elapsed="0.008244"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:30.297932" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:30.303144" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:30.297247" elapsed="0.005967"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:30.308134" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:30.307300" elapsed="0.000883"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:30.309335" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:30.308479" elapsed="0.000901"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:30.309682" elapsed="0.000549"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:30.303580" elapsed="0.006745"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:30.287640" elapsed="0.022764"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:28.280184" elapsed="2.030329"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:30.310742" elapsed="0.002267"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:30.320109" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:30.320305" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:30.320447" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:30.313997" elapsed="0.006518"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:30.320771" elapsed="0.004333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:30.331130" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:30.331611" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '534'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:30.331725" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:30.325353" elapsed="0.006398"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:30.334904" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:30.334590" elapsed="0.000342"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:30.335562" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:30.335091" elapsed="0.000500"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:30.336149" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:30.336352" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:30.335818" elapsed="0.000613">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:30.332007" elapsed="0.004583">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:30.313709" elapsed="0.023007">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQHyDN2An/cAFgAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.346413" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.346743" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.346967" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.338190" elapsed="0.008963"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.347614" elapsed="0.003782"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.357707" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.357856" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:32.358065" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.351654" elapsed="0.006449"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.362442" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.362023" elapsed="0.000480"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.363130" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.362727" elapsed="0.000442"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.363392" elapsed="0.000478"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.358429" elapsed="0.005527"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.337373" elapsed="0.026794"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:30.313215" elapsed="2.051007"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:32.364992" elapsed="0.002386"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.378971" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.379206" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.379388" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.369001" elapsed="0.010426"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.379734" elapsed="0.003943"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.390688" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.390835" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:32.390978" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.383914" elapsed="0.007125"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.395556" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.395112" elapsed="0.000484"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.396202" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.395820" elapsed="0.000421"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.396486" elapsed="0.000464"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.391379" elapsed="0.005660"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.368262" elapsed="0.028855"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:32.367682" elapsed="0.029491"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:32.364501" elapsed="0.032826"/>
</kw>
<arg>route_es_lacp</arg>
<status status="PASS" start="2026-05-01T00:51:28.240469" elapsed="4.156931"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:28.117305" elapsed="4.280268"/>
</test>
<test id="s1-s13-t10" name="Odl_To_Play_route_es_lan" line="86">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:32.402022" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:32.401750" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.403339" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.403216" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.403193" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.408433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.408325" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.408307" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.409529" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:32.409130" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.410014" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:32.409721" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:32.410086" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:51:32.410249" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:32.408750" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.416093" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.415983" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.415964" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.417635" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.417425" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.417407" elapsed="0.000395"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:32.418369" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:32.417955" elapsed="0.000476"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.419095" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:32.418801" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.450443" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:32.421186" elapsed="0.029412"/>
</kw>
<msg time="2026-05-01T00:51:32.450739" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:32.450836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.419491" elapsed="0.031417"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.478177" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:32.452941" elapsed="0.025375"/>
</kw>
<msg time="2026-05-01T00:51:32.478469" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:32.478569" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.451344" elapsed="0.027298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.479337" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.478946" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.478921" elapsed="0.000621"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.480270" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.479697" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.481146" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.480639" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.480617" elapsed="0.000701"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:32.481358" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:32.485074" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:51:32.485263" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:32.484442" elapsed="0.000888"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.485568" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.485786" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:32.483636" elapsed="0.002372"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:32.481666" elapsed="0.004427"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:32.416982" elapsed="0.069287"/>
</kw>
<msg time="2026-05-01T00:51:32.486363" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:32.486407" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.416318" elapsed="0.070126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:32.486653" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:32.486544" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.486525" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.487234" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.487703" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.487778" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:32.415637" elapsed="0.072254"/>
</kw>
<msg time="2026-05-01T00:51:32.487986" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:32.488030" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.410674" elapsed="0.077393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.488397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.488143" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.488126" elapsed="0.000503"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:32.410525" elapsed="0.078128"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:32.410330" elapsed="0.078356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:32.407965" elapsed="0.080779"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:32.402904" elapsed="0.085898"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.402441" elapsed="0.086405"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:32.399412" elapsed="0.089489"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.496216" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.496379" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.496514" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.489328" elapsed="0.007214"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.496713" elapsed="0.002834"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.504767" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.504925" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:32.505075" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.499715" elapsed="0.005399"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.509994" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.509558" elapsed="0.000478"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.510689" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.510271" elapsed="0.000459"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.510964" elapsed="0.000540"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.505449" elapsed="0.006145"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.489051" elapsed="0.022622"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:32.398686" elapsed="0.113046"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.512861" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.513106" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.512567" elapsed="0.000581"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.513689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.513873" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.513384" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.514427" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/announce_route_es_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/announce_route_es_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.514631" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.514147" elapsed="0.000524"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:32.515230" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:32.514909" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.515854" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/withdraw_route_es_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/withdraw_route_es_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.516037" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.515525" elapsed="0.000550"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:32.516628" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:32.516308" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.517271" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.516908" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.517957" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.517602" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.518626" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.518254" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.519326" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.518918" elapsed="0.000475"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:32.519645" elapsed="0.002262"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.533284" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '817', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:32.533371" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQLyDN2An%2FcAFAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.533526" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.522094" elapsed="0.011469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.537733" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.533806" elapsed="0.003991"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.545833" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.546402" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '393'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:32.546582" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.538036" elapsed="0.008585"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.550537" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.546874" elapsed="0.003736"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.560349" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.560868" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '393'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:32.561012" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.552063" elapsed="0.008987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.564914" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.561304" elapsed="0.003684"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.565238" elapsed="0.003831"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.571334" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.569314" elapsed="0.002055"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.571590" elapsed="0.002208"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:32.573851" elapsed="0.000045"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:32.551573" elapsed="0.022424"/>
</kw>
<msg time="2026-05-01T00:51:32.574076" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:32.550864" elapsed="0.023237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.574528" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.574268" elapsed="0.000306"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.575440" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:32.575530" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:32.575182" elapsed="0.000372"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.575960" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:32.576033" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:32.575710" elapsed="0.000346"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.576210" elapsed="0.000318"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.576870" level="INFO">${sum_1} = 2882</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:32.576687" elapsed="0.000213"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.577267" level="INFO">${sum_2} = 2882</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:32.577087" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.577445" elapsed="0.000328"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:32.574806" elapsed="0.003027"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:32.577984" elapsed="0.001757"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.587532" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.587751" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '393'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:32.587938" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.580260" elapsed="0.007742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.595390" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.588526" elapsed="0.007016"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.595909" elapsed="0.002495"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.605135" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.605303" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '393'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:32.605479" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.598587" elapsed="0.006933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.609595" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.605762" elapsed="0.003903"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.609888" elapsed="0.003492"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:32.616582" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.613533" elapsed="0.003106"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.613493" elapsed="0.003171"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.624616" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.624750" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.624893" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.616820" elapsed="0.008111"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:32.579986" elapsed="0.045041"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.634051" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.634204" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.634335" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.626416" elapsed="0.007956"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.638014" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.634638" elapsed="0.003442"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.638298" elapsed="0.003615"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.644106" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.642146" elapsed="0.001989"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.644317" elapsed="0.002163"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:32.646532" elapsed="0.000039"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:32.625939" elapsed="0.020731"/>
</kw>
<msg time="2026-05-01T00:51:32.646749" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:32.625265" elapsed="0.021509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.647203" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.646940" elapsed="0.000307"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.648123" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:32.648197" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:32.647863" elapsed="0.000357"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.648645" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:32.648717" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:32.648374" elapsed="0.000367"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.648901" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.649563" level="INFO">${sum_1} = 2435</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:32.649363" elapsed="0.000227"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:32.649914" level="INFO">${sum_2} = 2435</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:32.649742" elapsed="0.000197"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.650091" elapsed="0.000300"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:32.647497" elapsed="0.002967"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.656174" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.656318" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.656412" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.651028" elapsed="0.005410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.659275" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.656630" elapsed="0.002693"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.659494" elapsed="0.003342"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.668431" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.668612" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.668754" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.663066" elapsed="0.005725"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.672476" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.669030" elapsed="0.003515"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.672766" elapsed="0.003539"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:32.679666" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:51:32.676413" elapsed="0.003338"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.676386" elapsed="0.003400"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.679966" elapsed="0.000021"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:32.650729" elapsed="0.029323"/>
</kw>
<arg>route_es_lan</arg>
<status status="PASS" start="2026-05-01T00:51:32.512111" elapsed="0.167987"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.398040" elapsed="0.282172"/>
</test>
<test id="s1-s13-t11" name="Play_To_Odl_route_es_lan" line="88">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:32.684061" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:32.683790" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.685314" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.685203" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.685184" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.690367" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.690260" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.690243" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.691487" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:32.691057" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.691969" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:32.691677" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:32.692037" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:32.692193" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:32.690682" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.699408" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.699298" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.699279" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.700956" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:32.700772" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.700754" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:32.701697" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:32.701269" elapsed="0.000491"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.702371" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:32.702108" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.737188" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:32.704315" elapsed="0.033083"/>
</kw>
<msg time="2026-05-01T00:51:32.737620" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:32.737720" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.702760" elapsed="0.035032"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:32.762748" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:32.740008" elapsed="0.022884"/>
</kw>
<msg time="2026-05-01T00:51:32.763029" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:32.763151" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.738281" elapsed="0.024946"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.763970" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.763581" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.763551" elapsed="0.000598"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.764902" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.764303" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.765567" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.765201" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.765181" elapsed="0.000562"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:32.765786" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:32.769514" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:51:32.769706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:32.768911" elapsed="0.000874"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.770005" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.770219" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:32.768113" elapsed="0.002324"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:32.766112" elapsed="0.004430"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:32.700301" elapsed="0.070418"/>
</kw>
<msg time="2026-05-01T00:51:32.770817" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:32.770861" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.699653" elapsed="0.071246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:32.771174" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:32.771026" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.771006" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.771786" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.772219" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:32.772292" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:32.698923" elapsed="0.073481"/>
</kw>
<msg time="2026-05-01T00:51:32.772518" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:32.772563" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.692669" elapsed="0.079931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.772930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.772677" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.772660" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:32.692519" elapsed="0.080512"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:32.692314" elapsed="0.080752"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:32.689900" elapsed="0.083223"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:32.684914" elapsed="0.088267"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:32.684486" elapsed="0.088740"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:32.681622" elapsed="0.091658"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.780009" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.780152" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.780265" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.773734" elapsed="0.006557"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:32.780471" elapsed="0.002853"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.788357" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.788482" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:32.788585" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:32.783505" elapsed="0.005107"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.791931" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.791624" elapsed="0.000335"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:32.792380" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:32.792113" elapsed="0.000294"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.792580" elapsed="0.000324"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:32.788882" elapsed="0.004082"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.773441" elapsed="0.019577"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:32.681136" elapsed="0.111923"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.793788" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.793961" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.793586" elapsed="0.000404"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.819818" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_lan.vanadium/route_es_lan.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:32.819373" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.820966" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan.vanadium/route_es_lan.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:32.820600" elapsed="0.000471">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan.vanadium/route_es_lan.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:32.821204" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:32.820094" elapsed="0.001145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.822030" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:32.821494" elapsed="0.000574"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.822505" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/route_es_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.822721" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.822293" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.823814" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.822978" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:32.824362" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:32.823994" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.824905" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:32.824615" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.824465" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:32.823964" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.825592" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:32.825135" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:32.825740" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:51:32.825915" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:32.816980" elapsed="0.008962"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.826303" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/announce_route_es_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/announce_route_es_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.826427" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.826106" elapsed="0.000362"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:32.826816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/withdraw_route_es_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_lan/withdraw_route_es_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:32.826937" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:32.826627" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.827379" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.827135" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.827844" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.827605" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.828280" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.828046" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:32.828792" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:32.828540" elapsed="0.000296"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:32.828987" elapsed="0.002328"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:32.831521" elapsed="0.001678"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:32.839289" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:32.839434" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:32.839551" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:32.834181" elapsed="0.005756">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.840158" elapsed="0.000022"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:32.840392" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:32.833848" elapsed="0.006690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:34.849365" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:34.849600" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '393'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:34.849758" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:34.842363" elapsed="0.007434"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:34.850527" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:34.854060" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:34.850081" elapsed="0.004051"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:34.859023" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:34.858329" elapsed="0.000737"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:34.859930" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:34.859300" elapsed="0.000679"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:34.860232" elapsed="0.000512"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:34.854518" elapsed="0.006321"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:34.841338" elapsed="0.019582"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:32.833373" elapsed="2.027615"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:34.861223" elapsed="0.002596"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:34.872366" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:34.872582" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:34.872819" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:34.864759" elapsed="0.008087"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:34.873051" elapsed="0.003251"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:34.883260" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:34.883954" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '541'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:34.884116" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:34.876577" elapsed="0.007577"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:34.888531" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:34.888094" elapsed="0.000479"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:34.889425" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:34.888793" elapsed="0.000691"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:34.890154" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "lan-auto-generated": {
        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
        "root-bridge-priority": 20
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:34.890434" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:34.889709" elapsed="0.000853">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:34.884518" elapsed="0.006241">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:34.864479" elapsed="0.026452">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQLyDN2An/cAFAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:36.901703" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:36.902004" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:36.902246" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:36.892750" elapsed="0.009560"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:36.902761" elapsed="0.004634"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:36.912901" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:36.913060" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:36.913212" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:36.907653" elapsed="0.005596"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:36.917726" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:36.917274" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:36.918365" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:36.917985" elapsed="0.000419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:36.918647" elapsed="0.000471"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:36.913620" elapsed="0.005587"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:36.891725" elapsed="0.027560"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:34.864017" elapsed="2.055325"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:36.920132" elapsed="0.002572"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:36.929715" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:36.929866" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:36.930010" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:36.924338" elapsed="0.005708"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:36.930277" elapsed="0.003656"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:36.939492" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:36.939714" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:36.939864" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:36.934166" elapsed="0.005737"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:36.944382" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:36.943948" elapsed="0.000474"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:36.945048" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:36.944668" elapsed="0.000419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:36.945308" elapsed="0.000585"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:36.940281" elapsed="0.005701"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:36.923596" elapsed="0.022463"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:36.922976" elapsed="0.023139"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:36.919626" elapsed="0.026566"/>
</kw>
<arg>route_es_lan</arg>
<status status="PASS" start="2026-05-01T00:51:32.793276" elapsed="4.152985"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:32.680658" elapsed="4.265754"/>
</test>
<test id="s1-s13-t12" name="Odl_To_Play_route_es_mac" line="91">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:36.952086" elapsed="0.000386"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:36.951693" elapsed="0.000870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:36.953837" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:36.953675" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:36.953650" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:36.959813" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:36.959645" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:36.959618" elapsed="0.000302"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:36.961447" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:36.960886" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:36.962095" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:36.961727" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:36.962180" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:51:36.962403" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:36.960310" elapsed="0.002128"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:36.971034" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:36.970890" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:36.970864" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:36.972866" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:36.972674" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:36.972655" elapsed="0.000382"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:36.973673" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:36.973197" elapsed="0.000548"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:36.974602" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:36.974259" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:37.006444" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:36.976818" elapsed="0.029888"/>
</kw>
<msg time="2026-05-01T00:51:37.006906" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:37.007007" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:36.974981" elapsed="0.032103"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:37.035871" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:37.009386" elapsed="0.026788"/>
</kw>
<msg time="2026-05-01T00:51:37.036480" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:37.036631" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.007637" elapsed="0.029105"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.037947" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.037237" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.037191" elapsed="0.001041"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.039449" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.038491" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.040562" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.039930" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.039900" elapsed="0.000936"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:37.040901" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:37.044841" elapsed="0.000168"/>
</kw>
<msg time="2026-05-01T00:51:37.045060" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:37.044168" elapsed="0.000967"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.045379" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.045642" elapsed="0.000030"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:37.043356" elapsed="0.002528"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:37.041274" elapsed="0.004698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:36.972124" elapsed="0.074038"/>
</kw>
<msg time="2026-05-01T00:51:37.046265" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:37.046312" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:36.971339" elapsed="0.075013"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:37.046623" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:51:37.046439" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.046418" elapsed="0.000318"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.047282" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.047744" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.047919" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:36.970325" elapsed="0.077723"/>
</kw>
<msg time="2026-05-01T00:51:37.048148" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:37.048196" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:36.963005" elapsed="0.085229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.048619" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.048336" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.048316" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:36.962800" elapsed="0.085923"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:36.962541" elapsed="0.086216"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:36.959105" elapsed="0.089711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:36.953331" elapsed="0.095545"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:36.952782" elapsed="0.096141"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:36.948211" elapsed="0.100767"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.055192" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.055345" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.055495" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.049432" elapsed="0.006094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.055726" elapsed="0.003127"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.067094" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.067270" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:37.067496" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.059050" elapsed="0.008489"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:37.071036" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.070714" elapsed="0.000352"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:37.071517" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.071226" elapsed="0.000319"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.071706" elapsed="0.000360"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.067902" elapsed="0.004228"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:37.049134" elapsed="0.023155"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:36.947529" elapsed="0.124807"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.073178" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.073365" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.072941" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.073775" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.073926" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discrimi...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.073572" elapsed="0.000397"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.074439" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/announce_route_es_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/announce_route_es_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.074627" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.074187" elapsed="0.000477"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:37.075158" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:37.074886" elapsed="0.000308"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.075654" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/withdraw_route_es_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/withdraw_route_es_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.075811" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.075404" elapsed="0.000440"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:37.076246" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:37.076010" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.076938" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.076584" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.077579" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.077227" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.078181" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.077858" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.078818" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.078498" elapsed="0.000380"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:37.079090" elapsed="0.003285"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.094951" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '807', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:37.095054" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQPyDN2An%2FcAB9AgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.095399" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.083062" elapsed="0.012373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.100088" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.095729" elapsed="0.004422"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.106014" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.106640" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '389'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:37.106794" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.100395" elapsed="0.006437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.110530" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.107075" elapsed="0.003525"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.120009" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.121161" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '389'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:37.121545" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.112120" elapsed="0.009497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.129044" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.122194" elapsed="0.007055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.129426" elapsed="0.002635"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.134641" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.132245" elapsed="0.002427"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.134859" elapsed="0.002298"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:37.137249" elapsed="0.000075"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:37.111607" elapsed="0.025922"/>
</kw>
<msg time="2026-05-01T00:51:37.137662" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:37.110850" elapsed="0.026850"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.138303" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.137948" elapsed="0.000420"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.139749" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:37.139855" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:37.139352" elapsed="0.000537"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.140587" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:37.140695" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:37.140132" elapsed="0.000603"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.140963" elapsed="0.000434"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.141906" level="INFO">${sum_1} = 3078</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:37.141644" elapsed="0.000298"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.142407" level="INFO">${sum_2} = 3078</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:37.142157" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.142682" elapsed="0.000449"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:37.138775" elapsed="0.004443"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:37.143436" elapsed="0.001879"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.152355" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.152522" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '389'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:37.152624" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.145926" elapsed="0.006723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.155563" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.152827" elapsed="0.002785"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.155771" elapsed="0.002556"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.166858" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.167067" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '389'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:37.167187" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.158510" elapsed="0.008705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.169912" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.167395" elapsed="0.002566"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.170124" elapsed="0.002795"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:37.175396" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:37.173027" elapsed="0.002438"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.172994" elapsed="0.002499"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.182738" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.182785" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.182889" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.175655" elapsed="0.007260"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:37.145636" elapsed="0.037357"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.189846" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.190006" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.190137" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.184155" elapsed="0.006017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.193852" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.190411" elapsed="0.003507"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.194142" elapsed="0.003686"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.200595" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.198061" elapsed="0.002578"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.200864" elapsed="0.003012"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:37.203948" elapsed="0.000058"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:37.183791" elapsed="0.020361"/>
</kw>
<msg time="2026-05-01T00:51:37.204266" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:37.183188" elapsed="0.021153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.205028" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.204675" elapsed="0.000422"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.206380" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:37.206508" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:37.205997" elapsed="0.000547"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.207120" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:37.207223" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:37.206764" elapsed="0.000491"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.207494" elapsed="0.000428"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.208427" level="INFO">${sum_1} = 2631</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:37.208141" elapsed="0.000341"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:37.208946" level="INFO">${sum_2} = 2631</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:37.208701" elapsed="0.000280"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.209200" elapsed="0.000450"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:37.205441" elapsed="0.004294"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.216558" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.216699" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.216794" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.210572" elapsed="0.006248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.219705" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.216995" elapsed="0.002758"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.219909" elapsed="0.002516"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.226239" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.226405" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.226586" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.222605" elapsed="0.004020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.230561" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.226880" elapsed="0.003751"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.230866" elapsed="0.003849"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:37.238518" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-05-01T00:51:37.234846" elapsed="0.003784"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.234811" elapsed="0.003860"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.238906" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:37.210123" elapsed="0.028918"/>
</kw>
<arg>route_es_mac</arg>
<status status="PASS" start="2026-05-01T00:51:37.072631" elapsed="0.166484"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:36.946856" elapsed="0.292441"/>
</test>
<test id="s1-s13-t13" name="Play_To_Odl_route_es_mac" line="93">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:37.243732" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:37.243464" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.245054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:37.244937" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.244917" elapsed="0.000208"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.250206" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:37.250097" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.250078" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.251304" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:37.250916" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.251803" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:37.251509" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:37.251873" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:37.252030" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:37.250531" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.258041" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:37.257929" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.257910" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.259620" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:37.259408" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.259390" elapsed="0.000398"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:37.260419" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:37.259944" elapsed="0.000556"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:37.261134" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:37.260858" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:37.291113" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:37.263096" elapsed="0.028321"/>
</kw>
<msg time="2026-05-01T00:51:37.291695" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:37.291793" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.261524" elapsed="0.030344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:37.316768" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:37.294249" elapsed="0.022744"/>
</kw>
<msg time="2026-05-01T00:51:37.317188" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:37.317288" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.292442" elapsed="0.024919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.318243" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.317754" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.317705" elapsed="0.000839"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.319404" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.318705" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.320089" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.319723" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.319701" elapsed="0.000563"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:37.320311" elapsed="0.000068"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:37.324204" elapsed="0.000179"/>
</kw>
<msg time="2026-05-01T00:51:37.324428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:37.323612" elapsed="0.000911"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.324743" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.324963" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:37.322803" elapsed="0.002382"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:37.320756" elapsed="0.004516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:37.258966" elapsed="0.066500"/>
</kw>
<msg time="2026-05-01T00:51:37.325571" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:37.325616" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.258275" elapsed="0.067379"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:37.325845" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:37.325737" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.325718" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.326417" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.326951" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:37.327028" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:37.257581" elapsed="0.069563"/>
</kw>
<msg time="2026-05-01T00:51:37.327242" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:37.327287" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.252512" elapsed="0.074814"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.327679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.327405" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.327387" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:37.252342" elapsed="0.075442"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:37.252120" elapsed="0.075702"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:37.249733" elapsed="0.078155"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:37.244641" elapsed="0.083307"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:37.244154" elapsed="0.083842"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:37.241267" elapsed="0.086789"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.335002" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.335200" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.335338" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.328578" elapsed="0.006797"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:37.335644" elapsed="0.004192"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.345311" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.345494" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:37.345671" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:37.340076" elapsed="0.005640"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:37.350181" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.349734" elapsed="0.000486"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:37.350844" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:37.350441" elapsed="0.000441"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.351107" elapsed="0.000481"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:37.346078" elapsed="0.005596"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:37.328258" elapsed="0.023492"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:37.240617" elapsed="0.111191"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.352962" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.353219" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.352668" elapsed="0.000592"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.385945" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_mac.vanadium/route_es_mac.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:37.385310" elapsed="0.000677"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.386965" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac.vanadium/route_es_mac.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:37.386615" elapsed="0.000444">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac.vanadium/route_es_mac.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:37.387160" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:37.386195" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.387905" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:37.387470" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.388267" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/route_es_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.388486" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discrimi...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.388112" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.388960" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.388688" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:37.389594" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:37.389128" elapsed="0.000531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.390166" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:37.389845" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:37.389694" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:37.389092" elapsed="0.001160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.390929" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discrimi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:37.390410" elapsed="0.000549"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:37.391015" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:51:37.391221" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discrimi...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:37.382619" elapsed="0.008630"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.391638" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/announce_route_es_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/announce_route_es_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.391769" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.391418" elapsed="0.000377"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:37.392148" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/withdraw_route_es_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_mac/withdraw_route_es_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:37.392293" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:37.391954" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.392790" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.392537" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.393243" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.393003" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.393773" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.393523" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:37.394213" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:37.393974" elapsed="0.000284"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:37.394420" elapsed="0.004441"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:37.399048" elapsed="0.001276"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:37.408326" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:37.408589" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:37.408745" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:37.402432" elapsed="0.006866">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.409590" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:37.409921" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:37.401968" elapsed="0.008139">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:39.418395" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:39.418627" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '389'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:39.418773" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:39.411321" elapsed="0.007489"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:39.419534" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:39.422771" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:39.419065" elapsed="0.003775"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:39.427495" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:39.426852" elapsed="0.000686"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:39.428312" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:39.427761" elapsed="0.000590"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:39.428592" elapsed="0.000507"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:39.423266" elapsed="0.005944"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:39.410637" elapsed="0.018643"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:37.401341" elapsed="2.027997"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:39.429512" elapsed="0.002412"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:39.438148" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:39.438314" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:39.438446" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:39.432851" elapsed="0.005666"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:39.438752" elapsed="0.003961"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:39.448531" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:39.449608" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '537'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:39.449873" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:39.442946" elapsed="0.006986"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:39.457671" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:39.456886" elapsed="0.000854"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:39.459250" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:39.458122" elapsed="0.001196"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:39.460557" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "mac-auto-generated": {
        "local-discriminator": 2000,
        "system-mac-address": "f2:0c:dd:80:9f:f7"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:39.461179" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:39.459735" elapsed="0.001621">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:39.450720" elapsed="0.011006">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:39.432574" elapsed="0.029454">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQPyDN2An/cAB9AgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.470161" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.470362" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.470534" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.463313" elapsed="0.007261"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.470823" elapsed="0.003904"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.480926" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.481077" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:41.481220" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.474964" elapsed="0.006293"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.485677" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.485212" elapsed="0.000505"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.486396" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.486007" elapsed="0.000428"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.486685" elapsed="0.000460"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.481649" elapsed="0.005585"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.462719" elapsed="0.024593"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:39.432120" elapsed="2.055249"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:41.488153" elapsed="0.002627"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.496750" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.496860" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.496964" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.491954" elapsed="0.005036"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.497158" elapsed="0.003196"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.506077" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.506225" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:41.506366" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.500608" elapsed="0.005795"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.510877" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.510473" elapsed="0.000443"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.511530" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.511136" elapsed="0.000433"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.511791" elapsed="0.000448"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.506780" elapsed="0.005545"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.491404" elapsed="0.020997"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:41.490959" elapsed="0.021515"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:41.487657" elapsed="0.024897"/>
</kw>
<arg>route_es_mac</arg>
<status status="PASS" start="2026-05-01T00:51:37.352123" elapsed="4.160500"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:37.239821" elapsed="4.272953"/>
</test>
<test id="s1-s13-t14" name="Odl_To_Play_route_es_rou" line="96">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:41.518249" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:41.517861" elapsed="0.000713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.519662" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.519538" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.519514" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.524776" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.524666" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.524647" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.525951" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:41.525480" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.526509" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:41.526172" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:41.526586" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:51:41.526757" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:41.525078" elapsed="0.001705"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.532827" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.532705" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.532685" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.534500" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.534281" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.534262" elapsed="0.000413"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:41.535264" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:41.534835" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.535986" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:41.535711" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.577302" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:41.537990" elapsed="0.039489"/>
</kw>
<msg time="2026-05-01T00:51:41.577694" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:41.577799" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.536365" elapsed="0.041517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.603112" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:41.579971" elapsed="0.023306"/>
</kw>
<msg time="2026-05-01T00:51:41.603420" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:41.603546" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.578303" elapsed="0.025317"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.604357" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.603946" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.603919" elapsed="0.000642"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.605303" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "s "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.604720" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.606020" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.605635" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.605614" elapsed="0.000584"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:41.606238" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:41.610533" elapsed="0.000197"/>
</kw>
<msg time="2026-05-01T00:51:41.610791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:41.609818" elapsed="0.001067"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.611135" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.611359" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:41.608821" elapsed="0.002817"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:41.606652" elapsed="0.005080"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:41.533819" elapsed="0.078095"/>
</kw>
<msg time="2026-05-01T00:51:41.612018" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:41.612062" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.533066" elapsed="0.079037"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:41.612310" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:51:41.612192" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.612169" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.612966" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.613670" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.613749" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:41.532308" elapsed="0.081554"/>
</kw>
<msg time="2026-05-01T00:51:41.613959" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:41.614004" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.527190" elapsed="0.086854"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.614415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.614122" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.614104" elapsed="0.000409"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:41.527026" elapsed="0.087511"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:41.526841" elapsed="0.087734"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:41.524285" elapsed="0.090352"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:41.519219" elapsed="0.095476"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.518772" elapsed="0.095971"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:41.514671" elapsed="0.100129"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.621206" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.621354" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.621766" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.615272" elapsed="0.006573"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.622021" elapsed="0.002911"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.630146" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.630296" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:41.630438" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.625100" elapsed="0.005403"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.634841" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.634396" elapsed="0.000485"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.635512" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.635105" elapsed="0.000447"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.635777" elapsed="0.000459"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.630826" elapsed="0.005497"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.614956" elapsed="0.021442"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:41.513976" elapsed="0.122497"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.637588" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.637847" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.637258" elapsed="0.000630"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.638421" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.638655" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
 ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.638114" elapsed="0.000582"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.639200" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/announce_route_es_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/announce_route_es_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.639375" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.638928" elapsed="0.000484"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:41.639954" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:41.639660" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.640549" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/withdraw_route_es_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/withdraw_route_es_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.640724" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.640223" elapsed="0.000538"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:41.641313" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:41.641032" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.641980" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.641623" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.642635" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.642275" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.643248" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.642920" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.643882" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.643550" elapsed="0.000394"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:41.644156" elapsed="0.002590"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.657483" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '785', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:41.657549" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.657666" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.646937" elapsed="0.010755"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.663816" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.657870" elapsed="0.006049"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.670989" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.671350" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '375'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:41.671512" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.664308" elapsed="0.007233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.674164" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.671714" elapsed="0.002498"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.680486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.680932" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '375'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:41.681066" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.675196" elapsed="0.005906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.684722" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.681339" elapsed="0.003452"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.685013" elapsed="0.003573"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.690984" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.688816" elapsed="0.002209"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.691273" elapsed="0.003103"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:41.694449" elapsed="0.000070"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:41.674865" elapsed="0.019799"/>
</kw>
<msg time="2026-05-01T00:51:41.694776" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:41.674384" elapsed="0.020428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.695388" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.695047" elapsed="0.000425"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.696762" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:41.696867" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:41.696349" elapsed="0.000551"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.697487" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:51:41.697609" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:41.697115" elapsed="0.000528"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.697862" elapsed="0.000422"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.698776" level="INFO">${sum_1} = 2242</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:41.698524" elapsed="0.000288"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.699269" level="INFO">${sum_2} = 2242</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:41.699024" elapsed="0.000280"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.699539" elapsed="0.000420"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:41.695803" elapsed="0.004239"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:41.700329" elapsed="0.002068"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.708674" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.708793" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '375'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:41.708888" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.702938" elapsed="0.005975"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.712357" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.709087" elapsed="0.003338"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.712666" elapsed="0.003482"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.721500" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.721641" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '375'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:41.721752" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.716377" elapsed="0.005402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.724380" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.721955" elapsed="0.002473"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.724602" elapsed="0.002497"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:41.729515" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.727190" elapsed="0.002376"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.727165" elapsed="0.002456"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.736924" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.736992" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.737153" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.729784" elapsed="0.007407"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:41.702663" elapsed="0.034634"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.745742" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.745911" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.746041" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.738946" elapsed="0.007131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.749991" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.746343" elapsed="0.003714"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.750275" elapsed="0.003515"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.756724" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.754022" elapsed="0.002730"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.756911" elapsed="0.002192"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:41.759155" elapsed="0.000039"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:41.738436" elapsed="0.020865"/>
</kw>
<msg time="2026-05-01T00:51:41.759381" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:41.737626" elapsed="0.021780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.759835" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.759589" elapsed="0.000290"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.760752" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:41.760827" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:41.760491" elapsed="0.000361"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.761257" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:51:41.761329" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:41.761008" elapsed="0.000345"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.761525" elapsed="0.000319"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.762180" level="INFO">${sum_1} = 1795</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:41.762001" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:41.762559" level="INFO">${sum_2} = 1795</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:41.762362" elapsed="0.000223"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.762739" elapsed="0.000306"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:41.760114" elapsed="0.002992"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.768523" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.768678" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.768860" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.763686" elapsed="0.005210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.772988" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.769132" elapsed="0.003922"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.773270" elapsed="0.003537"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.782242" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.782428" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.782604" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.777036" elapsed="0.005605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.786300" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.782878" elapsed="0.003488"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.786607" elapsed="0.003575"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:41.793525" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:51:41.790302" elapsed="0.003329"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.790271" elapsed="0.003397"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.793881" elapsed="0.000032"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:41.763370" elapsed="0.030638"/>
</kw>
<arg>route_es_rou</arg>
<status status="PASS" start="2026-05-01T00:51:41.636840" elapsed="0.157232"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.513055" elapsed="0.281168"/>
</test>
<test id="s1-s13-t15" name="Play_To_Odl_route_es_rou" line="98">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:41.799150" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:41.798885" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.800418" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.800306" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.800287" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.805502" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.805373" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.805356" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.806596" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:41.806196" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.807074" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:41.806785" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:41.807143" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:51:41.807297" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:41.805817" elapsed="0.001505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.813227" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.813116" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.813098" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.814849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:41.814660" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.814641" elapsed="0.000374"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:41.815610" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:41.815169" elapsed="0.000503"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.816293" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:41.816022" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.847333" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:41.818282" elapsed="0.029214"/>
</kw>
<msg time="2026-05-01T00:51:41.847634" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:41.847729" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.816689" elapsed="0.031111"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:41.873430" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:41.849923" elapsed="0.023663"/>
</kw>
<msg time="2026-05-01T00:51:41.873734" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:41.873828" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.848191" elapsed="0.025711"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.874594" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.874206" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.874183" elapsed="0.000588"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.875512" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "s "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.874925" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.876158" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.875808" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.875788" elapsed="0.000543"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:41.876368" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:41.880005" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:51:41.880190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:41.879379" elapsed="0.000877"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.880548" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.880767" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:41.878633" elapsed="0.002351"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:41.876673" elapsed="0.004396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:41.814195" elapsed="0.067053"/>
</kw>
<msg time="2026-05-01T00:51:41.881345" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:41.881390" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.813525" elapsed="0.067903"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:41.881646" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:51:41.881524" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.881505" elapsed="0.000281"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.882274" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.882845" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:41.882919" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:41.812776" elapsed="0.070254"/>
</kw>
<msg time="2026-05-01T00:51:41.883125" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:41.883169" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.807876" elapsed="0.075330"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.883554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.883283" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.883265" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:41.807726" elapsed="0.075930"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:41.807378" elapsed="0.076311"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:41.805017" elapsed="0.078728"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:41.800014" elapsed="0.083786"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:41.799579" elapsed="0.084266"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:41.795997" elapsed="0.087901"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.889401" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.889553" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.889682" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.884319" elapsed="0.005391"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:41.889878" elapsed="0.002811"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.899101" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.899250" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:41.899393" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:41.892856" elapsed="0.006574"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.903789" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.903353" elapsed="0.000476"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:41.904501" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:41.904101" elapsed="0.000440"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.904761" elapsed="0.000451"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:41.899783" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.884048" elapsed="0.021323"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:41.795312" elapsed="0.110114"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.906537" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.906751" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.906188" elapsed="0.000602"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.935668" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_rou.vanadium/route_es_rou.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:41.935185" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.936569" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou.vanadium/route_es_rou.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:41.936286" elapsed="0.000381">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou.vanadium/route_es_rou.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:41.936783" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:41.935901" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.937516" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:41.937030" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.937871" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/route_es_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.938002" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.937730" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.938539" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.938220" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:41.938985" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:41.938665" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.939577" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:41.939220" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.939071" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:41.938643" elapsed="0.001030"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.940356" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:41.939835" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:41.940480" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:51:41.940682" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
 ...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:41.932548" elapsed="0.008207"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.941148" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/announce_route_es_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/announce_route_es_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.941284" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.940941" elapsed="0.000370"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:41.941790" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/withdraw_route_es_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_es_rou/withdraw_route_es_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:41.941939" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:41.941509" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.942474" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.942174" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.942977" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.942728" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.943550" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.943235" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:41.944084" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:41.943809" elapsed="0.000320"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:41.944296" elapsed="0.002828"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:41.947309" elapsed="0.001595"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:41.955610" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:41.955845" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:41.956025" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:41.949974" elapsed="0.006766">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.957101" elapsed="0.000042"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:41.957627" elapsed="0.000101"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:41.949596" elapsed="0.008329">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:43.967714" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:43.967918" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '375'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:43.968064" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:43.959158" elapsed="0.008943"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:43.968879" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "es-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "orig-route-ip": "43.43.43.43"
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:43.972640" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:43.968388" elapsed="0.004322"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:43.977634" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:43.976996" elapsed="0.000679"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:43.978633" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:43.977893" elapsed="0.000781"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:43.978898" elapsed="0.000448"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:43.973028" elapsed="0.006380"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:43.958530" elapsed="0.020948"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:41.949129" elapsed="2.030396"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:43.979683" elapsed="0.002342"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:43.987263" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:43.987437" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:43.987598" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:43.982974" elapsed="0.004660"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:43.987928" elapsed="0.003909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:43.997256" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:43.997876" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '523'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:43.998029" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:43.992068" elapsed="0.005998"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:44.002378" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:44.001950" elapsed="0.000468"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:44.003288" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:44.002658" elapsed="0.000675"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:44.004023" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "es-route": {
       "orig-route-ip": "43.43.43.43",
       "router-id-generated": {
        "local-discriminator": 2000,
        "router-id": "43.43.43.43"
       }
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:44.004297" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "orig-route-ip": "43.43.43.43",
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:44.003577" elapsed="0.000825">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "orig-route-ip": "43.43.43.43",
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:43.998419" elapsed="0.006198">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "orig-route-ip": "43.43.43.43",
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:43.982702" elapsed="0.022088">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "es-route": {
+       "orig-route-ip": "43.43.43.43",
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQQrKysrAAAH0AAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.015688" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.016030" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.016292" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.006351" elapsed="0.010008"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.016903" elapsed="0.004901"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.028445" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.028644" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:46.028802" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.022049" elapsed="0.006789"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.033322" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.032865" elapsed="0.000498"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.033997" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.033604" elapsed="0.000432"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.034297" elapsed="0.000540"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.029197" elapsed="0.005768"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.005537" elapsed="0.029524"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:43.982201" elapsed="2.052931"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:46.036010" elapsed="0.002640"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.046337" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.046550" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.046713" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.041442" elapsed="0.005310"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.047058" elapsed="0.003661"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.056651" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.056826" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:46.056934" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.051013" elapsed="0.005947"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.060211" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.059901" elapsed="0.000338"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.060703" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.060398" elapsed="0.000333"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.060892" elapsed="0.000338"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.057203" elapsed="0.004092"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.039388" elapsed="0.021963"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:46.038859" elapsed="0.022532"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:46.035477" elapsed="0.025968"/>
</kw>
<arg>route_es_rou</arg>
<status status="PASS" start="2026-05-01T00:51:41.905768" elapsed="4.155745"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:41.794676" elapsed="4.266954"/>
</test>
<test id="s1-s13-t16" name="Odl_To_Play_route_eth_arb" line="101">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:46.066486" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:46.066043" elapsed="0.000897"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.068630" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.068413" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.068375" elapsed="0.000403"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.074944" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.074802" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.074782" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.076152" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:46.075736" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.076669" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:46.076346" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:46.076738" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:51:46.076910" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:46.075276" elapsed="0.001658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.082976" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.082816" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.082797" elapsed="0.000252"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.084538" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.084329" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.084311" elapsed="0.000410"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:46.085302" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:46.084880" elapsed="0.000486"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.086180" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:46.085897" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.119655" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:46.088259" elapsed="0.031665"/>
</kw>
<msg time="2026-05-01T00:51:46.120170" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:46.120272" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.086580" elapsed="0.033767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.148334" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:46.122637" elapsed="0.025873"/>
</kw>
<msg time="2026-05-01T00:51:46.148660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:46.148756" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.120880" elapsed="0.027949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.149620" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.149164" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.149129" elapsed="0.000675"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.150600" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.149965" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.151324" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.150952" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.150885" elapsed="0.000638"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:46.151569" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:46.155490" elapsed="0.000170"/>
</kw>
<msg time="2026-05-01T00:51:46.155706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:46.154860" elapsed="0.000921"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.156016" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.156251" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:46.153996" elapsed="0.002492"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:46.151929" elapsed="0.004651"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:46.083884" elapsed="0.072879"/>
</kw>
<msg time="2026-05-01T00:51:46.156863" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:46.156910" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.083210" elapsed="0.073740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:46.157154" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:51:46.157040" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.157019" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.157770" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.158210" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.158339" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:46.082437" elapsed="0.076173"/>
</kw>
<msg time="2026-05-01T00:51:46.158713" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:46.158758" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.077355" elapsed="0.081441"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.159175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.158875" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.158857" elapsed="0.000398"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:46.077202" elapsed="0.082077"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:46.076995" elapsed="0.082321"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:46.074391" elapsed="0.084985"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:46.067922" elapsed="0.091512"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.067215" elapsed="0.092287"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:46.063055" elapsed="0.096504"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.166726" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.167115" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.167373" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.159998" elapsed="0.007445"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.167970" elapsed="0.005587"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.180720" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.180909" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:46.181075" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.173806" elapsed="0.007307"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.185869" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.185349" elapsed="0.000563"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.186557" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.186141" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.186823" elapsed="0.000581"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.181539" elapsed="0.005983"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.159715" elapsed="0.028039"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:46.062503" elapsed="0.125319"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.188995" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.189247" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.188685" elapsed="0.000605"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.189842" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.190031" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.189553" elapsed="0.000520"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.190658" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/announce_route_eth_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/announce_route_eth_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.190848" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.190338" elapsed="0.000549"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:46.191537" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:46.191216" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.191925" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/withdraw_route_eth_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/withdraw_route_eth_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.192056" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.191730" elapsed="0.000354"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:46.192492" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:46.192245" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.192948" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.192691" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.193403" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.193160" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.193892" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.193643" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.194358" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.194115" elapsed="0.000288"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:46.194598" elapsed="0.002393"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.207607" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '797', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:46.207789" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.208032" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.197241" elapsed="0.010853"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.215606" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.208591" elapsed="0.007114"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.222971" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.223377" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '367'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:46.223514" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.216070" elapsed="0.007474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.226235" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.223724" elapsed="0.002561"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.234008" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.234554" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '367'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:46.234730" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.227481" elapsed="0.007295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.238739" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.235111" elapsed="0.003849"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.239245" elapsed="0.003906"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.245810" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.243421" elapsed="0.002418"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.246025" elapsed="0.002278"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:46.248362" elapsed="0.000052"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:46.227047" elapsed="0.021500"/>
</kw>
<msg time="2026-05-01T00:51:46.248648" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:46.226482" elapsed="0.022196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.249109" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.248855" elapsed="0.000299"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.250095" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:46.250172" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:46.249823" elapsed="0.000374"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.250702" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:46.250792" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:46.250354" elapsed="0.000462"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.251014" elapsed="0.000344"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.251810" level="INFO">${sum_1} = 1903</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:46.251577" elapsed="0.000269"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.252202" level="INFO">${sum_2} = 1903</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:46.252015" elapsed="0.000213"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.252389" elapsed="0.000500"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:46.249418" elapsed="0.003549"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:46.253127" elapsed="0.001906"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.262811" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.263065" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '367'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:46.263213" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.255860" elapsed="0.007391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.267896" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.263536" elapsed="0.004434"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.268211" elapsed="0.003698"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.277253" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.277515" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '367'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:46.277648" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.272082" elapsed="0.005594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.280967" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.277864" elapsed="0.003175"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.281274" elapsed="0.003919"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:46.288888" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.285331" elapsed="0.003635"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.285292" elapsed="0.003710"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.296701" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.296777" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.296942" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.289235" elapsed="0.007736"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:46.255410" elapsed="0.041658"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.304029" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.304233" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.304386" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.298309" elapsed="0.006114"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.310177" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.304740" elapsed="0.005560"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.310737" elapsed="0.005166"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.318287" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.316212" elapsed="0.002107"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.318557" elapsed="0.002361"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:46.320975" elapsed="0.000050"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:46.297938" elapsed="0.023204"/>
</kw>
<msg time="2026-05-01T00:51:46.321230" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:46.297303" elapsed="0.023953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.321820" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.321552" elapsed="0.000314"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.322855" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:46.322931" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:46.322562" elapsed="0.000417"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.323406" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:46.323532" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:46.323147" elapsed="0.000413"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.323723" elapsed="0.000315"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.324387" level="INFO">${sum_1} = 1456</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:46.324202" elapsed="0.000210"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:46.324762" level="INFO">${sum_2} = 1456</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:46.324583" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.324941" elapsed="0.000304"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:46.322138" elapsed="0.003170"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.330096" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.330243" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.330343" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.325942" elapsed="0.004427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.333435" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.330574" elapsed="0.002926"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.333662" elapsed="0.002566"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.341045" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.341168" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.341303" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.336397" elapsed="0.004938"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.344041" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.341563" elapsed="0.002526"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.344247" elapsed="0.002516"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:46.350076" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:51:46.346858" elapsed="0.003328"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.346830" elapsed="0.003394"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.350447" elapsed="0.000054"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:46.325627" elapsed="0.024975"/>
</kw>
<arg>route_eth_arb</arg>
<status status="PASS" start="2026-05-01T00:51:46.188223" elapsed="0.162445"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.062004" elapsed="0.288821"/>
</test>
<test id="s1-s13-t17" name="Play_To_Odl_route_eth_arb" line="103">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:46.356118" elapsed="0.000288"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:46.355748" elapsed="0.000761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.358067" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.357768" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.357741" elapsed="0.000426"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.363588" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.363477" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.363445" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.364673" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:46.364271" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.365156" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:46.364863" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:46.365226" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:51:46.365384" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:46.363891" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.371199" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.371089" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.371070" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.372749" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:46.372563" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.372544" elapsed="0.000373"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:46.373506" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:46.373071" elapsed="0.000497"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.374190" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:46.373920" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.405864" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:46.376164" elapsed="0.029856"/>
</kw>
<msg time="2026-05-01T00:51:46.406162" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:46.406258" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.374584" elapsed="0.031746"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:46.432794" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:46.408339" elapsed="0.024612"/>
</kw>
<msg time="2026-05-01T00:51:46.433098" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:46.433195" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.406766" elapsed="0.026503"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.434056" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.433626" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.433593" elapsed="0.000774"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.435195" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.434547" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.435871" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.435513" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.435491" elapsed="0.000553"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:46.436086" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:46.440097" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:51:46.440300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:46.439361" elapsed="0.001027"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.440628" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.440850" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:46.438518" elapsed="0.002553"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:46.436446" elapsed="0.004715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:46.372088" elapsed="0.069251"/>
</kw>
<msg time="2026-05-01T00:51:46.441448" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:46.441528" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.371424" elapsed="0.070155"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:46.441795" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:51:46.441676" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.441648" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.442411" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.442878" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:46.442955" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:46.370713" elapsed="0.072429"/>
</kw>
<msg time="2026-05-01T00:51:46.443262" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:46.443311" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.365811" elapsed="0.077545"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.443774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.443448" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.443424" elapsed="0.000433"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:46.365665" elapsed="0.078217"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:46.365479" elapsed="0.078440"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:46.363094" elapsed="0.080894"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:46.357339" elapsed="0.086721"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:46.356725" elapsed="0.087384"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:46.352671" elapsed="0.091494"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.450046" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.450194" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.450297" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.444756" elapsed="0.005567"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:46.450516" elapsed="0.004389"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.460710" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.460896" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:46.461051" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:46.455197" elapsed="0.005891"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.465804" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.465325" elapsed="0.000520"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:46.466523" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:46.466081" elapsed="0.000484"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.466790" elapsed="0.000583"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:46.461471" elapsed="0.006001"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.444403" elapsed="0.023130"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:46.351904" elapsed="0.115673"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.468366" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.468586" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.468145" elapsed="0.000471"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.496568" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_arb.vanadium/route_eth_arb.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:46.496134" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.497543" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb.vanadium/route_eth_arb.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:46.497135" elapsed="0.000494">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb.vanadium/route_eth_arb.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:46.497728" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:46.496778" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.498393" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:46.497992" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.498747" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/route_eth_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.498899" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.498606" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.499407" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.499146" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:46.500129" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:46.499623" elapsed="0.000594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.500989" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:46.500536" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.500259" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:46.499587" elapsed="0.001528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.502041" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:46.501340" elapsed="0.000743"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:46.502161" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:51:46.502409" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:46.493740" elapsed="0.008751"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.503154" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/announce_route_eth_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/announce_route_eth_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.503353" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.502766" elapsed="0.000621"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:46.503758" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/withdraw_route_eth_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_arb/withdraw_route_eth_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:46.503879" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:46.503563" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.504308" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.504064" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.504770" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.504532" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.505244" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.505007" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:46.505697" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:46.505446" elapsed="0.000296"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:46.505891" elapsed="0.002644"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:46.508720" elapsed="0.002065"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:46.518732" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:46.519186" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:46.519555" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:46.512029" elapsed="0.008547">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.521155" elapsed="0.000066"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:46.521919" elapsed="0.000101"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:46.511537" elapsed="0.011356">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:48.534627" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:48.534848" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '367'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:48.535028" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:48.524891" elapsed="0.010176"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:48.535844" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:48.539323" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:48.535345" elapsed="0.004055"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:48.544529" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:48.543846" elapsed="0.000714"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:48.545138" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:48.544723" elapsed="0.000444"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:48.545328" elapsed="0.000354"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:48.539978" elapsed="0.005768"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:48.523858" elapsed="0.021943"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:46.510981" elapsed="2.034866"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:48.546008" elapsed="0.002687"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:48.554433" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:48.554623" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:48.554771" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:48.549638" elapsed="0.005170"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:48.555042" elapsed="0.003963"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:48.566196" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:48.566837" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '515'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:48.566997" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:48.559241" elapsed="0.007794"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:48.571406" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:48.571001" elapsed="0.000444"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:48.572546" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:48.571768" elapsed="0.000821"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:48.573270" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:48.573659" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:48.572819" elapsed="0.000954">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:48.567361" elapsed="0.006618">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:48.549337" elapsed="0.024818">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQAAAAAAAAAAAAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.585599" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.585873" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.586067" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.576416" elapsed="0.009693"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.586441" elapsed="0.004345"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.596641" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.596802" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:50.596936" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.591068" elapsed="0.005897"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.600506" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.600076" elapsed="0.000462"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.601103" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.600803" elapsed="0.000332"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.601306" elapsed="0.000443"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.597294" elapsed="0.004523"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:50.575187" elapsed="0.026689"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:48.548893" elapsed="2.053028"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:50.602544" elapsed="0.002681"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.613792" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.614113" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.614374" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.607203" elapsed="0.007234"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.614886" elapsed="0.004641"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.624425" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.624650" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:50.624824" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.619769" elapsed="0.005096"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.629609" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.629229" elapsed="0.000409"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.630067" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.629794" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.630254" elapsed="0.000412"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.625266" elapsed="0.005466"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:50.606280" elapsed="0.024510"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:50.605579" elapsed="0.025254"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:50.602145" elapsed="0.028747"/>
</kw>
<arg>route_eth_arb</arg>
<status status="PASS" start="2026-05-01T00:51:46.467804" elapsed="4.163146"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:46.351277" elapsed="4.279811"/>
</test>
<test id="s1-s13-t18" name="Odl_To_Play_route_eth_as" line="106">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:50.638504" elapsed="0.000387"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:50.638073" elapsed="0.000912"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.643071" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.642749" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.642683" elapsed="0.000605"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.651847" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.651689" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.651662" elapsed="0.000286"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.653516" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:50.652911" elapsed="0.000649"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.654057" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:50.653736" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:50.654128" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:51:50.654313" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:50.652288" elapsed="0.002050"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.660009" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.659897" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.659878" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.661600" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.661384" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.661366" elapsed="0.000402"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:50.662351" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:50.661926" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:50.663095" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:50.662818" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:50.694440" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:50.665093" elapsed="0.029546"/>
</kw>
<msg time="2026-05-01T00:51:50.694808" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:50.694906" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.663487" elapsed="0.031491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:50.722366" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:50.697006" elapsed="0.025518"/>
</kw>
<msg time="2026-05-01T00:51:50.722663" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:50.722758" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.695396" elapsed="0.027434"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.723559" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:50.723142" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.723116" elapsed="0.000627"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.724547" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.723900" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.725202" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:50.724845" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.724824" elapsed="0.000554"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:50.725417" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:50.729351" elapsed="0.002504"/>
</kw>
<msg time="2026-05-01T00:51:50.731923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:50.728675" elapsed="0.003337"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.732246" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.732669" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:50.727814" elapsed="0.005090"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:50.725830" elapsed="0.007162"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:50.660933" elapsed="0.072241"/>
</kw>
<msg time="2026-05-01T00:51:50.733278" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:50.733323" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.660239" elapsed="0.073122"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:50.733595" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:51:50.733466" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.733428" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.734221" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.734685" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.734760" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:50.659555" elapsed="0.075317"/>
</kw>
<msg time="2026-05-01T00:51:50.734965" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:50.735010" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.654782" elapsed="0.080264"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.735382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:50.735122" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.735105" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:50.654626" elapsed="0.080887"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:50.654406" elapsed="0.081147"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:50.651135" elapsed="0.084483"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:50.641793" elapsed="0.093880"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.640084" elapsed="0.095633"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:50.634199" elapsed="0.101570"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.742315" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.742503" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.742627" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.736228" elapsed="0.006472"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.742874" elapsed="0.002746"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.751129" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.751285" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:50.751433" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.745856" elapsed="0.005643"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.755980" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.755527" elapsed="0.000493"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:50.756697" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.756241" elapsed="0.000496"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.756966" elapsed="0.000471"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.751839" elapsed="0.005708"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:50.735928" elapsed="0.021697"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:50.633140" elapsed="0.124545"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:50.758801" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:50.759046" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:50.758513" elapsed="0.000574"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:50.759606" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:50.759783" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:50.759310" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:50.760301" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/announce_route_eth_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/announce_route_eth_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:50.760539" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:50.760039" elapsed="0.000543"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:50.761107" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:50.760805" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:50.761626" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/withdraw_route_eth_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/withdraw_route_eth_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:50.761752" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:50.761364" elapsed="0.000414"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:50.762176" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:50.761973" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.762639" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.762365" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.763094" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.762853" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.763553" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.763299" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.763990" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.763752" elapsed="0.000282"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:50.764188" elapsed="0.002695"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.780774" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '845', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:50.780914" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.781144" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.767061" elapsed="0.014140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.787194" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.781626" elapsed="0.005664"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.794197" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.794719" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '384'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:50.794916" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.787683" elapsed="0.007271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.798674" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.795192" elapsed="0.003552"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.806109" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.806600" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '384'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:50.806737" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.800154" elapsed="0.006619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.810434" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.807012" elapsed="0.003512"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.810747" elapsed="0.003766"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.817264" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.814767" elapsed="0.002527"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.817494" elapsed="0.002179"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:50.819730" elapsed="0.000061"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:50.799682" elapsed="0.020229"/>
</kw>
<msg time="2026-05-01T00:51:50.819993" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:50.798992" elapsed="0.021027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.820473" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.820189" elapsed="0.000331"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.821417" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:50.821508" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:50.821153" elapsed="0.000379"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.821939" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:50.822012" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:50.821688" elapsed="0.000347"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.822191" elapsed="0.000320"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.822861" level="INFO">${sum_1} = 2127</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:50.822678" elapsed="0.000209"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.823214" level="INFO">${sum_2} = 2127</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:50.823038" elapsed="0.000201"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.823394" elapsed="0.000322"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:50.820774" elapsed="0.003001"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:50.823987" elapsed="0.001887"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.831923" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.832093" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '384'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:50.832226" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.826654" elapsed="0.005608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.836232" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.832599" elapsed="0.003702"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.836560" elapsed="0.003474"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.845708" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.845825" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '384'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:50.845928" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.840265" elapsed="0.005690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.848591" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.846127" elapsed="0.002513"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.848798" elapsed="0.003181"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:50.855350" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.852104" elapsed="0.003309"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.852070" elapsed="0.003376"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.862944" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.863003" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.863134" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.855712" elapsed="0.007452"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:50.826234" elapsed="0.037012"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.869873" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.870036" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.870167" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.864533" elapsed="0.005670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.873992" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.870444" elapsed="0.003616"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.874287" elapsed="0.003649"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.880030" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:50.878177" elapsed="0.001922"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.880325" elapsed="0.002577"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:50.882960" elapsed="0.000053"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:50.864095" elapsed="0.019038"/>
</kw>
<msg time="2026-05-01T00:51:50.883218" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:50.863473" elapsed="0.019773"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.883683" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.883419" elapsed="0.000310"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.884689" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:50.884765" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:50.884370" elapsed="0.000420"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.885205" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:50.885291" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:50.884948" elapsed="0.000369"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.885496" elapsed="0.000317"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.886156" level="INFO">${sum_1} = 1680</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:50.885973" elapsed="0.000209"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:50.886530" level="INFO">${sum_2} = 1680</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:50.886337" elapsed="0.000221"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:50.886742" elapsed="0.000304"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:50.883986" elapsed="0.003119"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.892397" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.892590" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.892768" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.887718" elapsed="0.005083"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.895747" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.892981" elapsed="0.002815"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.895953" elapsed="0.002565"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:50.902830" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:50.902984" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:50.903129" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:50.898683" elapsed="0.004482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.906855" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:50.903405" elapsed="0.003516"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:50.907141" elapsed="0.003588"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:50.914676" elapsed="0.000077"/>
</return>
<status status="PASS" start="2026-05-01T00:51:50.910890" elapsed="0.003938"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.910838" elapsed="0.004045"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:50.915245" elapsed="0.000051"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:50.887393" elapsed="0.028056"/>
</kw>
<arg>route_eth_as</arg>
<status status="PASS" start="2026-05-01T00:51:50.758059" elapsed="0.157530"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:50.632231" elapsed="0.283585"/>
</test>
<test id="s1-s13-t19" name="Play_To_Odl_route_eth_as" line="108">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:50.921624" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:50.921325" elapsed="0.000610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.923066" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.922928" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.922901" elapsed="0.000246"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.928311" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.928196" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.928176" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.929630" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:50.929093" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:50.930133" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:50.929831" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:50.930203" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:51:50.930374" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:50.928699" elapsed="0.001700"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.937710" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.937543" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.937513" elapsed="0.000409"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:50.940277" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:50.939985" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:50.939953" elapsed="0.001155"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:50.942682" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:50.942109" elapsed="0.000639"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:50.943399" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:50.943110" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:50.975258" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:50.945588" elapsed="0.029821"/>
</kw>
<msg time="2026-05-01T00:51:50.975587" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:50.975686" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.943801" elapsed="0.031958"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:51.002795" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:50.977891" elapsed="0.025071"/>
</kw>
<msg time="2026-05-01T00:51:51.003121" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:51.003217" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.976178" elapsed="0.027113"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.004087" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:51.003661" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:51.003625" elapsed="0.000651"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.005165" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.004438" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.005877" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:51.005511" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:51.005488" elapsed="0.000565"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:51.006099" elapsed="0.000060"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:51.010187" elapsed="0.000166"/>
</kw>
<msg time="2026-05-01T00:51:51.010400" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:51.009407" elapsed="0.001090"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.010723" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.010947" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:51.008559" elapsed="0.002624"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:51.006504" elapsed="0.004814"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:50.939281" elapsed="0.072239"/>
</kw>
<msg time="2026-05-01T00:51:51.011626" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:51.011672" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.938159" elapsed="0.073556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:51.011924" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:51:51.011809" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:51.011787" elapsed="0.000313"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.012663" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.013112" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:51.013187" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:50.937008" elapsed="0.076308"/>
</kw>
<msg time="2026-05-01T00:51:51.013419" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:51.013537" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.930847" elapsed="0.082731"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.014005" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:51.013661" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:51.013641" elapsed="0.000469"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:50.930695" elapsed="0.083445"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:50.930490" elapsed="0.083692"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:50.927821" elapsed="0.086432"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:50.922597" elapsed="0.091719"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:50.922094" elapsed="0.092273"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:50.919008" elapsed="0.095418"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:51.020342" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:51.020546" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:51.020658" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:51.014914" elapsed="0.005771"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:51.020861" elapsed="0.003117"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:51.028364" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:51.028612" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:51.028770" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:51.024148" elapsed="0.004659"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:51.033286" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:51.032821" elapsed="0.000518"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:51.034089" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:51.033687" elapsed="0.000441"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:51.034353" elapsed="0.000541"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:51.029147" elapsed="0.005840"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:51.014616" elapsed="0.020448"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:50.918241" elapsed="0.116882"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:51.036177" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:51.036420" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:51.035889" elapsed="0.000618"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.067125" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_as.vanadium/route_eth_as.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:51.066666" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:51.068056" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as.vanadium/route_eth_as.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:51.067757" elapsed="0.000389">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as.vanadium/route_eth_as.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:51.068244" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:51.067352" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.068957" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:51.068444" elapsed="0.000542"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:51.069307" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/route_eth_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:51.069491" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:51.069157" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.069936" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.069686" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:51.070502" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:51.070081" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.071045" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:51.070748" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:51.070597" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:51.070049" elapsed="0.001085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.071795" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:51.071297" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:51.071878" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:51:51.072060" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:51.063584" elapsed="0.008573"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:51.072588" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/announce_route_eth_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/announce_route_eth_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:51.072721" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:51.072328" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:51.073126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/withdraw_route_eth_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_as/withdraw_route_eth_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:51.073260" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:51.072927" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.073733" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.073470" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.074187" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.073948" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.074648" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.074390" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:51.075082" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:51.074847" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:51.075279" elapsed="0.002464"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:51.077939" elapsed="0.001430"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:51.084952" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:51.085095" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:51.085210" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:51.080399" elapsed="0.005348">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.086034" elapsed="0.000033"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:51.086425" elapsed="0.000058"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:51.080053" elapsed="0.006583">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:53.098130" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:53.098415" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '384'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:53.098619" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:53.088897" elapsed="0.009763"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:53.099517" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:53.103243" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:53.098979" elapsed="0.004340"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:53.107631" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:53.107057" elapsed="0.000604"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:53.108264" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:53.107822" elapsed="0.000471"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:53.108474" elapsed="0.000353"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:53.103690" elapsed="0.005206"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:53.087625" elapsed="0.021329"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:51.079586" elapsed="2.029417"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:53.109195" elapsed="0.002438"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:53.117140" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:53.117327" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:53.117501" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:53.112646" elapsed="0.004993"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:53.117899" elapsed="0.004330"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:53.131340" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:53.132218" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '532'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"as-generated":{"as":16843009,"local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:53.132573" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:53.122498" elapsed="0.010125"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:53.138794" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:53.138103" elapsed="0.000739"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:53.139883" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:53.139084" elapsed="0.000842"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:53.140802" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "as-generated": {
        "as": 16843009,
        "local-discriminator": 2000
       },
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:53.141145" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:53.140174" elapsed="0.001143">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:53.133307" elapsed="0.008265">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:53.112337" elapsed="0.029401">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQUBAQEBAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.151334" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.151554" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.151704" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.143319" elapsed="0.008424"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.151992" elapsed="0.003705"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.160903" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.161053" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:55.161197" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.155940" elapsed="0.005295"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.165636" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.165190" elapsed="0.000486"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.166301" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.165916" elapsed="0.000425"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.166582" elapsed="0.000469"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.161598" elapsed="0.005539"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.142511" elapsed="0.024702"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:53.111847" elapsed="2.055421"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:55.168053" elapsed="0.002561"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.177271" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.177390" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.177516" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.171835" elapsed="0.005717"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.177718" elapsed="0.002564"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.188839" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.189086" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:55.189237" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.180448" elapsed="0.008828"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.195617" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.194937" elapsed="0.000745"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.196679" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.196037" elapsed="0.000706"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.197102" elapsed="0.000815"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.189636" elapsed="0.008423"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.171270" elapsed="0.026912"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:55.170845" elapsed="0.027423"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:55.167554" elapsed="0.030838"/>
</kw>
<arg>route_eth_as</arg>
<status status="PASS" start="2026-05-01T00:51:51.035436" elapsed="4.163096"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:50.917094" elapsed="4.281654"/>
</test>
<test id="s1-s13-t20" name="Odl_To_Play_route_eth_lacp" line="111">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:55.202466" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:55.202182" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.203785" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.203657" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.203635" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.208926" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.208816" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.208797" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.210053" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:55.209623" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.210558" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:55.210244" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:55.210629" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:51:55.210797" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:55.209228" elapsed="0.001594"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.216599" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.216487" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.216468" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.218227" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.218038" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.218019" elapsed="0.000374"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:55.218988" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:55.218564" elapsed="0.000486"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.219748" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:55.219470" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.253164" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:55.221704" elapsed="0.031696"/>
</kw>
<msg time="2026-05-01T00:51:55.253613" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:55.253714" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.220125" elapsed="0.033665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.279290" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:55.256190" elapsed="0.023240"/>
</kw>
<msg time="2026-05-01T00:51:55.279585" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:55.279679" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.254356" elapsed="0.025395"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.280447" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.280065" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.280037" elapsed="0.000610"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.281382" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.280806" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.282147" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.281737" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.281715" elapsed="0.000607"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:55.282365" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:55.285934" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:51:55.286121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:55.285406" elapsed="0.000785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.286407" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.286733" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:55.284647" elapsed="0.002311"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:55.282705" elapsed="0.004339"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:55.217543" elapsed="0.069680"/>
</kw>
<msg time="2026-05-01T00:51:55.287321" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:55.287367" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.216832" elapsed="0.070575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:55.287617" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:51:55.287505" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.287485" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.288178" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.288737" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.288872" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:55.216128" elapsed="0.072865"/>
</kw>
<msg time="2026-05-01T00:51:55.289091" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:55.289137" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.211204" elapsed="0.077972"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.289534" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.289256" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.289238" elapsed="0.000397"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:55.211056" elapsed="0.078610"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:55.210877" elapsed="0.078833"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:55.208438" elapsed="0.081354"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:55.203340" elapsed="0.086531"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.202894" elapsed="0.087090"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:55.199967" elapsed="0.090098"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.296420" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.296608" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.296771" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.290656" elapsed="0.006153"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.297044" elapsed="0.002708"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.308493" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.308675" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:55.308862" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.299928" elapsed="0.008984"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.315550" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.314857" elapsed="0.000759"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.316625" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.315975" elapsed="0.000713"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.317044" elapsed="0.000758"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.309337" elapsed="0.008660"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.290262" elapsed="0.027957"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:55.199498" elapsed="0.118885"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.319397" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.319592" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.319189" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.319980" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.320110" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.319784" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.320503" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/announce_route_eth_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/announce_route_eth_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.320631" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.320295" elapsed="0.000363"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:55.321038" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:55.320824" elapsed="0.000241"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.321428" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/withdraw_route_eth_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/withdraw_route_eth_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.321576" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.321223" elapsed="0.000379"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:55.321992" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:55.321761" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.322432" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.322181" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.322908" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.322666" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.323350" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.323112" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.323809" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.323564" elapsed="0.000289"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:55.324044" elapsed="0.002538"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.339293" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '894', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:55.339408" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.339610" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.326992" elapsed="0.012664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.345466" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.340176" elapsed="0.005356"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.350963" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.351361" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '414'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:55.351492" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.345763" elapsed="0.005757"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.354165" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.351695" elapsed="0.002520"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.359367" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.359882" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '414'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:55.360022" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.355247" elapsed="0.004813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.363843" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.360359" elapsed="0.003556"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.364135" elapsed="0.003702"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.370409" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.368071" elapsed="0.002412"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.370750" elapsed="0.003296"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:55.374139" elapsed="0.000062"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:55.354903" elapsed="0.019453"/>
</kw>
<msg time="2026-05-01T00:51:55.374516" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:55.354393" elapsed="0.020169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.375049" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.374792" elapsed="0.000303"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.376087" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:55.376172" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:55.375783" elapsed="0.000421"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.376698" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:51:55.376811" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:55.376366" elapsed="0.000473"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.377026" elapsed="0.000364"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.377783" level="INFO">${sum_1} = 2935</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:55.377590" elapsed="0.000219"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.378193" level="INFO">${sum_2} = 2935</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:55.378008" elapsed="0.000211"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.378387" elapsed="0.000385"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:55.375349" elapsed="0.003486"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:55.379021" elapsed="0.001692"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.386757" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.386899" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '414'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:55.386995" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.381241" elapsed="0.005780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.392837" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.387194" elapsed="0.005744"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.393263" elapsed="0.003712"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.403773" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.403912" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '414'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:55.404023" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.397208" elapsed="0.006841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.406992" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.404221" elapsed="0.002841"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.407282" elapsed="0.003486"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:55.414181" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.410888" elapsed="0.003365"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.410855" elapsed="0.003432"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.420963" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.421011" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.421114" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.414526" elapsed="0.006617"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:55.380966" elapsed="0.040247"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.427397" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.427583" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.427715" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.422273" elapsed="0.005478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.431428" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.427989" elapsed="0.003530"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.431740" elapsed="0.003609"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.437787" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.435606" elapsed="0.002275"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.438078" elapsed="0.002142"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:55.440272" elapsed="0.000037"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:55.421893" elapsed="0.018519"/>
</kw>
<msg time="2026-05-01T00:51:55.440512" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:55.421385" elapsed="0.019154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.440966" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.440711" elapsed="0.000301"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.441903" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:55.442006" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:55.441638" elapsed="0.000394"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.442448" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:51:55.442542" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:55.442191" elapsed="0.000376"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.442726" elapsed="0.000311"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.443381" level="INFO">${sum_1} = 2488</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:55.443197" elapsed="0.000211"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:55.443763" level="INFO">${sum_2} = 2488</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:55.443581" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.443947" elapsed="0.000310"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:55.441250" elapsed="0.003069"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.449492" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.449606" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.449701" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.444907" elapsed="0.004821"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.452566" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.449901" elapsed="0.002714"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.452777" elapsed="0.002832"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.461333" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.461508" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.461654" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.455841" elapsed="0.005894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.465489" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.462040" elapsed="0.003520"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.465784" elapsed="0.003553"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:51:55.472773" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:51:55.469447" elapsed="0.003413"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.469419" elapsed="0.003477"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.473109" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:55.444598" elapsed="0.028636"/>
</kw>
<arg>route_eth_lacp</arg>
<status status="PASS" start="2026-05-01T00:51:55.318880" elapsed="0.154416"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.199054" elapsed="0.274393"/>
</test>
<test id="s1-s13-t21" name="Play_To_Odl_route_eth_lacp" line="113">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:55.477568" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:55.477291" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.478868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.478757" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.478739" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.483997" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.483890" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.483872" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.485178" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:55.484691" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.485687" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:55.485368" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:55.485757" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:51:55.485915" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:55.484298" elapsed="0.001677"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.491764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.491653" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.491634" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.493293" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:55.493108" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.493090" elapsed="0.000389"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:55.494072" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:55.493636" elapsed="0.000500"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.494777" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:55.494505" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.525484" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:55.496715" elapsed="0.028906"/>
</kw>
<msg time="2026-05-01T00:51:55.525766" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:55.525862" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.495149" elapsed="0.030785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:55.552882" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:55.527973" elapsed="0.025168"/>
</kw>
<msg time="2026-05-01T00:51:55.553297" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:55.553392" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.526397" elapsed="0.027094"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.554269" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.553818" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.553787" elapsed="0.000684"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.555235" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.554629" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.555907" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.555552" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.555531" elapsed="0.000551"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:55.556124" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:55.559780" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:51:55.559971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:55.559205" elapsed="0.000834"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.560256" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.560492" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:55.558419" elapsed="0.002295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:55.556443" elapsed="0.004356"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:55.492666" elapsed="0.068310"/>
</kw>
<msg time="2026-05-01T00:51:55.561073" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:55.561118" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.491989" elapsed="0.069167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:55.561343" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:51:55.561234" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.561215" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.561919" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.562569" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:55.562649" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:55.491297" elapsed="0.071473"/>
</kw>
<msg time="2026-05-01T00:51:55.562868" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:55.562911" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.486363" elapsed="0.076588"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.563286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.563028" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.563010" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:55.486216" elapsed="0.077170"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:55.486034" elapsed="0.077441"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:55.483525" elapsed="0.080017"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:55.478466" elapsed="0.085133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:55.478023" elapsed="0.085623"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:55.475144" elapsed="0.088557"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.570811" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.570964" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.571067" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.564322" elapsed="0.006771"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:55.571268" elapsed="0.002965"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.579933" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.580082" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:55.580228" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:55.574406" elapsed="0.005859"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.584710" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.584260" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:55.585360" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:55.584979" elapsed="0.000419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.585641" elapsed="0.000521"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:55.580618" elapsed="0.005634"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.564043" elapsed="0.022288"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:55.474656" elapsed="0.111734"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.587424" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.587659" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.587141" elapsed="0.000559"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.617128" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp.vanadium/route_eth_lacp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:55.616746" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.618007" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp.vanadium/route_eth_lacp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:51:55.617739" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp.vanadium/route_eth_lacp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:51:55.618180" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:51:55.617371" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.618782" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:55.618377" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.619110" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/route_eth_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.619238" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.618975" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.619685" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.619427" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:51:55.620123" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:55.619807" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.620697" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:51:55.620358" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.620207" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:55.619786" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.621381" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:51:55.620938" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:51:55.621475" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:51:55.621637" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:51:55.614288" elapsed="0.007376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.622039" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/announce_route_eth_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/announce_route_eth_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.622165" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.621828" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:55.622559" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/withdraw_route_eth_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp/withdraw_route_eth_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:55.622679" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:55.622350" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.623112" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.622866" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.623623" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.623361" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.624071" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.623830" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:55.624527" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:55.624270" elapsed="0.000302"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:55.624726" elapsed="0.002267"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:55.627177" elapsed="0.001727"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:55.635651" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:55.635811" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:55.635944" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:51:55.629875" elapsed="0.006560">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.636727" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:55.637054" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:51:55.629543" elapsed="0.007682">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:57.646871" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:57.647090" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '414'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:57.647253" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:57.638950" elapsed="0.008343"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:51:57.648036" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:51:57.651595" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:51:57.647605" elapsed="0.004064"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:57.656709" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:57.655980" elapsed="0.000772"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:57.657620" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:57.656988" elapsed="0.000673"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:57.657896" elapsed="0.000489"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:57.652020" elapsed="0.006479"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:51:57.637965" elapsed="0.020618"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:55.629098" elapsed="2.029556"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:57.658921" elapsed="0.002776"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:57.669361" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:57.669583" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:57.669737" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:57.663135" elapsed="0.006642"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:57.670055" elapsed="0.004378"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:57.680386" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:57.681096" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '562'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:51:57.681267" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:57.674737" elapsed="0.006570"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:57.686065" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:57.685613" elapsed="0.000494"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:57.687128" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:57.686342" elapsed="0.000829"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:51:57.688031" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:51:57.688334" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:51:57.687524" elapsed="0.000920">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:51:57.681702" elapsed="0.006986">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:51:57.662717" elapsed="0.026160">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.698101" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.698299" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:59.698485" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.690331" elapsed="0.008196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.698796" elapsed="0.003993"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.708894" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.709068" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:59.709295" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.703042" elapsed="0.006294"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.714094" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.713645" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.714791" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.714369" elapsed="0.000462"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.715068" elapsed="0.000574"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.709733" elapsed="0.006002"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:59.689574" elapsed="0.026240"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:57.662002" elapsed="2.053872"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:51:59.716695" elapsed="0.002815"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.726994" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.727169" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:59.727325" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.721222" elapsed="0.006193"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.727700" elapsed="0.003909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.736713" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.736872" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:59.737020" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.731851" elapsed="0.005207"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.741876" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.741399" elapsed="0.000522"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.742580" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.742156" elapsed="0.000465"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.742856" elapsed="0.000519"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.737405" elapsed="0.006179"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:59.720422" elapsed="0.023247"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:59.719799" elapsed="0.023930"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:51:59.716155" elapsed="0.027655"/>
</kw>
<arg>route_eth_lacp</arg>
<status status="PASS" start="2026-05-01T00:51:55.586718" elapsed="4.157170"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:55.473891" elapsed="4.270154"/>
</test>
<test id="s1-s13-t22" name="Odl_To_Play_route_eth_lacp_extdef" line="116">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:51:59.748902" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:51:59.748636" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:59.750207" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:59.750080" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.750057" elapsed="0.000229"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:59.755489" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:59.755328" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.755310" elapsed="0.000252"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.756582" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:51:59.756177" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.757069" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:51:59.756773" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:51:59.757140" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:51:59.757304" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:51:59.755795" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:59.763286" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:59.763173" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.763154" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:51:59.764898" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:59.764713" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.764695" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:51:59.765663" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:51:59.765219" elapsed="0.000506"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:51:59.766348" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:59.766077" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:51:59.799298" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:51:59.768330" elapsed="0.031211"/>
</kw>
<msg time="2026-05-01T00:51:59.799715" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:51:59.799818" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:59.766747" elapsed="0.033145"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:51:59.832031" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "d "e "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:51:59.801994" elapsed="0.030304"/>
</kw>
<msg time="2026-05-01T00:51:59.832517" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:51:59.832619" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:59.800355" elapsed="0.032339"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.833515" elapsed="0.000143"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:59.833039" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.833003" elapsed="0.000793"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.834622" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "d "e "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.833953" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.835287" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:59.834928" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.834908" elapsed="0.000606"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:51:59.835559" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:51:59.839283" elapsed="0.000240"/>
</kw>
<msg time="2026-05-01T00:51:59.839573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:51:59.838696" elapsed="0.000951"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.839875" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.840097" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:51:59.837908" elapsed="0.002412"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:51:59.835892" elapsed="0.004516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:51:59.764236" elapsed="0.076373"/>
</kw>
<msg time="2026-05-01T00:51:59.840709" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:59.840755" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:59.763573" elapsed="0.077223"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:51:59.840986" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:51:59.840875" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.840856" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.841600" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.842034" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:51:59.842108" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:51:59.762819" elapsed="0.079402"/>
</kw>
<msg time="2026-05-01T00:51:59.842317" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:51:59.842362" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:59.757731" elapsed="0.084671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:51:59.842802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:51:59.842545" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.842526" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:51:59.757583" elapsed="0.085323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:51:59.757385" elapsed="0.085553"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:51:59.754964" elapsed="0.088032"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:51:59.749781" elapsed="0.093275"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:51:59.749316" elapsed="0.093787"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:51:59.745838" elapsed="0.097321"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.850569" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.850838" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:59.851085" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.843713" elapsed="0.007431"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.851679" elapsed="0.004467"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.862699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.862904" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:51:59.863083" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.856400" elapsed="0.006724"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.868021" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.867546" elapsed="0.000522"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:51:59.868690" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.868291" elapsed="0.000440"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.868953" elapsed="0.000479"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.863583" elapsed="0.005959"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:59.843357" elapsed="0.026264"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:51:59.745157" elapsed="0.124524"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:59.870773" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:59.871004" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:59.870489" elapsed="0.000556"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:59.871578" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:59.871757" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:59.871268" elapsed="0.000526"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:59.872284" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/announce_route_eth_lacp_extdef.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/announce_route_eth_lacp_extdef.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:59.872540" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:59.872019" elapsed="0.000559"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:59.873098" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:59.872804" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:51:59.873649" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/withdraw_route_eth_lacp_extdef.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/withdraw_route_eth_lacp_extdef.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:51:59.873823" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:51:59.873360" elapsed="0.000501"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:51:59.874368" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:51:59.874086" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.875004" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;default-gateway-extended-community&gt;
            &lt;/default-gateway-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.874654" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.875738" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "default-gateway-extended-community": {}
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.875305" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.876237" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.875999" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.876689" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.876433" elapsed="0.000300"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:59.876883" elapsed="0.003134"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.894239" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1098', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;default-gateway-extended-community&gt;
            &lt;/default-gateway-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:51:59.894512" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.894740" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.880189" elapsed="0.014610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.901515" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.895200" elapsed="0.006427"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.908589" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.909105" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:59.909280" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.902037" elapsed="0.007272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.912559" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.909587" elapsed="0.003054"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.920795" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.921533" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:59.921737" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.914175" elapsed="0.007605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.926029" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.922116" elapsed="0.003992"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.926359" elapsed="0.003821"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:59.933276" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:51:59.930427" elapsed="0.002881"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.933520" elapsed="0.002216"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:51:59.935794" elapsed="0.000047"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:59.913663" elapsed="0.022528"/>
</kw>
<msg time="2026-05-01T00:51:59.936277" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:59.912930" elapsed="0.023374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.936744" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.936492" elapsed="0.000298"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.937716" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:51:59.937792" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:59.937434" elapsed="0.000383"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.938235" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:51:59.938311" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:51:59.937979" elapsed="0.000355"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.938510" elapsed="0.000308"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:59.939166" level="INFO">${sum_1} = 3189</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:59.938977" elapsed="0.000215"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:51:59.939605" level="INFO">${sum_2} = 3189</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:51:59.939345" elapsed="0.000291"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:51:59.939799" elapsed="0.000419"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:51:59.937051" elapsed="0.003255"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:51:59.940552" elapsed="0.002050"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.949408" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.949660" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:59.949811" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.943368" elapsed="0.006485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.954178" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.950118" elapsed="0.004140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.954531" elapsed="0.003781"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.968481" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.968676" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:51:59.968919" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.958589" elapsed="0.010361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.971900" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.969194" elapsed="0.002784"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.972205" elapsed="0.003719"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:51:59.979519" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:51:59.976071" elapsed="0.003526"/>
</branch>
<status status="PASS" start="2026-05-01T00:51:59.976034" elapsed="0.003600"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.987271" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.987345" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.987561" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.979864" elapsed="0.007742"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:51:59.942961" elapsed="0.044759"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:51:59.995229" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:51:59.995404" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:51:59.995609" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:51:59.989272" elapsed="0.006376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:51:59.999582" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:51:59.995911" elapsed="0.003746"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:51:59.999898" elapsed="0.003780"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:00.006492" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:00.003911" elapsed="0.002647"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:00.006782" elapsed="0.003031"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:00.009884" elapsed="0.000063"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:51:59.988756" elapsed="0.021336"/>
</kw>
<msg time="2026-05-01T00:52:00.010204" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:51:59.987991" elapsed="0.022249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.010827" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.010491" elapsed="0.000403"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.012234" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:00.012418" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:00.011845" elapsed="0.000630"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.013051" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:00.013149" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:00.012708" elapsed="0.000473"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:00.013395" elapsed="0.000424"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:00.014319" level="INFO">${sum_1} = 2742</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:00.014052" elapsed="0.000303"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:00.014853" level="INFO">${sum_2} = 2742</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:00.014595" elapsed="0.000298"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:00.015127" elapsed="0.000501"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:00.011245" elapsed="0.004472"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:00.022263" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:00.022437" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:00.022589" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:00.016565" elapsed="0.006058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.026631" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.022864" elapsed="0.003830"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:00.026906" elapsed="0.003645"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:00.037010" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:00.037172" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:00.037320" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:00.030809" elapsed="0.006547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.041368" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.037647" elapsed="0.003796"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:00.041709" elapsed="0.003706"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:00.049133" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:52:00.045571" elapsed="0.003677"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.045534" elapsed="0.003757"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.049554" elapsed="0.000036"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:00.016106" elapsed="0.033671"/>
</kw>
<arg>route_eth_lacp_extdef</arg>
<status status="PASS" start="2026-05-01T00:51:59.870055" elapsed="0.179795"/>
</kw>
<status status="PASS" start="2026-05-01T00:51:59.744500" elapsed="0.305511"/>
</test>
<test id="s1-s13-t23" name="Play_To_Odl_route_eth_lacp_extdef" line="118">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:00.055923" elapsed="0.000279"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:00.055492" elapsed="0.000789"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:00.057830" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:00.057660" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.057629" elapsed="0.000309"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:00.065318" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:00.065171" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.065146" elapsed="0.000275"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.067096" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:00.066357" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.067888" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:00.067383" elapsed="0.000544"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:00.067994" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:52:00.068237" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:00.065785" elapsed="0.002492"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:00.079043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:00.078897" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.078872" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:00.081083" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:00.080845" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.080821" elapsed="0.000481"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:00.082090" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:00.081539" elapsed="0.000637"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:00.083039" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:00.082672" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:00.116513" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:00.085276" elapsed="0.031502"/>
</kw>
<msg time="2026-05-01T00:52:00.117005" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:00.117131" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:00.083569" elapsed="0.033662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:00.147915" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "d "e "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:00.120235" elapsed="0.027862"/>
</kw>
<msg time="2026-05-01T00:52:00.148255" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:00.148355" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:00.117887" elapsed="0.030542"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.149223" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:00.148795" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.148764" elapsed="0.000643"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.150206" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "d "e "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.149580" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.150966" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:00.150607" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.150586" elapsed="0.000559"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:00.151188" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:00.154863" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:52:00.155058" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:00.154365" elapsed="0.000764"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.155350" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.155593" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:00.153587" elapsed="0.002231"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:00.151574" elapsed="0.004332"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:00.080253" elapsed="0.075832"/>
</kw>
<msg time="2026-05-01T00:52:00.156184" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:00.156229" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:00.079346" elapsed="0.076921"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:00.156566" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:52:00.156347" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.156327" elapsed="0.000334"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.157148" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.157602" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:00.157675" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:00.078418" elapsed="0.079371"/>
</kw>
<msg time="2026-05-01T00:52:00.157887" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:00.157936" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:00.068866" elapsed="0.089111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.158313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:00.158056" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.158038" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:00.068643" elapsed="0.089772"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:00.068362" elapsed="0.090088"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:00.064679" elapsed="0.093864"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:00.057213" elapsed="0.101390"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:00.056541" elapsed="0.102110"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:00.052050" elapsed="0.106656"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:00.164686" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:00.164892" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:00.165022" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:00.159144" elapsed="0.005906"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:00.165245" elapsed="0.003351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:00.173919" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:00.174045" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:00.174157" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:00.168773" elapsed="0.005411"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:00.177421" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:00.177103" elapsed="0.000361"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:00.177906" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:00.177627" elapsed="0.000309"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:00.178096" elapsed="0.000369"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:00.174445" elapsed="0.004087"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:00.158860" elapsed="0.019728"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:00.051227" elapsed="0.127406"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:00.179365" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:00.179566" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:00.179158" elapsed="0.000437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.205476" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef.vanadium/route_eth_lacp_extdef.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:00.205038" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:00.206311" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef.vanadium/route_eth_lacp_extdef.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:00.206042" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef.vanadium/route_eth_lacp_extdef.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:00.206499" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:00.205689" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.207085" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:00.206696" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:00.207502" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/route_eth_lacp_extdef.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:00.207681" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:00.207346" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.208122" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "default-gateway-extended-community": {}
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.207870" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:00.208641" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:00.208257" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.209177" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:00.208880" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:00.208730" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:00.208232" elapsed="0.001029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.209879" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:00.209412" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:00.209961" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:52:00.210130" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:00.202628" elapsed="0.007528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:00.210536" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/announce_route_eth_lacp_extdef.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/announce_route_eth_lacp_extdef.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:00.210672" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:00.210322" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:00.211054" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/withdraw_route_eth_lacp_extdef.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extdef/withdraw_route_eth_lacp_extdef.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:00.211174" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:00.210857" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.211680" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;default-gateway-extended-community&gt;
            &lt;/default-gateway-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.211362" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.212139" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "default-gateway-extended-community": {}
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.211899" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.212662" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.212403" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:00.213108" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:00.212864" elapsed="0.000289"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:00.213305" elapsed="0.002940"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:00.216407" elapsed="0.001735"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:00.224813" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:00.224959" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:00.225070" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:00.219208" elapsed="0.006283">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.225691" elapsed="0.000024"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:00.225936" elapsed="0.000024"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:00.218853" elapsed="0.007212">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:02.235545" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:02.235757" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:02.235905" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:02.227737" elapsed="0.008205"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:02.236640" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "default-gateway-extended-community": {}
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:02.239841" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:02.236226" elapsed="0.003764"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:02.244684" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "default-gateway-extended-community": {},
       "transitive": true
      }
  ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:02.243923" elapsed="0.000803"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:02.245621" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "default-gateway-extended-community": {},
       "transitive": true
      }
  ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:02.244950" elapsed="0.000711"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:02.245887" elapsed="0.000464"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:02.240345" elapsed="0.006092"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:02.226794" elapsed="0.019743"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:00.218327" elapsed="2.028275"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:02.246824" elapsed="0.002800"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:02.255914" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:02.256032" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:02.256127" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:02.250745" elapsed="0.005407"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:02.256343" elapsed="0.002788"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:02.264159" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:02.264915" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '647'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"default-gateway-extended-community":{},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:02.265073" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:02.259296" elapsed="0.005814"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:02.269415" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:02.269017" elapsed="0.000457"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:02.270427" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:02.269699" elapsed="0.000788"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:02.271152" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "default-gateway-extended-community": {},
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:02.271547" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,42 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "default-gateway-extended-community": {},
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:02.270712" elapsed="0.000944">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,42 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "default-gateway-extended-community": {},
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:02.265425" elapsed="0.006463">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,42 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "default-gateway-extended-community": {},
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:02.250423" elapsed="0.021676">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,42 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "default-gateway-extended-community": {},
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.281675" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.281862" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.282007" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.273759" elapsed="0.008284"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.282290" elapsed="0.003749"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.291097" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.291247" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:04.291391" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.286276" elapsed="0.005153"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.296147" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.295708" elapsed="0.000479"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.296853" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.296411" elapsed="0.000532"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.297180" elapsed="0.000513"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.291887" elapsed="0.005899"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.272852" elapsed="0.025011"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:02.249819" elapsed="2.048101"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:04.298732" elapsed="0.002806"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.308729" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.308917" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.309070" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.303283" elapsed="0.005825"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.309344" elapsed="0.003714"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.318685" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.318836" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:04.318982" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.313297" elapsed="0.005723"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.323501" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.323078" elapsed="0.000465"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.324151" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.323767" elapsed="0.000423"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.324411" elapsed="0.000571"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.319342" elapsed="0.005731"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.302486" elapsed="0.022664"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:04.301825" elapsed="0.023380"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:04.298190" elapsed="0.027093"/>
</kw>
<arg>route_eth_lacp_extdef</arg>
<status status="PASS" start="2026-05-01T00:52:00.178856" elapsed="4.146494"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:00.050504" elapsed="4.275076"/>
</test>
<test id="s1-s13-t24" name="Odl_To_Play_route_eth_lacp_extesilab" line="121">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:04.331026" elapsed="0.000302"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:04.330643" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.332909" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.332715" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.332684" elapsed="0.000334"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.340005" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.339894" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.339875" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.341137" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:04.340724" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.341660" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:04.341331" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:04.341733" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:52:04.341900" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:04.340316" elapsed="0.001609"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.347826" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.347714" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.347695" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.349501" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.349293" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.349274" elapsed="0.000397"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:04.350246" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:04.349827" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.350952" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:04.350680" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.383487" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:04.352981" elapsed="0.030664"/>
</kw>
<msg time="2026-05-01T00:52:04.383804" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:04.383901" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.351339" elapsed="0.032636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.415076" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "i "l "a "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:04.386112" elapsed="0.029129"/>
</kw>
<msg time="2026-05-01T00:52:04.415389" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:04.415539" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.384407" elapsed="0.031212"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.416359" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.415951" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.415918" elapsed="0.000643"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.417360" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "i "l "a "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.416718" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.418129" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.417763" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.417742" elapsed="0.000568"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:04.418354" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:04.422156" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:52:04.422351" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:04.421581" elapsed="0.000842"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.422663" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.422884" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:04.420733" elapsed="0.002379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:04.418707" elapsed="0.004494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:04.348813" elapsed="0.074574"/>
</kw>
<msg time="2026-05-01T00:52:04.423505" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:04.423553" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.348097" elapsed="0.075495"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:04.423785" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:52:04.423673" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.423654" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.424359" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.424822" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.424898" elapsed="0.000042"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:04.347347" elapsed="0.077711"/>
</kw>
<msg time="2026-05-01T00:52:04.425156" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:04.425202" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.342323" elapsed="0.082919"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.425633" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.425323" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.425304" elapsed="0.000412"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:04.342172" elapsed="0.083568"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:04.341983" elapsed="0.083790"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:04.339517" elapsed="0.086316"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:04.332273" elapsed="0.093617"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.331644" elapsed="0.094293"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:04.327405" elapsed="0.098589"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.431722" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.431905" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.432020" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.426429" elapsed="0.005618"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.432219" elapsed="0.003103"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.440080" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.440233" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:04.440378" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.435510" elapsed="0.004907"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.444815" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.444363" elapsed="0.000492"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.445527" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.445114" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.445820" elapsed="0.000461"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.440775" elapsed="0.005593"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.426147" elapsed="0.020296"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:04.326750" elapsed="0.119776"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.447611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.447827" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.447309" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.448358" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.448556" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.448089" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.449138" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/announce_route_eth_lacp_extesilab.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/announce_route_eth_lacp_extesilab.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.449325" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.448817" elapsed="0.000545"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:04.449901" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:04.449607" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.450505" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/withdraw_route_eth_lacp_extesilab.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/withdraw_route_eth_lacp_extesilab.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.450683" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.450208" elapsed="0.000513"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:04.451224" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:04.450943" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.451854" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;esi-label-extended-community&gt;
                &lt;single-active-mode&gt;true&lt;/single-active-mode&gt;
                &lt;esi-label&gt;24001&lt;/esi-label&gt;
            &lt;/esi-label-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.451506" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.452516" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "esi-label-extended-community": {
                "single-active-mode": true,
                "esi-label": 24001
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.452158" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.453186" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.452806" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.453846" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.453497" elapsed="0.000416"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:04.454128" elapsed="0.002783"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.470667" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1193', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;esi-label-extended-community&gt;
                &lt;single-active-mode&gt;true&lt;/single-active-mode&gt;
                &lt;esi-label&gt;24001&lt;/esi-label&gt;
            &lt;/esi-label-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:04.470761" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.470932" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.457261" elapsed="0.013708"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.474894" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.471213" elapsed="0.003741"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.481695" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.482140" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '536'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:04.482248" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.475178" elapsed="0.007097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.484899" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.482447" elapsed="0.002538"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.491184" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.491788" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '536'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:04.491928" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.485996" elapsed="0.005968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.495662" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.492203" elapsed="0.003530"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.495953" elapsed="0.003577"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.502267" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.499761" elapsed="0.002549"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.502584" elapsed="0.003135"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:04.505794" elapsed="0.000052"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:04.485658" elapsed="0.020335"/>
</kw>
<msg time="2026-05-01T00:52:04.506110" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:04.485167" elapsed="0.020979"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.506865" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.506491" elapsed="0.000442"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.508185" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:04.508292" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:04.507812" elapsed="0.000514"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.508931" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:04.509103" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:04.508567" elapsed="0.000571"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.509362" elapsed="0.000469"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.510324" level="INFO">${sum_1} = 3422</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:04.510055" elapsed="0.000307"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.510866" level="INFO">${sum_2} = 3422</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:04.510600" elapsed="0.000302"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.511122" elapsed="0.000512"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:04.507266" elapsed="0.004456"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:04.511936" elapsed="0.001856"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.519954" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.520090" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '536'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:04.520188" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.514556" elapsed="0.005657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.523077" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.520386" elapsed="0.002744"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.523288" elapsed="0.002535"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.530614" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.530784" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '536'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:04.530980" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.525989" elapsed="0.005029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.534719" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.531266" elapsed="0.003525"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.535012" elapsed="0.004552"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:04.543495" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.539726" elapsed="0.003842"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.539682" elapsed="0.003919"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.550782" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.550831" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.550957" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.543837" elapsed="0.007149"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:04.514130" elapsed="0.036930"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.556422" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.556628" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.556763" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.552132" elapsed="0.004668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.560538" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.557086" elapsed="0.003520"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.560825" elapsed="0.003557"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.567353" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.564634" elapsed="0.002761"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.567675" elapsed="0.003025"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:04.570770" elapsed="0.000051"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:04.551762" elapsed="0.019200"/>
</kw>
<msg time="2026-05-01T00:52:04.571074" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:04.551238" elapsed="0.019871"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.571708" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.571340" elapsed="0.000432"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.573044" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:04.573225" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:04.572637" elapsed="0.000623"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.573860" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:04.573964" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:04.573497" elapsed="0.000500"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.574215" elapsed="0.000461"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.575169" level="INFO">${sum_1} = 2975</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:04.574904" elapsed="0.000300"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:04.575709" level="INFO">${sum_2} = 2975</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:04.575421" elapsed="0.000326"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.575969" elapsed="0.000437"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:04.572099" elapsed="0.004416"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.583407" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.583549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.583645" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.577386" elapsed="0.006286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.586544" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.583843" elapsed="0.002752"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.586753" elapsed="0.002585"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.594412" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.594596" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.594745" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.589520" elapsed="0.005261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.598499" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.595020" elapsed="0.003548"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.598789" elapsed="0.003536"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:04.605747" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:52:04.602441" elapsed="0.003398"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.602410" elapsed="0.003465"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.606088" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:04.576894" elapsed="0.029378"/>
</kw>
<arg>route_eth_lacp_extesilab</arg>
<status status="PASS" start="2026-05-01T00:52:04.446894" elapsed="0.159448"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.326049" elapsed="0.280510"/>
</test>
<test id="s1-s13-t25" name="Play_To_Odl_route_eth_lacp_extesilab" line="123">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:04.611502" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:04.611222" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.612768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.612657" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.612638" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.617977" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.617846" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.617826" elapsed="0.000239"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.619149" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:04.618736" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.619664" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:04.619343" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:04.619737" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:52:04.619902" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:04.618314" elapsed="0.001613"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.625954" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.625838" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.625818" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.627546" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:04.627334" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.627315" elapsed="0.000402"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:04.628333" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:04.627884" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.629073" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:04.628771" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.659080" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:04.631029" elapsed="0.028185"/>
</kw>
<msg time="2026-05-01T00:52:04.659351" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:04.659448" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.629449" elapsed="0.030110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:04.704890" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "i "l "a "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:04.661591" elapsed="0.043522"/>
</kw>
<msg time="2026-05-01T00:52:04.705303" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:04.705437" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.659996" elapsed="0.045582"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.706552" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.706008" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.705976" elapsed="0.000850"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.707975" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "i "l "a "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.707038" elapsed="0.001182"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.709118" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.708503" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.708448" elapsed="0.000926"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:04.709430" elapsed="0.000071"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:04.713369" elapsed="0.000168"/>
</kw>
<msg time="2026-05-01T00:52:04.713582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:04.712728" elapsed="0.000921"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.713868" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.714090" elapsed="0.000025"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:04.711945" elapsed="0.002367"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:04.709859" elapsed="0.004540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:04.626876" elapsed="0.087726"/>
</kw>
<msg time="2026-05-01T00:52:04.714698" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:04.714743" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.626191" elapsed="0.088587"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:04.714968" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:52:04.714858" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.714839" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.715564" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.716000" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:04.716076" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:04.625483" elapsed="0.090706"/>
</kw>
<msg time="2026-05-01T00:52:04.716283" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:04.716326" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.620323" elapsed="0.096040"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.716756" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.716442" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.716424" elapsed="0.000411"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:04.620174" elapsed="0.096685"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:04.619986" elapsed="0.096904"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:04.617436" elapsed="0.099511"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:04.612345" elapsed="0.104694"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:04.611915" elapsed="0.105178"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:04.608373" elapsed="0.108778"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.722972" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.723164" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.723265" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.717730" elapsed="0.005562"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:04.723490" elapsed="0.003012"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.732188" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.732335" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:04.732508" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:04.726738" elapsed="0.005809"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.736882" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.736438" elapsed="0.000483"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:04.737613" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:04.737197" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.737877" elapsed="0.000460"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:04.732870" elapsed="0.005555"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.717305" elapsed="0.021221"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:04.607694" elapsed="0.130891"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.739636" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.739846" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.739330" elapsed="0.000555"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.768522" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab.vanadium/route_eth_lacp_extesilab.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:04.768121" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.769326" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab.vanadium/route_eth_lacp_extesilab.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:04.769073" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab.vanadium/route_eth_lacp_extesilab.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:04.769532" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:04.768719" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.770112" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:04.769727" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.770495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/route_eth_lacp_extesilab.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.770628" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.770339" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.771064" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "esi-label-extended-community": {
                "single-active-mode": true,
                "esi-label": 24001
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.770818" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:04.771521" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:04.771191" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.772052" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:04.771759" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.771608" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:04.771171" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.772846" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:04.772289" elapsed="0.000588"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:04.772941" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:52:04.773148" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:04.765850" elapsed="0.007326"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.773564" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/announce_route_eth_lacp_extesilab.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/announce_route_eth_lacp_extesilab.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.773693" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.773342" elapsed="0.000378"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:04.774089" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/withdraw_route_eth_lacp_extesilab.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesilab/withdraw_route_eth_lacp_extesilab.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:04.774219" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:04.773882" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.774682" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;esi-label-extended-community&gt;
                &lt;single-active-mode&gt;true&lt;/single-active-mode&gt;
                &lt;esi-label&gt;24001&lt;/esi-label&gt;
            &lt;/esi-label-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.774406" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.775156" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "esi-label-extended-community": {
                "single-active-mode": true,
                "esi-label": 24001
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.774907" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.775670" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.775402" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:04.776133" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:04.775875" elapsed="0.000305"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:04.776334" elapsed="0.004249"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:04.780771" elapsed="0.001943"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:04.789290" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:04.789476" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:04.789655" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:04.784065" elapsed="0.006103">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.790432" elapsed="0.000060"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:04.790790" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:04.783611" elapsed="0.007352">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:06.801620" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:06.802020" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '536'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:06.802328" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:06.792715" elapsed="0.009683"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:06.803731" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "esi-label-extended-community": {
                "single-active-mode": true,
                "esi-label": 24001
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:06.809608" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:06.802919" elapsed="0.006868"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:06.813521" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "esi-label-extended-community": {
        "esi-label": 24001,
        "single-...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:06.812950" elapsed="0.000601"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:06.814221" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "esi-label-extended-community": {
        "esi-label": 24001,
        "single-...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:06.813735" elapsed="0.000515"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:06.814410" elapsed="0.000352"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:06.810229" elapsed="0.004596"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:06.791725" elapsed="0.023154"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:04.782988" elapsed="2.031941"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:06.815089" elapsed="0.003047"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:06.823083" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:06.823246" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:06.823376" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:06.819077" elapsed="0.004334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:06.823682" elapsed="0.003933"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:06.832492" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:06.833204" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '684'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"esi-label-extended-community":{"esi-label":24001,"single-active-mode":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:06.833353" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:06.827847" elapsed="0.005542"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:06.837785" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:06.837331" elapsed="0.000495"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:06.838807" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:06.838045" elapsed="0.000854"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:06.839591" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "esi-label-extended-community": {
          "esi-label": 24001,
          "single-active-mode": true
         },
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:06.839926" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "esi-label-extended-community": {
+          "esi-label": 24001,
+          "single-active-mode": true
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:06.839126" elapsed="0.000910">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "esi-label-extended-community": {
+          "esi-label": 24001,
+          "single-active-mode": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:06.833790" elapsed="0.006476">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "esi-label-extended-community": {
+          "esi-label": 24001,
+          "single-active-mode": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:06.818801" elapsed="0.021690">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "esi-label-extended-community": {
+          "esi-label": 24001,
+          "single-active-mode": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:08.849525" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:08.849718" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:08.849865" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.842050" elapsed="0.007853"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:08.850153" elapsed="0.003717"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:08.859091" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:08.859245" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:08.859391" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.854176" elapsed="0.005252"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:08.863872" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:08.863420" elapsed="0.000492"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:08.864547" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:08.864134" elapsed="0.000453"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:08.864813" elapsed="0.000465"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:08.859790" elapsed="0.005576"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:08.841151" elapsed="0.024291"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:06.818337" elapsed="2.047184"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:08.866287" elapsed="0.002487"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:08.875790" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:08.875943" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:08.876089" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.870449" elapsed="0.005677"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:08.876360" elapsed="0.003636"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:08.884704" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:08.884852" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:08.884995" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.880230" elapsed="0.004804"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:08.889429" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:08.889033" elapsed="0.000457"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:08.890156" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:08.889772" elapsed="0.000423"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:08.890440" elapsed="0.000481"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:08.885354" elapsed="0.005654"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:08.869670" elapsed="0.021414"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:08.869049" elapsed="0.022089"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:08.865788" elapsed="0.025424"/>
</kw>
<arg>route_eth_lacp_extesilab</arg>
<status status="PASS" start="2026-05-01T00:52:04.738883" elapsed="4.152396"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:04.606985" elapsed="4.284447"/>
</test>
<test id="s1-s13-t26" name="Odl_To_Play_route_eth_lacp_extesr" line="126">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:08.896285" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:08.896016" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:08.897603" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:08.897476" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.897440" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:08.902766" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:08.902657" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.902639" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:08.903854" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:08.903449" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:08.904345" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:08.904044" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:08.904416" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:52:08.904598" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:08.903069" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:08.910519" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:08.910320" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.910302" elapsed="0.000290"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:08.912054" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:08.911870" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.911852" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:08.912825" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:08.912377" elapsed="0.000511"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:08.913534" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:08.913243" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:08.943153" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:08.915478" elapsed="0.027811"/>
</kw>
<msg time="2026-05-01T00:52:08.943429" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:08.943551" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:08.913908" elapsed="0.029717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:08.970152" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:08.945575" elapsed="0.024775"/>
</kw>
<msg time="2026-05-01T00:52:08.970648" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:08.970763" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:08.944026" elapsed="0.026834"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.971640" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:08.971231" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.971203" elapsed="0.000619"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:08.972595" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:08.971980" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.973263" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:08.972900" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.972879" elapsed="0.000560"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:08.973498" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:08.977184" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:52:08.977374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:08.976626" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.977683" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.977902" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:08.975805" elapsed="0.002313"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:08.973802" elapsed="0.004401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:08.911400" elapsed="0.066979"/>
</kw>
<msg time="2026-05-01T00:52:08.978537" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:08.978585" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:08.910751" elapsed="0.067873"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:08.978816" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:08.978704" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.978685" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.979397" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.979847" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:08.979921" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:08.909969" elapsed="0.070065"/>
</kw>
<msg time="2026-05-01T00:52:08.980129" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:08.980174" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:08.905010" elapsed="0.075203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:08.980623" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:08.980289" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:08.980271" elapsed="0.000433"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:08.904862" elapsed="0.075865"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:08.904680" elapsed="0.076080"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:08.902233" elapsed="0.078585"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:08.897162" elapsed="0.083750"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:08.896718" elapsed="0.084240"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:08.893196" elapsed="0.087817"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:08.987836" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:08.988186" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:08.988556" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.981471" elapsed="0.007152"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:08.989120" elapsed="0.006889"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.002628" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.002763" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:09.002883" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:08.996404" elapsed="0.006507"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:09.006179" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.005843" elapsed="0.000366"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:09.006726" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.006371" elapsed="0.000384"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.006920" elapsed="0.000376"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.003191" elapsed="0.004199"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:08.981165" elapsed="0.026326"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:08.892544" elapsed="0.115013"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.008683" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.008928" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.008373" elapsed="0.000596"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.009616" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.009794" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.009193" elapsed="0.000704"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.010402" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/announce_route_eth_lacp_extesr.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/announce_route_eth_lacp_extesr.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.010623" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.010126" elapsed="0.000535"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:09.011186" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:09.010885" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.011737" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/withdraw_route_eth_lacp_extesr.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/withdraw_route_eth_lacp_extesr.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.011914" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.011447" elapsed="0.000505"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:09.012449" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:09.012172" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.013083" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;es-import-route-extended-community&gt;
                &lt;es-import&gt;f2:0c:dd:80:9f:f8&lt;/es-import&gt;
            &lt;/es-import-route-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.012736" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.013738" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "es-import-route-extended-community": {
                "es-import": "f2:0c:dd:80:9f:f8"
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.013383" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.014350" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.014023" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.015026" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.014687" elapsed="0.000401"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:09.015317" elapsed="0.002525"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.031245" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1155', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;es-import-route-extended-community&gt;
                &lt;es-import&gt;f2:0c:dd:80:9f:f8&lt;/es-import&gt;
            &lt;/es-import-route-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:09.031521" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.031766" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.018031" elapsed="0.013797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.037283" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.032264" elapsed="0.005082"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.043381" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.044034" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '530'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:09.044190" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.037603" elapsed="0.006625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.047970" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.044497" elapsed="0.003544"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.054829" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.055247" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '530'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:09.055349" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.049481" elapsed="0.005895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.058000" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.055572" elapsed="0.002478"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.058209" elapsed="0.002554"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.063271" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.060929" elapsed="0.002385"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.063594" elapsed="0.003021"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:09.066748" elapsed="0.000066"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:09.048982" elapsed="0.017989"/>
</kw>
<msg time="2026-05-01T00:52:09.067085" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:09.048292" elapsed="0.018829"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.067729" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.067357" elapsed="0.000436"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.069050" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:09.069155" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:09.068680" elapsed="0.000508"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.069849" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:09.069954" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:09.069481" elapsed="0.000506"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.070211" elapsed="0.000519"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.071225" level="INFO">${sum_1} = 4191</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:09.070958" elapsed="0.000297"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.071610" level="INFO">${sum_2} = 4191</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:09.071408" elapsed="0.000228"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.071791" elapsed="0.000309"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:09.068127" elapsed="0.004035"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:09.072316" elapsed="0.001679"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.079904" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.080094" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '530'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:09.080232" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.074619" elapsed="0.005648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.084343" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.080584" elapsed="0.003827"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.084652" elapsed="0.003506"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.094108" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.094234" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '530'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:09.094404" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.088391" elapsed="0.006040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.097073" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.094662" elapsed="0.002461"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.097281" elapsed="0.002778"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:09.103671" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:09.100185" elapsed="0.003560"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.100149" elapsed="0.003631"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.111089" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.111135" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.111241" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.103996" elapsed="0.007273"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:09.074272" elapsed="0.037067"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.117443" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.117632" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:09.117762" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.112381" elapsed="0.005417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.121489" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.118038" elapsed="0.003521"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.121782" elapsed="0.003588"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.127860" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.125636" elapsed="0.002299"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.128179" elapsed="0.003411"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:09.131684" elapsed="0.000077"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:09.112035" elapsed="0.019906"/>
</kw>
<msg time="2026-05-01T00:52:09.132087" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:09.111538" elapsed="0.020590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.132758" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.132374" elapsed="0.000450"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.134181" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:09.134384" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:09.133797" elapsed="0.000623"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.135119" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:09.135254" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:09.134728" elapsed="0.000562"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.135474" elapsed="0.000322"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.136162" level="INFO">${sum_1} = 3744</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:09.135963" elapsed="0.000226"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:09.136556" level="INFO">${sum_2} = 3744</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:09.136346" elapsed="0.000238"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.136743" elapsed="0.000313"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:09.133215" elapsed="0.003906"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.143062" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.143231" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:09.143377" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.137765" elapsed="0.005653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.149142" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.143743" elapsed="0.005496"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.149577" elapsed="0.004757"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.160287" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.160487" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:09.160643" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.154751" elapsed="0.005927"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.163876" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.160914" elapsed="0.003014"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.164090" elapsed="0.002566"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:09.169849" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-05-01T00:52:09.166763" elapsed="0.003197"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.166730" elapsed="0.003269"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.170220" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:09.137429" elapsed="0.033040"/>
</kw>
<arg>route_eth_lacp_extesr</arg>
<status status="PASS" start="2026-05-01T00:52:09.007948" elapsed="0.162653"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:08.891871" elapsed="0.278897"/>
</test>
<test id="s1-s13-t27" name="Play_To_Odl_route_eth_lacp_extesr" line="128">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:09.174854" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:09.174581" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:09.176183" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:09.176067" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.176048" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:09.181566" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:09.181436" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.181417" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.182751" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:09.182261" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.183379" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:09.182997" elapsed="0.000415"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:09.183485" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:52:09.183687" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:09.181876" elapsed="0.001843"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:09.190925" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:09.190771" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.190744" elapsed="0.000308"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:09.192715" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:09.192520" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.192500" elapsed="0.000387"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:09.193519" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:09.193044" elapsed="0.000540"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:09.194347" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:09.193984" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:09.224906" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:09.196828" elapsed="0.028557"/>
</kw>
<msg time="2026-05-01T00:52:09.225888" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:09.226124" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:09.194879" elapsed="0.031470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:09.251522" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:09.230352" elapsed="0.021405"/>
</kw>
<msg time="2026-05-01T00:52:09.251971" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:09.252114" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:09.227555" elapsed="0.024667"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.253327" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:09.252727" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.252682" elapsed="0.000962"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.254837" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "e "s "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.253876" elapsed="0.001237"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.255714" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:09.255334" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.255312" elapsed="0.000579"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:09.255935" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:09.259837" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:52:09.260038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:09.259231" elapsed="0.000881"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.260331" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.260570" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:09.258365" elapsed="0.002429"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:09.256278" elapsed="0.004604"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:09.192031" elapsed="0.069031"/>
</kw>
<msg time="2026-05-01T00:52:09.261161" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:09.261206" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:09.191259" elapsed="0.069989"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:09.261443" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-05-01T00:52:09.261331" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.261309" elapsed="0.000256"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.262055" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.262542" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:09.262618" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:09.190203" elapsed="0.072531"/>
</kw>
<msg time="2026-05-01T00:52:09.262832" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:09.262877" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:09.184220" elapsed="0.078695"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.263255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:09.262994" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.262976" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:09.184025" elapsed="0.079332"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:09.183792" elapsed="0.079599"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:09.181070" elapsed="0.082396"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:09.175756" elapsed="0.087773"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:09.175287" elapsed="0.088288"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:09.172310" elapsed="0.091321"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.269217" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.269446" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:09.269628" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.264078" elapsed="0.005577"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:09.269851" elapsed="0.003247"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.279018" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.279185" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:09.279344" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:09.273272" elapsed="0.006112"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:09.284169" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.283699" elapsed="0.000513"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:09.284879" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:09.284470" elapsed="0.000450"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.285158" elapsed="0.000529"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:09.279776" elapsed="0.006005"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:09.263789" elapsed="0.022073"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:09.171794" elapsed="0.114132"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.287042" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.287290" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.286741" elapsed="0.000598"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.315722" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr.vanadium/route_eth_lacp_extesr.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:09.315290" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.316578" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr.vanadium/route_eth_lacp_extesr.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:09.316290" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr.vanadium/route_eth_lacp_extesr.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:09.316756" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:09.315931" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.317338" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:09.316951" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.317765" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/route_eth_lacp_extesr.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.317920" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.317622" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.318357" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "es-import-route-extended-community": {
                "es-import": "f2:0c:dd:80:9f:f8"
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.318111" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:09.318903" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:09.318510" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.319442" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:09.319144" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:09.318994" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:09.318482" elapsed="0.001165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.320258" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:09.319805" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:09.320340" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:52:09.320526" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:09.312927" elapsed="0.007627"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.320913" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/announce_route_eth_lacp_extesr.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/announce_route_eth_lacp_extesr.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.321041" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.320717" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:09.321417" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/withdraw_route_eth_lacp_extesr.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extesr/withdraw_route_eth_lacp_extesr.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:09.321554" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:09.321224" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.321983" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;es-import-route-extended-community&gt;
                &lt;es-import&gt;f2:0c:dd:80:9f:f8&lt;/es-import&gt;
            &lt;/es-import-route-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.321740" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.322431" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "es-import-route-extended-community": {
                "es-import": "f2:0c:dd:80:9f:f8"
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.322195" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.322965" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.322724" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:09.323402" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:09.323163" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:09.323617" elapsed="0.002568"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:09.326350" elapsed="0.001846"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:09.334401" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:09.334639" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:09.334783" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:09.329192" elapsed="0.006114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.335598" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:09.335934" elapsed="0.000034"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:09.328854" elapsed="0.007256">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:11.346672" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:11.347001" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '530'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:11.347307" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:11.337924" elapsed="0.009449"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:11.348410" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": true,
              "es-import-route-extended-community": {
                "es-import": "f2:0c:dd:80:9f:f8"
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:11.351625" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:11.347836" elapsed="0.003930"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:11.356362" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "es-import-route-extended-community": {
        "es-import": "f2:0c:dd:80:9f:f...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:11.355648" elapsed="0.000755"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:11.357301" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "es-import-route-extended-community": {
        "es-import": "f2:0c:dd:80:9f:f...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:11.356648" elapsed="0.000692"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:11.357581" elapsed="0.000458"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:11.352087" elapsed="0.006038"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:11.336910" elapsed="0.021291"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:09.328375" elapsed="2.029890"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:11.358507" elapsed="0.002563"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:11.366395" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:11.366532" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:11.366626" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:11.362000" elapsed="0.004651"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:11.366815" elapsed="0.003308"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:11.375664" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:11.376384" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '678'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"es-import-route-extended-community":{"es-import":"f2:0c:dd:80:9f:f8"},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:11.376556" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:11.370354" elapsed="0.006239"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:11.380863" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:11.380448" elapsed="0.000455"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:11.381869" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:11.381122" elapsed="0.000787"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:11.382586" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "es-import-route-extended-community": {
          "es-import": "f2:0c:dd:80:9f:f8"
         },
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:11.382974" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "es-import-route-extended-community": {
+          "es-import": "f2:0c:dd:80:9f:f8"
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:11.382129" elapsed="0.000952">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "es-import-route-extended-community": {
+          "es-import": "f2:0c:dd:80:9f:f8"
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:11.376909" elapsed="0.006425">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "es-import-route-extended-community": {
+          "es-import": "f2:0c:dd:80:9f:f8"
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:11.361727" elapsed="0.021838">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "es-import-route-extended-community": {
+          "es-import": "f2:0c:dd:80:9f:f8"
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.424571" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.424948" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.425199" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.385502" elapsed="0.039756"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.425714" elapsed="0.005273"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.437509" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.437675" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:13.437825" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.431228" elapsed="0.006634"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.442487" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.442001" elapsed="0.000528"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.443137" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.442751" elapsed="0.000426"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.443399" elapsed="0.000542"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.438319" elapsed="0.005726"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.384500" elapsed="0.059625"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:11.361270" elapsed="2.082913"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:13.444997" elapsed="0.002658"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.457699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.457862" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.458013" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.452160" elapsed="0.005891"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.458298" elapsed="0.003873"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.468068" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.468223" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:13.468373" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.462417" elapsed="0.005995"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.473119" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.472694" elapsed="0.000466"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.473814" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.473393" elapsed="0.000466"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.474094" elapsed="0.000500"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.468780" elapsed="0.005906"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.448678" elapsed="0.026087"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:13.447996" elapsed="0.026826"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:13.444479" elapsed="0.030421"/>
</kw>
<arg>route_eth_lacp_extesr</arg>
<status status="PASS" start="2026-05-01T00:52:09.286257" elapsed="4.188858"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:09.171242" elapsed="4.304055"/>
</test>
<test id="s1-s13-t28" name="Odl_To_Play_route_eth_lacp_extl2" line="131">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:13.484257" elapsed="0.000366"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:13.483819" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.486337" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.486122" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.486079" elapsed="0.000402"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.492270" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.492159" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.492140" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.493483" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:13.493043" elapsed="0.000474"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.493989" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:13.493687" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:13.494061" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:52:13.494241" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:13.492614" elapsed="0.001653"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.500371" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.500259" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.500240" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.501965" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.501780" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.501761" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:13.502739" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:13.502290" elapsed="0.000512"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.503438" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:13.503161" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.536157" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:13.505493" elapsed="0.030819"/>
</kw>
<msg time="2026-05-01T00:52:13.536537" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:13.536640" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.503828" elapsed="0.032895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.565979" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "l "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:13.538754" elapsed="0.027418"/>
</kw>
<msg time="2026-05-01T00:52:13.566348" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:13.566442" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.537154" elapsed="0.029390"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.567368" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.566896" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.566852" elapsed="0.000729"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.568436" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "l "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.567747" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.569247" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.568859" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.568837" elapsed="0.000596"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:13.569496" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:13.574111" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:52:13.574313" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:13.572944" elapsed="0.001447"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.574779" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.575001" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:13.572063" elapsed="0.003159"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:13.569912" elapsed="0.005404"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:13.501298" elapsed="0.074221"/>
</kw>
<msg time="2026-05-01T00:52:13.575623" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:13.575669" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.500623" elapsed="0.075084"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:13.575914" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-05-01T00:52:13.575793" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.575773" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.576615" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.577073" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.577148" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:13.499882" elapsed="0.077387"/>
</kw>
<msg time="2026-05-01T00:52:13.577375" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:13.577419" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.494719" elapsed="0.082775"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.577841" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.577576" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.577558" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:13.494561" elapsed="0.083389"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:13.494335" elapsed="0.083659"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:13.491768" elapsed="0.086296"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:13.485645" elapsed="0.092482"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.484958" elapsed="0.093219"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:13.480228" elapsed="0.098009"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.584489" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.584684" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.584809" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.578718" elapsed="0.006118"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.585007" elapsed="0.003071"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.595509" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.595662" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:13.595808" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.588247" elapsed="0.007598"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.600296" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.599802" elapsed="0.000535"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.600974" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.600583" elapsed="0.000430"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.601239" elapsed="0.000481"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.596197" elapsed="0.005610"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.578400" elapsed="0.023484"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:13.478608" elapsed="0.123336"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.603052" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.603303" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.602768" elapsed="0.000575"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.603859" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.604051" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.603592" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.604609" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/announce_route_eth_lacp_extl2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/announce_route_eth_lacp_extl2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.604785" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.604313" elapsed="0.000509"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:13.605342" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:13.605045" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.605946" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/withdraw_route_eth_lacp_extl2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/withdraw_route_eth_lacp_extl2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.606131" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.605677" elapsed="0.000491"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:13.606690" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:13.606388" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.607299" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;false&lt;/transitive&gt;
            &lt;layer-2-attributes-extended-community&gt;
                &lt;primary-pe&gt;true&lt;/primary-pe&gt;
                &lt;backup-pe&gt;true&lt;/backup-pe&gt;
                &lt;control-word&gt;true&lt;/control-word&gt;
                &lt;l2-mtu&gt;200&lt;/l2-mtu&gt;
            &lt;/layer-2-attributes-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.606951" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.608009" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": false,
              "layer-2-attributes-extended-community": {
                "control-word": true,
                "backup-pe": true,
                "primary-pe": true,
                "l2-mtu": 200
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.607636" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.608666" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.608303" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.609276" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.608945" elapsed="0.000393"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:13.609573" elapsed="0.002820"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.625854" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1282', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;false&lt;/transitive&gt;
            &lt;layer-2-attributes-extended-community&gt;
                &lt;primary-pe&gt;true&lt;/primary-pe&gt;
                &lt;backup-pe&gt;true&lt;/backup-pe&gt;
                &lt;control-word&gt;true&lt;/control-word&gt;
                &lt;l2-mtu&gt;200&lt;/l2-mtu&gt;
            &lt;/layer-2-attributes-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:13.625952" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.626128" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.612857" elapsed="0.013308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.630162" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.626415" elapsed="0.003809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.637537" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.638209" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '570'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:13.638393" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.630478" elapsed="0.007959"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.642224" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.638724" elapsed="0.003573"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.649309" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.649941" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '570'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:13.650080" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.643700" elapsed="0.006416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.653793" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.650354" elapsed="0.003510"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.654081" elapsed="0.003663"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.660095" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.657972" elapsed="0.002161"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.660325" elapsed="0.002266"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:13.662687" elapsed="0.000042"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:13.643217" elapsed="0.019618"/>
</kw>
<msg time="2026-05-01T00:52:13.662916" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:13.642567" elapsed="0.020375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.663367" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.663115" elapsed="0.000297"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.664378" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:13.664475" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:13.664107" elapsed="0.000394"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.664969" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:13.665046" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:13.664685" elapsed="0.000384"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.665228" elapsed="0.000351"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.665965" level="INFO">${sum_1} = 3454</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:13.665767" elapsed="0.000224"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.666333" level="INFO">${sum_2} = 3454</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:13.666148" elapsed="0.000211"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.666533" elapsed="0.000329"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:13.663695" elapsed="0.003232"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:13.667083" elapsed="0.001761"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.674723" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.674848" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '570'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:13.674945" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.669390" elapsed="0.005581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.678444" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.675147" elapsed="0.003391"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.678762" elapsed="0.003561"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.687904" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.688059" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '570'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:13.688210" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.682587" elapsed="0.005651"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.690864" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.688427" elapsed="0.002488"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.691072" elapsed="0.003008"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:13.697602" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.694197" elapsed="0.003472"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.694164" elapsed="0.003538"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.704680" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.704730" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.704836" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.697917" elapsed="0.006947"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:13.669107" elapsed="0.035825"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.710510" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.710665" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.710817" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.705930" elapsed="0.004934"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.714584" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.711108" elapsed="0.003557"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.714888" elapsed="0.003587"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.720936" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.718710" elapsed="0.002256"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.721147" elapsed="0.002152"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:13.723353" elapsed="0.000041"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:13.705587" elapsed="0.017931"/>
</kw>
<msg time="2026-05-01T00:52:13.723602" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:13.705102" elapsed="0.018525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.724094" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.723798" elapsed="0.000352"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.725156" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:13.725234" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:13.724813" elapsed="0.000445"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.725692" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:13.725767" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:13.725419" elapsed="0.000372"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.725950" elapsed="0.000330"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.726661" level="INFO">${sum_1} = 3007</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:13.726446" elapsed="0.000241"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:13.727025" level="INFO">${sum_2} = 3007</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:13.726843" elapsed="0.000207"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.727206" elapsed="0.000322"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:13.724411" elapsed="0.003181"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.733827" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.734006" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.734133" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.728341" elapsed="0.005820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.738188" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.734394" elapsed="0.003868"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.738529" elapsed="0.003879"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.747711" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.747864" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.747987" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.742693" elapsed="0.005350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.750815" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.748228" elapsed="0.002637"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.751026" elapsed="0.002595"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:13.756153" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-05-01T00:52:13.753733" elapsed="0.002516"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.753697" elapsed="0.002581"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.756493" elapsed="0.000040"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:13.727928" elapsed="0.028814"/>
</kw>
<arg>route_eth_lacp_extl2</arg>
<status status="PASS" start="2026-05-01T00:52:13.602324" elapsed="0.154493"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.477186" elapsed="0.279809"/>
</test>
<test id="s1-s13-t29" name="Play_To_Odl_route_eth_lacp_extl2" line="133">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:13.762627" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:13.762222" elapsed="0.000783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.764502" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.764339" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.764312" elapsed="0.000261"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.770647" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.770516" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.770490" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.771922" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:13.771471" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.772560" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:13.772147" elapsed="0.000441"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:13.772635" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:52:13.772805" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:13.771021" elapsed="0.001809"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.778857" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.778746" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.778727" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.780430" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:13.780246" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.780228" elapsed="0.000392"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:13.781193" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:13.780775" elapsed="0.000479"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.781909" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:13.781627" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.813308" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:13.783839" elapsed="0.029664"/>
</kw>
<msg time="2026-05-01T00:52:13.813663" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:13.813757" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.782282" elapsed="0.031545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:13.846495" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "l "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:13.815898" elapsed="0.030860"/>
</kw>
<msg time="2026-05-01T00:52:13.846982" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:13.847079" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.814254" elapsed="0.032899"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.848163" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.847557" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.847500" elapsed="0.000882"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.849398" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "l "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.848576" elapsed="0.000962"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.850072" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.849716" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.849695" elapsed="0.000576"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:13.850332" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:13.854796" elapsed="0.000206"/>
</kw>
<msg time="2026-05-01T00:52:13.855064" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:13.854100" elapsed="0.001077"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.855510" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.855818" elapsed="0.000031"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:13.852977" elapsed="0.003205"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:13.850727" elapsed="0.005585"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:13.779764" elapsed="0.076840"/>
</kw>
<msg time="2026-05-01T00:52:13.856706" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:13.856752" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.779085" elapsed="0.077704"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:13.856979" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:52:13.856868" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.856849" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.857572" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.858017" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:13.858091" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:13.778378" elapsed="0.079831"/>
</kw>
<msg time="2026-05-01T00:52:13.858307" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:13.858351" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.773261" elapsed="0.085129"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.858897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.858633" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.858612" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:13.773107" elapsed="0.085894"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:13.772898" elapsed="0.086142"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:13.770026" elapsed="0.089079"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:13.763875" elapsed="0.095290"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:13.763223" elapsed="0.095991"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:13.758847" elapsed="0.100425"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.867531" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.867793" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.867936" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.859749" elapsed="0.008225"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:13.868260" elapsed="0.004436"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.879581" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.879739" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:13.879890" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:13.872948" elapsed="0.006981"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.884712" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.883932" elapsed="0.000836"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:13.885504" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:13.885050" elapsed="0.000497"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.885786" elapsed="0.000498"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:13.880339" elapsed="0.006036"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.859444" elapsed="0.027041"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:13.758073" elapsed="0.128478"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.887637" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.887892" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.887316" elapsed="0.000619"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.915586" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2.vanadium/route_eth_lacp_extl2.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:13.915134" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.916473" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2.vanadium/route_eth_lacp_extl2.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:13.916173" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2.vanadium/route_eth_lacp_extl2.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:13.916655" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:13.915792" elapsed="0.000888"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.917233" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:13.916849" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.917630" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/route_eth_lacp_extl2.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.917761" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.917491" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.918192" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": false,
              "layer-2-attributes-extended-community": {
                "control-word": true,
                "backup-pe": true,
                "primary-pe": true,
                "l2-mtu": 200
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.917949" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:13.918665" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:13.918321" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.919193" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:13.918902" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.918752" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:13.918297" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.919927" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:13.919427" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:13.920007" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:52:13.920229" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:13.912800" elapsed="0.007460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.920655" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/announce_route_eth_lacp_extl2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/announce_route_eth_lacp_extl2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.920786" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.920436" elapsed="0.000393"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:13.921217" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/withdraw_route_eth_lacp_extl2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extl2/withdraw_route_eth_lacp_extl2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:13.921366" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:13.921019" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.921815" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;false&lt;/transitive&gt;
            &lt;layer-2-attributes-extended-community&gt;
                &lt;primary-pe&gt;true&lt;/primary-pe&gt;
                &lt;backup-pe&gt;true&lt;/backup-pe&gt;
                &lt;control-word&gt;true&lt;/control-word&gt;
                &lt;l2-mtu&gt;200&lt;/l2-mtu&gt;
            &lt;/layer-2-attributes-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.921570" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.922315" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": false,
              "layer-2-attributes-extended-community": {
                "control-word": true,
                "backup-pe": true,
                "primary-pe": true,
                "l2-mtu": 200
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.922073" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.922782" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.922543" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:13.923212" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:13.922978" elapsed="0.000287"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:13.923418" elapsed="0.002933"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:13.927043" elapsed="0.001596"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:13.936270" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:13.936507" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:13.936661" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:13.930077" elapsed="0.007137">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.937516" elapsed="0.000035"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:13.937867" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:13.929589" elapsed="0.008465">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:15.949285" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:15.949743" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '570'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:15.949991" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:15.940253" elapsed="0.009798"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:15.951385" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "transitive": false,
              "layer-2-attributes-extended-community": {
                "control-word": true,
                "backup-pe": true,
                "primary-pe": true,
                "l2-mtu": 200
              }
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:15.955446" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:15.950491" elapsed="0.005049"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:15.960390" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "layer-2-attributes-extended-community": {
        "backup-pe": true,
        ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:15.959615" elapsed="0.000816"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:15.961586" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "layer-2-attributes-extended-community": {
        "backup-pe": true,
        ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:15.960682" elapsed="0.000942"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:15.961791" elapsed="0.000335"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:15.955862" elapsed="0.006329"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:15.939177" elapsed="0.023067"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:13.928928" elapsed="2.033364"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:15.962467" elapsed="0.002342"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:15.971201" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:15.971358" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:15.971529" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:15.965768" elapsed="0.005802"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:15.971806" elapsed="0.003937"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:15.981402" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:15.981970" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '718'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"layer-2-attributes-extended-community":{"primary-pe":true,"control-word":true,"l2-mtu":200,"backup-pe":true},"transitive":false}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:15.982121" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:15.975978" elapsed="0.006171"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:15.985477" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:15.985164" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:15.986236" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:15.985664" elapsed="0.000601"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:15.986789" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "layer-2-attributes-extended-community": {
          "backup-pe": true,
          "control-word": true,
          "l2-mtu": 200,
          "primary-pe": true
         },
         "transitive": false
        }
       ],
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:15.987052" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,47 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "layer-2-attributes-extended-community": {
+          "backup-pe": true,
+          "control-word": true,
+          "l2-mtu": 200,
+          "primary-pe": true
+         },
+         "transitive": false
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:15.986424" elapsed="0.000716">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,47 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "layer-2-attributes-extended-community": {
+          "backup-pe": true,
+          "control-word": true,
+          "l2-mtu": 200,
+          "primary-pe": true
+         },
+         "transitive": false
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:15.982380" elapsed="0.004932">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,47 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "layer-2-attributes-extended-community": {
+          "backup-pe": true,
+          "control-word": true,
+          "l2-mtu": 200,
+          "primary-pe": true
+         },
+         "transitive": false
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:15.965434" elapsed="0.022044">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,47 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "layer-2-attributes-extended-community": {
+          "backup-pe": true,
+          "control-word": true,
+          "l2-mtu": 200,
+          "primary-pe": true
+         },
+         "transitive": false
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:17.996287" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:17.996890" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:17.997120" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:17.988914" elapsed="0.008264"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:17.997643" elapsed="0.005528"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.009047" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.009206" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:18.009357" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.003420" elapsed="0.005976"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.014098" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.013651" elapsed="0.000488"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.014787" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.014369" elapsed="0.000458"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.015059" elapsed="0.000508"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.009826" elapsed="0.005832"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:17.988103" elapsed="0.027633"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:15.965006" elapsed="2.050790"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:18.016606" elapsed="0.002523"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.024874" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.024987" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.025092" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.020338" elapsed="0.004781"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.025285" elapsed="0.002626"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.032788" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.032955" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:18.033188" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.028078" elapsed="0.005151"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.038072" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.037607" elapsed="0.000510"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.038790" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.038352" elapsed="0.000555"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.039152" elapsed="0.000546"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.033636" elapsed="0.006159"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.019811" elapsed="0.020068"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:18.019325" elapsed="0.020614"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:18.016069" elapsed="0.023956"/>
</kw>
<arg>route_eth_lacp_extl2</arg>
<status status="PASS" start="2026-05-01T00:52:13.886875" elapsed="4.153224"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:13.757360" elapsed="4.282903"/>
</test>
<test id="s1-s13-t30" name="Odl_To_Play_route_eth_lacp_extmac" line="136">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:18.046029" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:18.045636" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.047544" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.047388" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.047362" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.052800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.052693" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.052675" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.053909" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:18.053521" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.054393" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:18.054100" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:18.054478" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:52:18.054666" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:18.053101" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.060318" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.060209" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.060191" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.061931" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.061742" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.061722" elapsed="0.000379"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:18.062700" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:18.062256" elapsed="0.000508"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.063400" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:18.063121" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.097110" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:18.065377" elapsed="0.031880"/>
</kw>
<msg time="2026-05-01T00:52:18.097403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:18.097564" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.063802" elapsed="0.033979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.126635" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:18.099809" elapsed="0.026962"/>
</kw>
<msg time="2026-05-01T00:52:18.126903" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:18.126997" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.098211" elapsed="0.028858"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.127788" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.127381" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.127356" elapsed="0.000611"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.128718" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.128119" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.129372" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.129019" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.128999" elapsed="0.000579"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:18.129618" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:18.133139" elapsed="0.001868"/>
</kw>
<msg time="2026-05-01T00:52:18.135062" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:18.132665" elapsed="0.002468"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.135379" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.135634" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:18.131884" elapsed="0.003975"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:18.129922" elapsed="0.006024"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:18.061224" elapsed="0.074902"/>
</kw>
<msg time="2026-05-01T00:52:18.136220" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:18.136264" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.060580" elapsed="0.075722"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:18.136510" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:52:18.136380" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.136361" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.137074" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.137587" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.137664" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:18.059870" elapsed="0.077903"/>
</kw>
<msg time="2026-05-01T00:52:18.137864" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:18.137908" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.055098" elapsed="0.082846"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.138272" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.138018" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.138001" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:18.054949" elapsed="0.083471"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:18.054759" elapsed="0.083691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:18.052318" elapsed="0.086204"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:18.047082" elapsed="0.091494"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.046630" elapsed="0.091989"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:18.042306" elapsed="0.096363"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.144371" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.144525" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.144635" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.139096" elapsed="0.005567"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.144831" elapsed="0.002828"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.152773" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.152930" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:18.153079" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.147827" elapsed="0.005292"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.157817" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.157331" elapsed="0.000529"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.158518" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.158096" elapsed="0.000464"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.158796" elapsed="0.000482"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.153514" elapsed="0.005855"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.138817" elapsed="0.020653"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:18.041404" elapsed="0.118129"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.160703" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.160948" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.160349" elapsed="0.000686"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.161597" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.161785" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.161276" elapsed="0.000548"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.162337" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/announce_route_eth_lacp_extmac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/announce_route_eth_lacp_extmac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.162540" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.162057" elapsed="0.000522"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:18.163118" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:18.162814" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.163694" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/withdraw_route_eth_lacp_extmac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/withdraw_route_eth_lacp_extmac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.163876" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.163391" elapsed="0.000524"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:18.164440" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:18.164147" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.165099" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;mac-mobility-extended-community&gt;
                &lt;static&gt;true&lt;/static&gt;
                &lt;seq-number&gt;200&lt;/seq-number&gt;
            &lt;/mac-mobility-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.164737" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.165827" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "mac-mobility-extended-community": {
                "seq-number": 200,
                "static": true
              },
              "transitive": true
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.165414" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.166502" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.166132" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.166981" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.166747" elapsed="0.000278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:18.167173" elapsed="0.043461"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.225365" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1175', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;mac-mobility-extended-community&gt;
                &lt;static&gt;true&lt;/static&gt;
                &lt;seq-number&gt;200&lt;/seq-number&gt;
            &lt;/mac-mobility-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:18.225703" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQHyDN2An%2FcAFgAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.225954" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.210893" elapsed="0.015120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.231568" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.226406" elapsed="0.005229"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.237706" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.238355" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '526'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:18.238535" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.231875" elapsed="0.006702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.242551" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.238836" elapsed="0.003793"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.249951" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.250385" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '526'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:18.250531" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.244087" elapsed="0.006479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.253139" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.250744" elapsed="0.002445"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.253348" elapsed="0.002537"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.258265" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.256050" elapsed="0.002282"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.258596" elapsed="0.003214"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:18.261929" elapsed="0.000060"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:18.243579" elapsed="0.018564"/>
</kw>
<msg time="2026-05-01T00:52:18.262261" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:18.242886" elapsed="0.019413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.262955" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.262590" elapsed="0.000431"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.264313" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:18.264423" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:18.263930" elapsed="0.000552"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.265091" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:52:18.265201" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:18.264717" elapsed="0.000519"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.265487" elapsed="0.000486"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.266502" level="INFO">${sum_1} = 3380</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:18.266208" elapsed="0.000335"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.266903" level="INFO">${sum_2} = 3380</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:18.266719" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.267082" elapsed="0.000303"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:18.263362" elapsed="0.004083"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:18.267612" elapsed="0.001693"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.275628" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.275817" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '526'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:18.275972" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.270011" elapsed="0.005999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.279916" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.276265" elapsed="0.003726"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.280224" elapsed="0.003763"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.289314" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.289508" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '526'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:18.289780" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.284232" elapsed="0.005589"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.293740" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.290079" elapsed="0.003736"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.294036" elapsed="0.003708"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:18.301288" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.297862" elapsed="0.003490"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.297831" elapsed="0.003553"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.308054" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.308100" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.308198" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.301675" elapsed="0.006550"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:18.269580" elapsed="0.038712"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.313779" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.313937" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.314073" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.309251" elapsed="0.004861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.318020" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.314364" elapsed="0.003727"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.318320" elapsed="0.003815"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.324710" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.322376" elapsed="0.002402"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.325011" elapsed="0.003382"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:18.328484" elapsed="0.000048"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:18.308922" elapsed="0.019755"/>
</kw>
<msg time="2026-05-01T00:52:18.328799" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:18.308479" elapsed="0.020356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.329409" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.329067" elapsed="0.000428"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.330776" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:18.330947" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:18.330339" elapsed="0.000643"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.331589" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:52:18.331698" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:18.331204" elapsed="0.000528"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.331951" elapsed="0.000423"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.332873" level="INFO">${sum_1} = 2933</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:18.332616" elapsed="0.000292"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:18.333368" level="INFO">${sum_2} = 2933</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:18.333120" elapsed="0.000283"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.333676" elapsed="0.000426"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:18.329835" elapsed="0.004351"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.340095" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.340202" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.340293" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.334890" elapsed="0.005428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.343445" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.340507" elapsed="0.003031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.343760" elapsed="0.003518"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.352814" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.352923" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.353026" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.347524" elapsed="0.005528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.355673" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.353222" elapsed="0.002499"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.355875" elapsed="0.002506"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:18.360780" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:52:18.358473" elapsed="0.002369"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.358439" elapsed="0.002428"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.361019" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:18.334559" elapsed="0.026599"/>
</kw>
<arg>route_eth_lacp_extmac</arg>
<status status="PASS" start="2026-05-01T00:52:18.159908" elapsed="0.201296"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.040662" elapsed="0.320654"/>
</test>
<test id="s1-s13-t31" name="Play_To_Odl_route_eth_lacp_extmac" line="138">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:18.366092" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:18.365720" elapsed="0.000757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.367880" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.367725" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.367699" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.373785" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.373677" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.373660" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.374939" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:18.374547" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.375439" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:18.375135" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:18.375530" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:52:18.375691" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:18.374135" elapsed="0.001582"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.381488" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.381365" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.381346" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.383017" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:18.382833" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.382815" elapsed="0.000365"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:18.383763" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:18.383331" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.384434" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:18.384169" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.415720" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:18.386481" elapsed="0.029372"/>
</kw>
<msg time="2026-05-01T00:52:18.415991" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:18.416087" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.384828" elapsed="0.031330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:18.446424" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:18.418151" elapsed="0.028415"/>
</kw>
<msg time="2026-05-01T00:52:18.446697" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:18.446790" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.416581" elapsed="0.030279"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.447539" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.447160" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.447138" elapsed="0.000578"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.448431" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "c "p "_ "e "x "t "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.447869" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.449136" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.448786" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.448766" elapsed="0.000543"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:18.449347" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:18.452867" elapsed="0.000137"/>
</kw>
<msg time="2026-05-01T00:52:18.453047" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:18.452341" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.453328" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.453561" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:18.451597" elapsed="0.002196"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:18.449657" elapsed="0.004222"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:18.382372" elapsed="0.071680"/>
</kw>
<msg time="2026-05-01T00:52:18.454144" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:18.454187" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.381725" elapsed="0.072498"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:18.454407" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:52:18.454299" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.454281" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.454970" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.455393" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:18.455483" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:18.381023" elapsed="0.074571"/>
</kw>
<msg time="2026-05-01T00:52:18.455687" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:18.455731" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.376103" elapsed="0.079662"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.456092" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.455841" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.455824" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:18.375955" elapsed="0.080237"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:18.375774" elapsed="0.080450"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:18.373289" elapsed="0.082990"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:18.367293" elapsed="0.089040"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:18.366692" elapsed="0.089684"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:18.362579" elapsed="0.093850"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.461663" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.461818" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.461915" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.456929" elapsed="0.005012"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:18.462109" elapsed="0.002564"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.470020" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.470167" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:18.470310" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:18.464840" elapsed="0.005508"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.474699" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.474266" elapsed="0.000473"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:18.475332" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:18.474959" elapsed="0.000412"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.475612" elapsed="0.000451"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:18.470697" elapsed="0.005454"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.456656" elapsed="0.019571"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:18.362082" elapsed="0.114201"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.477284" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.477540" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.477007" elapsed="0.000608"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.505735" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac.vanadium/route_eth_lacp_extmac.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:18.505336" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.506527" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac.vanadium/route_eth_lacp_extmac.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:18.506267" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac.vanadium/route_eth_lacp_extmac.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:18.506698" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:18.505930" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.507275" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:18.506889" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.507658" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/route_eth_lacp_extmac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.507785" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.507518" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.508218" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "mac-mobility-extended-community": {
                "seq-number": 200,
                "static": true
              },
              "transitive": true
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.507972" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:18.508655" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:18.508338" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.509180" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:18.508888" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.508740" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:18.508319" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.509904" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:18.509414" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:18.509984" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:52:18.510143" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:18.503073" elapsed="0.007096"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.510556" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/announce_route_eth_lacp_extmac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/announce_route_eth_lacp_extmac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.510690" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.510332" elapsed="0.000384"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:18.511065" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/withdraw_route_eth_lacp_extmac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lacp_extmac/withdraw_route_eth_lacp_extmac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:18.511185" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:18.510875" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.511633" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;mac-mobility-extended-community&gt;
                &lt;static&gt;true&lt;/static&gt;
                &lt;seq-number&gt;200&lt;/seq-number&gt;
            &lt;/mac-mobility-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.511369" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.512092" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "mac-mobility-extended-community": {
                "seq-number": 200,
                "static": true
              },
              "transitive": true
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.511848" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.512589" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.512328" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:18.513254" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:18.512788" elapsed="0.000513"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:18.513471" elapsed="0.002320"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:18.515950" elapsed="0.001731"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:18.524916" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:18.525069" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:18.525200" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:18.518651" elapsed="0.007124">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.526040" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:18.526364" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:18.518291" elapsed="0.008270">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:20.536051" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:20.536269" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '526'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:20.536420" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:20.528291" elapsed="0.008198"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:20.537168" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "extended-communities": [
            {
              "mac-mobility-extended-community": {
                "seq-number": 200,
                "static": true
              },
              "transitive": true
            }
          ],
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:20.540474" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:20.536760" elapsed="0.003911"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:20.545313" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "mac-mobility-extended-community": {
        "seq-number": 200,
        "stati...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:20.544571" elapsed="0.000783"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:20.546294" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "mac-mobility-extended-community": {
        "seq-number": 200,
        "stati...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:20.545598" elapsed="0.000737"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:20.546579" elapsed="0.000466"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:20.541001" elapsed="0.006132"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:20.527268" elapsed="0.019940"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:18.517873" elapsed="2.029400"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:20.547517" elapsed="0.002437"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:20.555822" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:20.555935" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:20.556041" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:20.550921" elapsed="0.005147"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:20.556236" elapsed="0.002761"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:20.564443" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:20.565185" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '674'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"extended-communities":[{"mac-mobility-extended-community":{"seq-number":200,"static":true},"transitive":true}],"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:20.565336" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:20.559230" elapsed="0.006143"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:20.569701" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:20.569281" elapsed="0.000460"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:20.570758" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:20.569959" elapsed="0.000839"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:20.571476" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "mac-mobility-extended-community": {
          "seq-number": 200,
          "static": true
         },
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:20.571885" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "mac-mobility-extended-community": {
+          "seq-number": 200,
+          "static": true
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:20.571018" elapsed="0.000980">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "mac-mobility-extended-community": {
+          "seq-number": 200,
+          "static": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:20.565715" elapsed="0.006515">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "mac-mobility-extended-community": {
+          "seq-number": 200,
+          "static": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:20.550642" elapsed="0.021795">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,45 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "mac-mobility-extended-community": {
+          "seq-number": 200,
+          "static": true
+         },
+         "transitive": true
+        }
+       ],
    [ Message content over the limit has been removed. ]
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQHyDN2An/cAFgAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.581996" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.582185" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.582331" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.573897" elapsed="0.008471"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.582644" elapsed="0.003620"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.591847" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.591997" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:22.592138" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.586519" elapsed="0.005656"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.596629" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.596170" elapsed="0.000499"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.597282" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.596892" elapsed="0.000429"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.597566" elapsed="0.000458"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.592616" elapsed="0.005495"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.573076" elapsed="0.025111"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:20.550154" elapsed="2.048088"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:22.599019" elapsed="0.002690"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.607687" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.607842" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.607987" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.603032" elapsed="0.004992"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.608282" elapsed="0.003550"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.617633" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.617780" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:22.617922" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.612064" elapsed="0.005896"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.622448" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.622058" elapsed="0.000451"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.623099" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.622730" elapsed="0.000409"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.623362" elapsed="0.000478"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.618275" elapsed="0.005650"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.602605" elapsed="0.021414"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:22.601987" elapsed="0.022089"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:22.598526" elapsed="0.025627"/>
</kw>
<arg>route_eth_lacp_extmac</arg>
<status status="PASS" start="2026-05-01T00:52:18.476595" elapsed="4.147670"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:18.361570" elapsed="4.262847"/>
</test>
<test id="s1-s13-t32" name="Odl_To_Play_route_eth_lan" line="141">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:22.629237" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:22.628970" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.630550" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.630414" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.630391" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.635807" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.635686" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.635668" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.636893" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:22.636508" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.637375" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:22.637083" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:22.637447" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:52:22.637629" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:22.636113" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.643188" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.643080" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.643062" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.644719" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.644532" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.644514" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:22.645446" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:22.645035" elapsed="0.000491"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.646136" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:22.645871" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.678044" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:22.648081" elapsed="0.030105"/>
</kw>
<msg time="2026-05-01T00:52:22.678322" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:22.678418" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.646522" elapsed="0.031990"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.705541" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:22.680480" elapsed="0.025191"/>
</kw>
<msg time="2026-05-01T00:52:22.705802" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:22.705897" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.678919" elapsed="0.027048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.706644" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.706268" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.706246" elapsed="0.000596"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.707586" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.706993" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.708267" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.707915" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.707895" elapsed="0.000546"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:22.708496" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:22.711998" elapsed="0.000272"/>
</kw>
<msg time="2026-05-01T00:52:22.712314" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:22.711529" elapsed="0.000852"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.712616" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.712834" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:22.710771" elapsed="0.002284"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:22.708767" elapsed="0.004374"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:22.644074" elapsed="0.069245"/>
</kw>
<msg time="2026-05-01T00:52:22.713412" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:22.713471" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.643412" elapsed="0.070097"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:22.713695" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:22.713587" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.713568" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.714239" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.714763" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.714838" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:22.642742" elapsed="0.072207"/>
</kw>
<msg time="2026-05-01T00:52:22.715041" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:22.715084" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.638034" elapsed="0.077086"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.715467" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.715196" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.715179" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:22.637888" elapsed="0.077682"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:22.637711" elapsed="0.077890"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:22.635310" elapsed="0.080346"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:22.630117" elapsed="0.085595"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.629672" elapsed="0.086084"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:22.625965" elapsed="0.089846"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.721741" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.721904" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.722010" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.716231" elapsed="0.005805"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.722201" elapsed="0.002618"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.729330" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.729510" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:22.729654" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.724982" elapsed="0.004709"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.733989" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.733581" elapsed="0.000448"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:22.734683" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.734250" elapsed="0.000471"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.734953" elapsed="0.000449"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.730017" elapsed="0.005493"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.715958" elapsed="0.019629"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:22.625288" elapsed="0.110355"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:22.736724" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:22.736936" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:22.736425" elapsed="0.000551"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:22.737480" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:22.737659" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:22.737197" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:22.738187" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/announce_route_eth_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/announce_route_eth_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:22.738389" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:22.737923" elapsed="0.000506"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:22.738971" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:22.738679" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:22.739574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/withdraw_route_eth_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/withdraw_route_eth_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:22.739752" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:22.739278" elapsed="0.000511"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:22.740296" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:22.740013" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.740930" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.740580" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.741584" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.741228" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.742205" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.741871" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.742859" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.742524" elapsed="0.000398"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:22.743131" elapsed="0.003479"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.756843" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '908', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:22.756933" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQLyDN2An%2FcAFAAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.757078" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.746873" elapsed="0.010242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.762093" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.757360" elapsed="0.004833"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.769163" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.769590" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '421'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:22.769699" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.762586" elapsed="0.007140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.772354" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.769924" elapsed="0.002479"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.778497" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.779009" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '421'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:22.779144" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.773357" elapsed="0.005822"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.782804" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.779415" elapsed="0.003456"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.783086" elapsed="0.003509"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.788970" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.786822" elapsed="0.002188"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.789257" elapsed="0.003018"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:22.792346" elapsed="0.000048"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:22.773029" elapsed="0.019531"/>
</kw>
<msg time="2026-05-01T00:52:22.792672" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:22.772588" elapsed="0.020120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.793285" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.792942" elapsed="0.000405"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.794606" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:22.794710" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:22.794224" elapsed="0.000519"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.795309" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:22.795411" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:22.794961" elapsed="0.000482"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.795682" elapsed="0.000422"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.796595" level="INFO">${sum_1} = 2934</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:22.796324" elapsed="0.000307"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.797155" level="INFO">${sum_2} = 2934</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:22.796902" elapsed="0.000290"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.797407" elapsed="0.000445"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:22.793710" elapsed="0.004202"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:22.798065" elapsed="0.001793"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.805130" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.805248" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '421'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:22.805341" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.800370" elapsed="0.004997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.808164" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.805581" elapsed="0.002632"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.808371" elapsed="0.002981"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.816764" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.816928" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '421'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:22.817073" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.811608" elapsed="0.005502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.821027" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.817547" elapsed="0.003549"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.821370" elapsed="0.003471"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:22.828159" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.824951" elapsed="0.003269"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.824923" elapsed="0.003329"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.835332" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.835408" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.835529" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.828481" elapsed="0.007077"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:22.800098" elapsed="0.035526"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.841126" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.841233" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.841325" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.836620" elapsed="0.004731"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.846646" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.841539" elapsed="0.005219"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.847104" elapsed="0.005682"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.855408" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.853164" elapsed="0.002275"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.855634" elapsed="0.002126"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:22.857812" elapsed="0.000032"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:22.836274" elapsed="0.021668"/>
</kw>
<msg time="2026-05-01T00:52:22.858021" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:22.835823" elapsed="0.022224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.858469" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.858212" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.859358" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:22.859432" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:22.859103" elapsed="0.000368"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.859885" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:22.859959" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:22.859631" elapsed="0.000353"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.860136" elapsed="0.000299"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.860796" level="INFO">${sum_1} = 2487</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:22.860618" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:22.861144" level="INFO">${sum_2} = 2487</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:22.860973" elapsed="0.000196"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.861322" elapsed="0.000316"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:22.858743" elapsed="0.002956"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.866844" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.866987" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.867080" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.862249" elapsed="0.004858"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.871052" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.867276" elapsed="0.003826"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.871258" elapsed="0.002969"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.879905" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.880059" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.880201" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.874473" elapsed="0.005765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.883911" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.880522" elapsed="0.003456"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.884197" elapsed="0.003553"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:22.891102" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:52:22.887862" elapsed="0.003326"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.887836" elapsed="0.003387"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.891433" elapsed="0.000050"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:22.861952" elapsed="0.029626"/>
</kw>
<arg>route_eth_lan</arg>
<status status="PASS" start="2026-05-01T00:52:22.736014" elapsed="0.155627"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.624716" elapsed="0.267075"/>
</test>
<test id="s1-s13-t33" name="Play_To_Odl_route_eth_lan" line="143">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:22.896787" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:22.896399" elapsed="0.000653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.898050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.897939" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.897921" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.903122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.903015" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.902997" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.904216" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:22.903822" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.904729" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:22.904406" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:22.904800" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:52:22.904960" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:22.903422" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.910895" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.910784" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.910765" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.912422" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:22.912240" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.912221" elapsed="0.000397"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:22.913191" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:22.912773" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.913898" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:22.913623" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.944970" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:22.915852" elapsed="0.029253"/>
</kw>
<msg time="2026-05-01T00:52:22.945242" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:22.945340" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.914272" elapsed="0.031141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:22.971243" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:22.947356" elapsed="0.024015"/>
</kw>
<msg time="2026-05-01T00:52:22.971526" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:22.971622" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.945840" elapsed="0.025852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.972353" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.971995" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.971973" elapsed="0.000574"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:22.973265" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:22.972700" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.973924" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.973573" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.973553" elapsed="0.000546"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:22.974137" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:22.977600" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:52:22.977788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:22.977125" elapsed="0.000728"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.978065" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.978292" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:22.976366" elapsed="0.002161"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:22.974412" elapsed="0.004201"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:22.911776" elapsed="0.067016"/>
</kw>
<msg time="2026-05-01T00:52:22.978887" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:22.978931" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.911124" elapsed="0.067851"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:22.979201" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:22.979091" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.979072" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.979769" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.980189" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:22.980262" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:22.910421" elapsed="0.069952"/>
</kw>
<msg time="2026-05-01T00:52:22.980549" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:22.980597" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.905409" elapsed="0.075224"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:22.980964" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:22.980710" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:22.980693" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:22.905262" elapsed="0.075803"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:22.905084" elapsed="0.076013"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:22.902653" elapsed="0.078499"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:22.897651" elapsed="0.083557"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:22.897206" elapsed="0.084046"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:22.893323" elapsed="0.087980"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.987846" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.987968" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:22.988064" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.981737" elapsed="0.006353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:22.988256" elapsed="0.002809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:22.995609" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:22.995758" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:22.995901" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:22.991231" elapsed="0.004709"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:23.000322" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:22.999906" elapsed="0.000456"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:23.000985" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:23.000606" elapsed="0.000417"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:23.001243" elapsed="0.000471"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:22.996304" elapsed="0.005495"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.981464" elapsed="0.020411"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:22.892677" elapsed="0.109252"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:23.002969" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:23.003168" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:23.002685" elapsed="0.000523"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.032132" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lan.vanadium/route_eth_lan.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:23.031757" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:23.032920" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan.vanadium/route_eth_lan.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:23.032679" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan.vanadium/route_eth_lan.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:23.033089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:23.032326" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.033683" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:23.033278" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:23.034004" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/route_eth_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:23.034130" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:23.033872" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.034584" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:23.034325" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:23.035008" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:23.034701" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.035555" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:23.035237" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:23.035090" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:23.034682" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.036225" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:23.035797" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:23.036336" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:52:23.036510" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:23.029433" elapsed="0.007105"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:23.036890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/announce_route_eth_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/announce_route_eth_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:23.037013" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:23.036699" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:23.037384" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/withdraw_route_eth_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_lan/withdraw_route_eth_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:23.037521" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:23.037197" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.037954" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:23.037709" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.038424" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:23.038186" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.038885" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:23.038650" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:23.039316" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:23.039081" elapsed="0.000278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:23.039523" elapsed="0.002291"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:23.041993" elapsed="0.001624"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:23.049285" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:23.049436" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:23.049590" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:23.044579" elapsed="0.005562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:23.050407" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:23.050756" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:23.044239" elapsed="0.006690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:25.061201" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:25.061405" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '421'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:25.061583" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:25.052673" elapsed="0.008949"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:25.062315" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:25.065618" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:25.061880" elapsed="0.003808"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:25.070376" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:25.069726" elapsed="0.000691"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:25.071163" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:25.070699" elapsed="0.000493"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:25.071351" elapsed="0.000349"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:25.066007" elapsed="0.005756"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:25.051687" elapsed="0.020129"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:23.043812" elapsed="2.028054"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:25.072026" elapsed="0.002727"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:25.084097" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:25.084257" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:25.084493" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:25.076820" elapsed="0.007712"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:25.084765" elapsed="0.003896"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:25.094809" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:25.095426" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '569'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:25.095600" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:25.088898" elapsed="0.006739"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:25.099943" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:25.099537" elapsed="0.000447"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:25.100894" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:25.100206" elapsed="0.000729"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:25.101628" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "lan-auto-generated": {
        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
        "root-bridge-priority": 20
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:25.101914" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:25.101160" elapsed="0.000858">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:25.095961" elapsed="0.006255">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:25.076175" elapsed="0.026314">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQLyDN2An/cAFAAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.111088" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.111364" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.111615" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.103672" elapsed="0.008001"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.112055" elapsed="0.005842"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.126039" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.126149" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:27.126255" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.118287" elapsed="0.007995"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.129444" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.129126" elapsed="0.000363"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.129923" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.129649" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.130112" elapsed="0.000332"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.126545" elapsed="0.003977"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.103025" elapsed="0.027554"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:25.075202" elapsed="2.055418"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:27.131159" elapsed="0.002406"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.141403" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.141660" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.141929" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.135245" elapsed="0.006724"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.142214" elapsed="0.003843"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.151373" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.151499" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:27.151604" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.146300" elapsed="0.005330"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.154778" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.154482" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.155238" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.154967" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.155424" elapsed="0.000343"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.151865" elapsed="0.003965"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.134494" elapsed="0.021390"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:27.133848" elapsed="0.022078"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:27.130810" elapsed="0.025175"/>
</kw>
<arg>route_eth_lan</arg>
<status status="PASS" start="2026-05-01T00:52:23.002222" elapsed="4.153811"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:22.892065" elapsed="4.264079"/>
</test>
<test id="s1-s13-t34" name="Odl_To_Play_route_eth_mac" line="146">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:27.159741" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:27.159471" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.161169" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.160996" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.160965" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.168796" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.168639" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.168611" elapsed="0.000287"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.170374" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:27.169817" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.171108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:27.170677" elapsed="0.000469"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:27.171210" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:52:27.171449" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:27.169239" elapsed="0.002267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.177755" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.177646" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.177627" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.179433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.179248" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.179230" elapsed="0.000392"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:27.180193" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:27.179776" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.180925" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:27.180650" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.210840" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:27.182886" elapsed="0.028110"/>
</kw>
<msg time="2026-05-01T00:52:27.211149" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:27.211245" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.181303" elapsed="0.030014"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.238702" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:27.213374" elapsed="0.025576"/>
</kw>
<msg time="2026-05-01T00:52:27.239143" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:27.239243" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.211776" elapsed="0.027538"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.240198" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.239686" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.239650" elapsed="0.000734"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.241221" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.240566" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.241894" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.241538" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.241517" elapsed="0.000555"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:27.242114" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:27.245799" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:52:27.245988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:27.245251" elapsed="0.000806"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.246271" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.246504" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:27.244483" elapsed="0.002239"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:27.242442" elapsed="0.004367"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:27.178803" elapsed="0.068189"/>
</kw>
<msg time="2026-05-01T00:52:27.247090" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:27.247135" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.177987" elapsed="0.069186"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:27.247360" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:27.247253" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.247233" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.248024" elapsed="0.000089"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.248545" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.248619" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:27.177288" elapsed="0.071443"/>
</kw>
<msg time="2026-05-01T00:52:27.248825" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:27.248870" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.172064" elapsed="0.076841"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.249237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.248983" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.248965" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:27.171849" elapsed="0.077488"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:27.171588" elapsed="0.077784"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:27.168076" elapsed="0.081353"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:27.160652" elapsed="0.088853"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.160159" elapsed="0.089392"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:27.157283" elapsed="0.092325"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.255608" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.255748" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.255866" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.250037" elapsed="0.005879"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.256103" elapsed="0.002605"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.262614" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.262763" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:27.262905" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.258873" elapsed="0.004069"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.267279" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.266864" elapsed="0.000455"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.267965" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.267562" elapsed="0.000503"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.268293" elapsed="0.000483"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.263263" elapsed="0.005600"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.249763" elapsed="0.019176"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:27.156816" elapsed="0.112181"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.270085" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.270346" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.269800" elapsed="0.000587"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.270899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.271077" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.270630" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.271622" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/announce_route_eth_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/announce_route_eth_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.271834" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.271335" elapsed="0.000538"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:27.272406" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:27.272114" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.272944" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/withdraw_route_eth_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/withdraw_route_eth_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.273069" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.272688" elapsed="0.000407"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:27.273448" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:27.273251" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.273904" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.273658" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.274352" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.274114" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.274847" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.274604" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.275285" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.275046" elapsed="0.000284"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:27.275498" elapsed="0.002491"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.288197" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '898', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:27.288286" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQPyDN2An%2FcAB9AAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.288417" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.278157" elapsed="0.010325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.292416" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.288730" elapsed="0.003766"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.298160" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.298786" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '417'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:27.298975" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.292718" elapsed="0.006301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.303246" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.299339" elapsed="0.003977"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.309917" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.310400" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '417'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:27.310623" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.304776" elapsed="0.005885"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.314265" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.310898" elapsed="0.003435"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.314571" elapsed="0.003548"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.320650" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.318345" elapsed="0.002346"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.320941" elapsed="0.003078"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:27.324094" elapsed="0.000053"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:27.304286" elapsed="0.020007"/>
</kw>
<msg time="2026-05-01T00:52:27.324405" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:27.303632" elapsed="0.020810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.325052" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.324700" elapsed="0.000416"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.326349" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:27.326479" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:27.325984" elapsed="0.000531"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.327088" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:27.327191" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:27.326736" elapsed="0.000488"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.327519" elapsed="0.000433"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.328296" level="INFO">${sum_1} = 3130</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:27.328113" elapsed="0.000208"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.328669" level="INFO">${sum_2} = 3130</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:27.328490" elapsed="0.000204"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.328847" elapsed="0.000305"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:27.325448" elapsed="0.003764"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:27.329362" elapsed="0.001838"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.337228" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.337417" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '417'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:27.337594" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.331778" elapsed="0.005855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.344233" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.337885" elapsed="0.006486"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.344677" elapsed="0.003926"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.353699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.353835" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '417'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:27.353965" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.348880" elapsed="0.005113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.356984" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.354211" elapsed="0.002825"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.357200" elapsed="0.002599"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:27.362273" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.359902" elapsed="0.002422"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.359869" elapsed="0.002479"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.369270" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.369337" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.369511" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.362522" elapsed="0.007029"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:27.331497" elapsed="0.038156"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.376191" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.376352" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.376515" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.371069" elapsed="0.005485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.380232" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.376799" elapsed="0.003502"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.380548" elapsed="0.003522"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.386705" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.384300" elapsed="0.002446"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.387016" elapsed="0.003031"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:27.390120" elapsed="0.000055"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:27.370586" elapsed="0.019735"/>
</kw>
<msg time="2026-05-01T00:52:27.390435" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:27.369895" elapsed="0.020595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.391101" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.390727" elapsed="0.000438"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.392411" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:27.392545" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:27.392044" elapsed="0.000537"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.393155" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:27.393258" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:27.392803" elapsed="0.000489"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.393532" elapsed="0.000433"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.394435" level="INFO">${sum_1} = 2683</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:27.394186" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:27.394992" level="INFO">${sum_2} = 2683</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:27.394708" elapsed="0.000322"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.395247" elapsed="0.000454"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:27.391524" elapsed="0.004262"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.401940" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.402064" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.402158" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.396408" elapsed="0.005775"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.405040" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.402351" elapsed="0.002737"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.405247" elapsed="0.002536"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.412962" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.413120" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.413331" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.407966" elapsed="0.005403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.417099" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.413637" elapsed="0.003531"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.417388" elapsed="0.003601"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:27.424356" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-05-01T00:52:27.421108" elapsed="0.003363"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.421077" elapsed="0.003433"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.424733" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:27.396104" elapsed="0.028788"/>
</kw>
<arg>route_eth_mac</arg>
<status status="PASS" start="2026-05-01T00:52:27.269365" elapsed="0.155629"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.156356" elapsed="0.268832"/>
</test>
<test id="s1-s13-t35" name="Play_To_Odl_route_eth_mac" line="148">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:27.430584" elapsed="0.000323"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:27.430195" elapsed="0.000791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.432385" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.432228" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.432202" elapsed="0.000302"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.439350" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.439242" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.439224" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.440436" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:27.440054" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.440940" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:27.440643" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:27.441009" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:52:27.441166" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:27.439668" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.446987" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.446878" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.446859" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.448601" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:27.448389" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.448371" elapsed="0.000395"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:27.449334" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:27.448919" elapsed="0.000477"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.450038" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:27.449766" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.481943" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:27.451998" elapsed="0.030075"/>
</kw>
<msg time="2026-05-01T00:52:27.482207" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:27.482327" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.450410" elapsed="0.031993"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:27.511641" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:27.484386" elapsed="0.027388"/>
</kw>
<msg time="2026-05-01T00:52:27.511905" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:27.512004" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.482828" elapsed="0.029246"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.512765" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.512378" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.512355" elapsed="0.000583"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.513673" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.513087" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.514365" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.514002" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.513982" elapsed="0.000574"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:27.514594" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:27.518156" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:52:27.518346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:27.517565" elapsed="0.000847"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.518643" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.518860" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:27.516780" elapsed="0.002297"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:27.514875" elapsed="0.004289"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:27.447875" elapsed="0.071465"/>
</kw>
<msg time="2026-05-01T00:52:27.519436" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:27.519497" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.447213" elapsed="0.072321"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:27.519721" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:27.519613" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.519594" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.520271" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.520778" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:27.520853" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:27.446526" elapsed="0.074439"/>
</kw>
<msg time="2026-05-01T00:52:27.521060" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:27.521105" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.441587" elapsed="0.079554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.521487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.521217" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.521200" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:27.441425" elapsed="0.080164"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:27.441246" elapsed="0.080414"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:27.438856" elapsed="0.082865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:27.431823" elapsed="0.089954"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:27.431199" elapsed="0.090622"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:27.427178" elapsed="0.094695"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.530278" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.530473" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.530629" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.522321" elapsed="0.008345"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:27.530901" elapsed="0.003578"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.539767" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.539874" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:27.539976" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:27.534710" elapsed="0.005292"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.543081" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.542776" elapsed="0.000333"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:27.543553" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:27.543265" elapsed="0.000316"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.543740" elapsed="0.000328"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:27.540231" elapsed="0.003898"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.522045" elapsed="0.022139"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:27.426360" elapsed="0.117863"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.544942" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.545099" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.544743" elapsed="0.000384"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.574080" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_mac.vanadium/route_eth_mac.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:27.573703" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.574916" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac.vanadium/route_eth_mac.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:27.574674" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac.vanadium/route_eth_mac.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:27.575085" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:27.574317" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.575675" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:27.575275" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.576005" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/route_eth_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.576135" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.575865" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.576576" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.576318" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:27.577017" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:27.576698" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.577555" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:27.577249" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.577102" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:27.576677" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.578257" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:27.577817" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:27.578336" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:52:27.578511" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:27.571414" elapsed="0.007124"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.578893" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/announce_route_eth_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/announce_route_eth_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.579022" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.578700" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:27.579391" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/withdraw_route_eth_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_mac/withdraw_route_eth_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:27.579527" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:27.579203" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.579960" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.579712" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.580447" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.580206" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.580938" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.580697" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:27.581369" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:27.581134" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:27.581578" elapsed="0.002114"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:27.583847" elapsed="0.001775"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:27.591641" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:27.591811" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:27.591949" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:27.586630" elapsed="0.005903">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.592804" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:27.593144" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:27.586254" elapsed="0.007065">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:29.602488" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:29.602790" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '417'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:29.603016" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:29.595049" elapsed="0.008028"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:29.604131" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:29.609399" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:29.603513" elapsed="0.006027"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:29.614271" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:29.613616" elapsed="0.000695"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:29.615152" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:29.614559" elapsed="0.000633"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:29.615415" elapsed="0.000481"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:29.610028" elapsed="0.005955"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:29.594032" elapsed="0.022029"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:27.585822" elapsed="2.030304"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:29.616345" elapsed="0.002270"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:29.624559" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:29.624672" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:29.624766" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:29.619535" elapsed="0.005257"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:29.624960" elapsed="0.002784"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:29.632772" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:29.633404" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '565'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:29.633573" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:29.627909" elapsed="0.005701"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:29.637995" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:29.637599" elapsed="0.000435"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:29.638935" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:29.638252" elapsed="0.000723"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:29.639735" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "mac-auto-generated": {
        "local-discriminator": 2000,
        "system-mac-address": "f2:0c:dd:80:9f:f7"
       },
       "mpls-label": 24001
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:29.640050" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:29.639247" elapsed="0.000914">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:29.633927" elapsed="0.006435">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:29.619242" elapsed="0.021319">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label": 24001
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQPyDN2An/cAB9AAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.649761" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.650001" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.650171" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.642034" elapsed="0.008174"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.650471" elapsed="0.003837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.660982" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.661140" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:31.661358" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.654600" elapsed="0.006796"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.665751" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.665315" elapsed="0.000476"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.666391" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.666011" elapsed="0.000420"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.666674" elapsed="0.000487"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.661766" elapsed="0.005483"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:31.641209" elapsed="0.026116"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:29.618813" elapsed="2.048581"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:31.668230" elapsed="0.002580"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.677257" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.677410" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.677585" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.672440" elapsed="0.005181"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.677852" elapsed="0.003633"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.687101" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.687247" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:31.687394" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.681723" elapsed="0.005708"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.691910" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.691497" elapsed="0.000453"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.692559" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.692167" elapsed="0.000432"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.692819" elapsed="0.000453"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.687793" elapsed="0.005620"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:31.671694" elapsed="0.021825"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:31.671083" elapsed="0.022491"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:31.667683" elapsed="0.025967"/>
</kw>
<arg>route_eth_mac</arg>
<status status="PASS" start="2026-05-01T00:52:27.544431" elapsed="4.149283"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:27.425726" elapsed="4.268140"/>
</test>
<test id="s1-s13-t36" name="Odl_To_Play_route_eth_rou" line="151">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:31.698305" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:31.698033" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.699623" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.699499" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.699475" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.704829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.704721" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.704703" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.705914" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:31.705530" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.706404" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:31.706109" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:31.706492" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:52:31.706658" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:31.705132" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.712570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.712444" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.712425" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.714091" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.713906" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.713888" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:31.714839" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:31.714409" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:31.715532" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:31.715249" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:31.747216" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:31.717468" elapsed="0.029878"/>
</kw>
<msg time="2026-05-01T00:52:31.747517" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:31.747619" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.715928" elapsed="0.031762"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:31.772911" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:31.749639" elapsed="0.023403"/>
</kw>
<msg time="2026-05-01T00:52:31.773172" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:31.773265" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.748084" elapsed="0.025251"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.774014" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:31.773655" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.773633" elapsed="0.000603"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.774984" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "e "t "h "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.774389" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.775681" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:31.775283" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.775263" elapsed="0.000591"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:31.775892" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:31.779444" elapsed="0.000206"/>
</kw>
<msg time="2026-05-01T00:52:31.779694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:31.778894" elapsed="0.000868"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.779977" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.780192" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:31.778115" elapsed="0.002295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:31.776172" elapsed="0.004339"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:31.713439" elapsed="0.067249"/>
</kw>
<msg time="2026-05-01T00:52:31.780781" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:31.780826" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.712798" elapsed="0.068064"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:31.781049" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:31.780940" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.780921" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.781622" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.782048" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.782123" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:31.712103" elapsed="0.070131"/>
</kw>
<msg time="2026-05-01T00:52:31.782328" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:31.782374" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.707064" elapsed="0.075345"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.782765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:31.782508" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.782482" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:31.706918" elapsed="0.075951"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:31.706739" elapsed="0.076162"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:31.704345" elapsed="0.078612"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:31.699184" elapsed="0.083831"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.698738" elapsed="0.084322"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:31.695712" elapsed="0.087402"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.787887" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.788016" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.788132" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.783675" elapsed="0.004484"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.788328" elapsed="0.002807"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.796391" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.796519" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:31.796622" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.791315" elapsed="0.005333"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.800792" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.800361" elapsed="0.000470"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:31.801522" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.801072" elapsed="0.000492"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.801825" elapsed="0.000479"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.796877" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:31.783301" elapsed="0.019187"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:31.695009" elapsed="0.107545"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:31.803694" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:31.803951" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:31.803388" elapsed="0.000603"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:31.804532" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:31.804735" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:31.804213" elapsed="0.000571"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:31.805277" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/announce_route_eth_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/announce_route_eth_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:31.805472" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:31.805011" elapsed="0.000543"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:31.806075" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:31.805780" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:31.806625" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/withdraw_route_eth_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/withdraw_route_eth_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:31.806800" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:31.806336" elapsed="0.000500"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:31.807384" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:31.807056" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.808014" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.807673" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.808506" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.808253" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.808949" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.808712" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.809386" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.809147" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:31.809594" elapsed="0.002473"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.820005" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '876', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:31.820094" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.820224" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.812266" elapsed="0.007994"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.824240" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.820576" elapsed="0.003725"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.845337" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.846236" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:31.846524" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.824548" elapsed="0.022044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.852952" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.847006" elapsed="0.006057"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.865016" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.865794" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:31.866024" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.855318" elapsed="0.010765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.872031" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.866512" elapsed="0.005631"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.872523" elapsed="0.004655"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.879718" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.877346" elapsed="0.002402"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.879927" elapsed="0.002145"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:31.882131" elapsed="0.000040"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:31.854519" elapsed="0.027758"/>
</kw>
<msg time="2026-05-01T00:52:31.882359" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:31.853489" elapsed="0.028896"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.882820" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.882571" elapsed="0.000296"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.883786" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:31.883863" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:31.883519" elapsed="0.000368"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.884360" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:52:31.884436" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:31.884100" elapsed="0.000374"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.884635" elapsed="0.000311"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.885298" level="INFO">${sum_1} = 2294</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:31.885112" elapsed="0.000212"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.885681" level="INFO">${sum_2} = 2294</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:31.885497" elapsed="0.000211"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.885864" elapsed="0.000308"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:31.883126" elapsed="0.003108"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:31.886387" elapsed="0.001612"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.893735" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.893852" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:31.893947" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.888543" elapsed="0.005430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.897469" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.894142" elapsed="0.003400"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.897763" elapsed="0.003546"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.907161" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.907441" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:31.907717" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.901557" elapsed="0.006220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.913820" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","path-id":0,"ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.908165" elapsed="0.005769"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.914290" elapsed="0.004402"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:31.922474" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.918919" elapsed="0.003629"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.918880" elapsed="0.003704"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.932899" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.932948" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.933057" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.922886" elapsed="0.010200"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:31.888246" elapsed="0.044912"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.940109" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.940356" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.940610" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.934207" elapsed="0.006462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.946478" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.941049" elapsed="0.005540"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.946990" elapsed="0.003624"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.952995" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:31.950925" elapsed="0.002138"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.953284" elapsed="0.003020"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:31.956375" elapsed="0.000050"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:31.933870" elapsed="0.022716"/>
</kw>
<msg time="2026-05-01T00:52:31.956698" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:31.933331" elapsed="0.023403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.957309" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.956968" elapsed="0.000404"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.958614" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:31.958777" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:31.958226" elapsed="0.000585"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.959301" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:52:31.959376" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:31.959030" elapsed="0.000371"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.959573" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.960212" level="INFO">${sum_1} = 1847</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:31.960034" elapsed="0.000203"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:31.960629" level="INFO">${sum_2} = 1847</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:31.960390" elapsed="0.000265"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:31.960810" elapsed="0.000310"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:31.957715" elapsed="0.003465"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.966187" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.966301" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.966394" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.961758" elapsed="0.004662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.969255" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.966627" elapsed="0.002677"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.969474" elapsed="0.002903"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:31.977505" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:31.977655" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:31.977797" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:31.972625" elapsed="0.005210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:31.981492" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:31.978071" elapsed="0.003489"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:31.981778" elapsed="0.003574"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:31.988744" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:52:31.985483" elapsed="0.003346"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.985437" elapsed="0.003427"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:31.989076" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:31.961439" elapsed="0.027759"/>
</kw>
<arg>route_eth_rou</arg>
<status status="PASS" start="2026-05-01T00:52:31.802929" elapsed="0.186330"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:31.694361" elapsed="0.295051"/>
</test>
<test id="s1-s13-t37" name="Play_To_Odl_route_eth_rou" line="153">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:31.994827" elapsed="0.000285"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:31.994398" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:31.996169" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:31.996058" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:31.996039" elapsed="0.000234"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:32.001316" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:32.001210" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.001192" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.002393" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:32.002010" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.002911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:32.002619" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:32.002981" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:52:32.003138" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:32.001632" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:32.008960" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:32.008852" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.008834" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:32.010517" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:32.010297" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.010279" elapsed="0.000407"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:32.011258" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:32.010840" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:32.011947" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:32.011682" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:32.046411" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:32.013880" elapsed="0.032673"/>
</kw>
<msg time="2026-05-01T00:52:32.046687" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:32.046782" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:32.012324" elapsed="0.034531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:32.076469" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:32.048808" elapsed="0.027803"/>
</kw>
<msg time="2026-05-01T00:52:32.076751" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:32.076846" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:32.047250" elapsed="0.029669"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.077642" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:32.077230" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.077205" elapsed="0.000614"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.078595" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "e "t "h "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.077970" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.079247" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:32.078894" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.078873" elapsed="0.000550"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:32.079476" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:32.083137" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:52:32.083381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:32.082581" elapsed="0.000885"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.083685" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.083903" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:32.081767" elapsed="0.002363"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:32.079786" elapsed="0.004432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:32.009852" elapsed="0.074545"/>
</kw>
<msg time="2026-05-01T00:52:32.084510" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:32.084557" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:32.009189" elapsed="0.075404"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:32.084782" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:32.084673" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.084654" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.085340" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.085787" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:32.085861" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:32.008509" elapsed="0.077465"/>
</kw>
<msg time="2026-05-01T00:52:32.086069" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:32.086114" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:32.003559" elapsed="0.082608"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.086515" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:32.086246" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.086228" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:32.003397" elapsed="0.083222"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:32.003219" elapsed="0.083432"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:32.000848" elapsed="0.085861"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:31.995770" elapsed="0.090998"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:31.995321" elapsed="0.091494"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:31.991369" elapsed="0.095501"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:32.093247" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:32.093426" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:32.093582" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:32.087306" elapsed="0.006312"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:32.093850" elapsed="0.004203"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:32.121334" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:32.121446" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:32.121570" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:32.098313" elapsed="0.023283"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:32.124852" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:32.124545" elapsed="0.000334"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:32.125311" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:32.125038" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:32.125513" elapsed="0.000323"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:32.121828" elapsed="0.004070"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:32.087023" elapsed="0.038930"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:31.990720" elapsed="0.135289"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:32.126744" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:32.126918" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;4...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:32.126543" elapsed="0.000404"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.152400" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_rou.vanadium/route_eth_rou.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:32.152021" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:32.153211" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou.vanadium/route_eth_rou.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:32.152959" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou.vanadium/route_eth_rou.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:32.153382" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:32.152617" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.154015" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:32.153593" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:32.154344" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/route_eth_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:32.154496" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:32.154209" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.154927" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.154685" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:32.155398" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:32.155085" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.155945" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:32.155651" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:32.155499" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:32.155065" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.156635" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:32.156180" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:32.156714" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:52:32.156872" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:32.149722" elapsed="0.007176"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:32.157255" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/announce_route_eth_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/announce_route_eth_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:32.157380" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:32.157061" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:32.157772" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/withdraw_route_eth_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_eth_rou/withdraw_route_eth_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:32.157904" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:32.157582" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.158335" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;ethernet-a-d-route&gt;
        &lt;mpls-label&gt;24001&lt;/mpls-label&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
    &lt;/ethernet-a-d-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.158090" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.158807" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.158568" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.159246" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.159011" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:32.159694" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:32.159443" elapsed="0.000295"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:32.159889" elapsed="0.002520"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:32.162613" elapsed="0.001662"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:32.172829" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:32.173056" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:32.173197" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:32.165618" elapsed="0.008101">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.174000" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:32.174333" elapsed="0.000033"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:32.165147" elapsed="0.009381">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:34.184415" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:34.184666" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:34.184839" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:34.176384" elapsed="0.008493"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:34.185582" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK",
        "route-distinguisher": "429496729:1",
        "ethernet-a-d-route": {
          "router-id-generated": {
            "local-discriminator": 2000,
            "router-id": "43.43.43.43"
          },
          "mpls-label": 24001,
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:34.188906" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:34.185144" elapsed="0.003833"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:34.193701" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:34.192974" elapsed="0.000769"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:34.194591" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:34.193967" elapsed="0.000675"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:34.194872" elapsed="0.000464"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:34.189327" elapsed="0.006099"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:34.175258" elapsed="0.020317"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:32.164565" elapsed="2.031082"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:34.195900" elapsed="0.002513"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:34.206728" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:34.206921" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:34.207082" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:34.199488" elapsed="0.007632"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:34.207372" elapsed="0.003765"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:34.217219" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:34.217724" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '551'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK","ethernet-a-d-route":{"mpls-label":24001,"ethernet-tag-id":{"vlan-id":10},"router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:34.217840" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:34.211376" elapsed="0.006492"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:34.221104" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:34.220765" elapsed="0.000370"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:34.221797" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:34.221296" elapsed="0.000530"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:34.222344" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "ethernet-a-d-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "mpls-label": 24001,
       "router-id-generated": {
        "local-discriminator": 2000,
        "router-id": "43.43.43.43"
       }
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK"
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:34.222575" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:34.222011" elapsed="0.000646">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:34.218116" elapsed="0.004741">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:34.199164" elapsed="0.023821">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "ethernet-a-d-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "mpls-label": 24001,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "ARYAAhmZmZkAAQQrKysrAAAH0AAAAAAK"
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.232665" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.232951" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.233175" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.224629" elapsed="0.008603"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.233659" elapsed="0.005904"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.245033" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.245193" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:36.245348" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.239810" elapsed="0.005574"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.249950" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.249515" elapsed="0.000475"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.250615" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.250208" elapsed="0.000446"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.250908" elapsed="0.000471"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.245757" elapsed="0.005733"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.223742" elapsed="0.027828"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:34.198698" elapsed="2.052928"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:36.252381" elapsed="0.002666"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.262713" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.262954" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.263131" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.256718" elapsed="0.006461"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.263420" elapsed="0.003642"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.272595" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.272751" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:36.272900" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.267300" elapsed="0.005636"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.277365" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.276947" elapsed="0.000457"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.278026" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.277647" elapsed="0.000418"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.278288" elapsed="0.000527"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.273264" elapsed="0.005640"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.256264" elapsed="0.022714"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:36.255323" elapsed="0.023711"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:36.251891" elapsed="0.027219"/>
</kw>
<arg>route_eth_rou</arg>
<status status="PASS" start="2026-05-01T00:52:32.126229" elapsed="4.152951"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:31.989888" elapsed="4.289444"/>
</test>
<test id="s1-s13-t38" name="Odl_To_Play_route_inc_arb" line="156">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:36.284694" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:36.284302" elapsed="0.000757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.286524" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.286334" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.286301" elapsed="0.000348"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.293240" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.293132" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.293114" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.294333" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:36.293944" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.294876" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:36.294561" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:36.295001" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:52:36.295177" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:36.293562" elapsed="0.001639"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.300797" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.300690" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.300671" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.302322" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.302140" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.302122" elapsed="0.000383"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:36.303114" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:36.302690" elapsed="0.000487"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.303827" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:36.303549" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.336178" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:36.305832" elapsed="0.030697"/>
</kw>
<msg time="2026-05-01T00:52:36.336806" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:36.336952" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.304201" elapsed="0.032857"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.365828" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:36.340197" elapsed="0.025791"/>
</kw>
<msg time="2026-05-01T00:52:36.366129" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:36.366222" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.337785" elapsed="0.028508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.367093" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.366679" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.366645" elapsed="0.000632"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.368039" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.367435" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.368709" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.368338" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.368317" elapsed="0.000567"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:36.368929" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:36.372737" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:52:36.372929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:36.372120" elapsed="0.000881"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.373219" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.373435" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:36.371311" elapsed="0.002363"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:36.369287" elapsed="0.004473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:36.301697" elapsed="0.072323"/>
</kw>
<msg time="2026-05-01T00:52:36.374118" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:36.374163" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.301021" elapsed="0.073179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:36.374661" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:52:36.374278" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.374259" elapsed="0.000492"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.375261" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.375703" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.375779" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:36.300336" elapsed="0.075555"/>
</kw>
<msg time="2026-05-01T00:52:36.375986" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:36.376031" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.295614" elapsed="0.080452"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.376400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.376142" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.376125" elapsed="0.000394"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:36.295447" elapsed="0.081097"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:36.295263" elapsed="0.081315"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:36.292767" elapsed="0.083870"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:36.285920" elapsed="0.090778"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.285277" elapsed="0.091469"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:36.281158" elapsed="0.095644"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.382632" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.382788" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.382910" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.377238" elapsed="0.005698"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.383107" elapsed="0.002892"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.390710" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.390858" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:36.391056" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.386166" elapsed="0.004928"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.395422" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.394992" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.396086" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.395708" elapsed="0.000417"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.396347" elapsed="0.000478"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.391415" elapsed="0.005497"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.376958" elapsed="0.020030"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:36.280474" elapsed="0.116570"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.398122" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.398364" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.397844" elapsed="0.000560"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.398945" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.399121" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.398678" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.399663" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/announce_route_inc_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/announce_route_inc_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.399836" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.399379" elapsed="0.000494"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:36.400384" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:36.400094" elapsed="0.000327"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.400932" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/withdraw_route_inc_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/withdraw_route_inc_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.401105" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.400668" elapsed="0.000474"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:36.401658" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:36.401360" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.402260" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.401920" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.402916" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.402585" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.403601" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.403247" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.404207" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.403878" elapsed="0.000390"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:36.404502" elapsed="0.002489"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.420240" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:36.420393" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.420692" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.407249" elapsed="0.013506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.427041" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.421179" elapsed="0.005958"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.433810" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.434161" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:36.434268" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.427524" elapsed="0.006770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.436942" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.434508" elapsed="0.002481"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.444252" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.445390" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:36.445888" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.438002" elapsed="0.007973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.452288" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.446650" elapsed="0.005691"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.452521" elapsed="0.002635"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.457579" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.455330" elapsed="0.002278"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.457804" elapsed="0.002279"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:36.460141" elapsed="0.000048"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:36.437657" elapsed="0.022645"/>
</kw>
<msg time="2026-05-01T00:52:36.460387" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:36.437162" elapsed="0.023252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.460852" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.460603" elapsed="0.000294"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.461870" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:36.461949" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:36.461572" elapsed="0.000402"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.462424" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:36.462524" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:36.462134" elapsed="0.000415"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.462725" elapsed="0.000339"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.463429" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:36.463227" elapsed="0.000246"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.463814" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:36.463635" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.463995" elapsed="0.000305"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:36.461146" elapsed="0.003214"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:36.464525" elapsed="0.001559"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.471677" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.471815" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:36.471912" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.466691" elapsed="0.005247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.474808" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.472111" elapsed="0.002745"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.475071" elapsed="0.003670"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.484341" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.484532" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:36.484678" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.478986" elapsed="0.005729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.488371" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.484955" elapsed="0.003485"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.488681" elapsed="0.003512"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:36.495512" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.492319" elapsed="0.003248"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.492283" elapsed="0.003309"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.504727" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.504772" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.504873" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.495747" elapsed="0.009152"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:36.466382" elapsed="0.038586"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.513753" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.513999" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.514252" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.506972" elapsed="0.007324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.517981" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.514557" elapsed="0.003490"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.518292" elapsed="0.003501"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.523968" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.522022" elapsed="0.001975"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.524223" elapsed="0.002171"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:36.526445" elapsed="0.000055"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:36.506104" elapsed="0.020501"/>
</kw>
<msg time="2026-05-01T00:52:36.526685" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:36.505137" elapsed="0.021573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.527124" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.526878" elapsed="0.000292"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.528053" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:36.528129" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:36.527792" elapsed="0.000361"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.528576" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:36.528650" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:36.528308" elapsed="0.000366"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.528831" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.529491" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:36.529294" elapsed="0.000224"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:36.529843" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:36.529670" elapsed="0.000198"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.530021" elapsed="0.000317"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:36.527408" elapsed="0.002990"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.535769" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.535891" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.535987" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.530990" elapsed="0.005022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.542134" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.536186" elapsed="0.006080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.542648" elapsed="0.005116"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.552404" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.552554" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.552669" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.547940" elapsed="0.004756"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.555435" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.552944" elapsed="0.002553"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.555656" elapsed="0.002530"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:36.561323" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-05-01T00:52:36.558287" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.558257" elapsed="0.003227"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.561717" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:36.530689" elapsed="0.031166"/>
</kw>
<arg>route_inc_arb</arg>
<status status="PASS" start="2026-05-01T00:52:36.397408" elapsed="0.164519"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.279803" elapsed="0.282285"/>
</test>
<test id="s1-s13-t39" name="Play_To_Odl_route_inc_arb" line="158">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:36.567494" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:36.567087" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.569258" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.569103" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.569078" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.575647" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.575531" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.575512" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.576763" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:36.576345" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.577258" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:36.576958" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:36.577328" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:52:36.577507" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:36.575966" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.583442" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.583328" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.583308" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.585022" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:36.584840" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.584821" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:36.585944" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:36.585341" elapsed="0.000665"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.586655" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:36.586371" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.618263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:36.588573" elapsed="0.029934"/>
</kw>
<msg time="2026-05-01T00:52:36.618711" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:36.618808" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.587022" elapsed="0.031863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:36.646076" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:36.621034" elapsed="0.025532"/>
</kw>
<msg time="2026-05-01T00:52:36.646778" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:36.646877" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.619360" elapsed="0.027593"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.647841" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.647314" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.647271" elapsed="0.000758"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.648898" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.648186" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.649587" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.649213" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.649181" elapsed="0.000597"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:36.649823" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:36.653623" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:52:36.653823" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:36.653111" elapsed="0.000787"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.654145" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.654364" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:36.652315" elapsed="0.002400"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:36.650230" elapsed="0.004580"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:36.584368" elapsed="0.070625"/>
</kw>
<msg time="2026-05-01T00:52:36.655096" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:36.655141" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.583692" elapsed="0.071489"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:36.655381" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:52:36.655266" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.655244" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.656008" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.656513" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:36.656590" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:36.582973" elapsed="0.073742"/>
</kw>
<msg time="2026-05-01T00:52:36.656826" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:36.656871" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.577917" elapsed="0.078993"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.657265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.656988" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.656971" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:36.577770" elapsed="0.079596"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:36.577590" elapsed="0.079811"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:36.575119" elapsed="0.082372"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:36.568699" elapsed="0.088920"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:36.568072" elapsed="0.089615"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:36.563818" elapsed="0.093927"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.663597" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.663767" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.663882" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.658229" elapsed="0.005681"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:36.664116" elapsed="0.003935"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.673496" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.673696" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:36.673870" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:36.668236" elapsed="0.005708"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.679159" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.678665" elapsed="0.000556"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:36.679922" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:36.679491" elapsed="0.000472"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.680203" elapsed="0.000567"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:36.674338" elapsed="0.006526"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.657901" elapsed="0.023061"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:36.563075" elapsed="0.117950"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.682264" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.682534" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.681870" elapsed="0.000708"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.712367" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_arb.vanadium/route_inc_arb.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:36.711907" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.713341" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb.vanadium/route_inc_arb.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:36.713058" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb.vanadium/route_inc_arb.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:36.713583" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:36.712606" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.714212" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:36.713794" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.714567" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/route_inc_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.714731" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.714406" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.715164" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.714919" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:36.715697" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:36.715302" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.716235" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:36.715940" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.715790" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:36.715273" elapsed="0.001052"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.716983" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:36.716502" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:36.717065" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:52:36.717236" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:36.709442" elapsed="0.007821"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.717648" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/announce_route_inc_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/announce_route_inc_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.717803" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.717432" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:36.718236" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/withdraw_route_inc_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_arb/withdraw_route_inc_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:36.718357" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:36.718031" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.718802" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.718558" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.719296" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.719056" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.719769" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.719523" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:36.720201" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:36.719966" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:36.720396" elapsed="0.002538"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:36.723097" elapsed="0.001866"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:36.731386" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:36.731616" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:36.731788" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:36.726004" elapsed="0.006372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.732731" elapsed="0.000037"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:36.733129" elapsed="0.000049"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:36.725636" elapsed="0.007707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:38.743039" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:38.743241" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:38.743387" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:38.735122" elapsed="0.008306"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:38.744112" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:38.747426" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:38.743713" elapsed="0.003804"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:38.752029" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:38.751395" elapsed="0.000674"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:38.752864" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:38.752293" elapsed="0.000612"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:38.753143" elapsed="0.000612"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:38.747839" elapsed="0.006088"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:38.734051" elapsed="0.019966"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:36.725158" elapsed="2.028925"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:38.754309" elapsed="0.002984"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:38.764183" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:38.764493" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:38.764727" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:38.758695" elapsed="0.006094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:38.765250" elapsed="0.005048"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:38.776258" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:38.776910" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:38.777073" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:38.770557" elapsed="0.006554"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:38.781659" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:38.781211" elapsed="0.000497"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:38.782662" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:38.781953" elapsed="0.000755"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:38.783537" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:38.783816" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:38.782961" elapsed="0.000974">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:38.777514" elapsed="0.006643">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:38.758202" elapsed="0.026133">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.792421" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.792666" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:40.792826" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.785841" elapsed="0.007024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:40.793140" elapsed="0.004100"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.804298" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.804654" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:40.804865" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.797560" elapsed="0.007347"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.810517" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.809993" elapsed="0.000568"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.811210" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.810800" elapsed="0.000451"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.811519" elapsed="0.000555"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.805445" elapsed="0.006722"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:40.785065" elapsed="0.027185"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:38.757603" elapsed="2.054706"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:40.813213" elapsed="0.002808"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.821960" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.822133" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:40.822270" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.817439" elapsed="0.004868"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:40.822559" elapsed="0.003631"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.832157" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.832508" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:40.832752" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.826521" elapsed="0.006276"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.838438" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.837908" elapsed="0.000626"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.839205" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.838786" elapsed="0.000461"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.839547" elapsed="0.000590"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.833267" elapsed="0.006969"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:40.816793" elapsed="0.023529"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:40.816208" elapsed="0.024222"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:40.812673" elapsed="0.027872"/>
</kw>
<arg>route_inc_arb</arg>
<status status="PASS" start="2026-05-01T00:52:36.681386" elapsed="4.159356"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:36.562418" elapsed="4.278500"/>
</test>
<test id="s1-s13-t40" name="Odl_To_Play_route_inc_as" line="161">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:40.846376" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:40.846103" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:40.847785" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:40.847637" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.847609" elapsed="0.000260"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:40.855009" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:40.854879" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.854855" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.856244" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:40.855804" elapsed="0.000469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.856890" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:40.856499" elapsed="0.000428"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:40.856988" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:52:40.857203" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:40.855366" elapsed="0.001864"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:40.864495" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:40.864268" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.864242" elapsed="0.000349"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:40.866345" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:40.866139" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.866116" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:40.867163" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:40.866704" elapsed="0.000524"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:40.867893" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:40.867614" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:40.899271" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:40.870095" elapsed="0.029598"/>
</kw>
<msg time="2026-05-01T00:52:40.900014" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:40.900195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:40.868276" elapsed="0.032096"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:40.924981" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:40.903076" elapsed="0.022207"/>
</kw>
<msg time="2026-05-01T00:52:40.925545" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:40.925646" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:40.901148" elapsed="0.024571"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.926592" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:40.926079" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.926039" elapsed="0.000742"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.927636" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.926940" elapsed="0.000900"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.928413" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:40.928022" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.928001" elapsed="0.000606"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:40.928650" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:40.932570" elapsed="0.000166"/>
</kw>
<msg time="2026-05-01T00:52:40.932792" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:40.931863" elapsed="0.001010"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.933094" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.933309" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:40.931047" elapsed="0.002517"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:40.928991" elapsed="0.004662"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:40.865639" elapsed="0.068197"/>
</kw>
<msg time="2026-05-01T00:52:40.933939" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:40.933984" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:40.864804" elapsed="0.069219"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:40.934511" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:52:40.934113" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.934089" elapsed="0.000517"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.935115" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.935576" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:40.935650" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:40.863807" elapsed="0.071955"/>
</kw>
<msg time="2026-05-01T00:52:40.935855" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:40.935898" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:40.857703" elapsed="0.078231"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:40.936345" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:40.936010" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:40.935993" elapsed="0.000445"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:40.857516" elapsed="0.078967"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:40.857295" elapsed="0.079231"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:40.854409" elapsed="0.082183"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:40.847282" elapsed="0.089368"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:40.846824" elapsed="0.089871"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:40.842887" elapsed="0.093866"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.942403" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.942713" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:40.942906" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.937227" elapsed="0.005713"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:40.943204" elapsed="0.003518"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.951830" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.952061" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:40.952322" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.946939" elapsed="0.005428"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.958021" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.957478" elapsed="0.000592"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:40.958748" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:40.958315" elapsed="0.000475"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.959033" elapsed="0.000612"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:40.952869" elapsed="0.006889"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:40.936917" elapsed="0.022937"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:40.842141" elapsed="0.117779"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:40.961331" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:40.961704" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:40.961003" elapsed="0.000758"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:40.962344" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:40.962597" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:40.962042" elapsed="0.000598"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:40.963236" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/announce_route_inc_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/announce_route_inc_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:40.963431" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:40.962911" elapsed="0.000594"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:40.964142" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:40.963807" elapsed="0.000377"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:40.964894" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/withdraw_route_inc_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/withdraw_route_inc_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:40.965108" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:40.964494" elapsed="0.000655"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:40.965729" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:40.965386" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.966506" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.966061" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.967245" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.966840" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.967943" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.967573" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.968686" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.968295" elapsed="0.000459"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:40.968981" elapsed="0.002875"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.984320" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:40.984442" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.984690" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.972372" elapsed="0.012359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:40.989038" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.985057" elapsed="0.004048"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:40.995287" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:40.995538" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:40.995868" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:40.989353" elapsed="0.006565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.000541" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:40.996230" elapsed="0.004388"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.007899" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.008125" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:41.008361" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.002162" elapsed="0.006241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.012657" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.008753" elapsed="0.003987"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.013013" elapsed="0.004023"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.020142" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:41.017366" elapsed="0.002840"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.020398" elapsed="0.002248"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:41.022708" elapsed="0.000049"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:41.001639" elapsed="0.021240"/>
</kw>
<msg time="2026-05-01T00:52:41.022969" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:41.000892" elapsed="0.022106"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.023430" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.023174" elapsed="0.000320"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.024492" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:41.024571" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:41.024183" elapsed="0.000413"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.025040" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:41.025121" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:41.024754" elapsed="0.000393"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.025311" elapsed="0.000347"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.026013" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:41.025823" elapsed="0.000216"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.026379" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:41.026197" elapsed="0.000210"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.026586" elapsed="0.000314"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:41.023759" elapsed="0.003204"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:41.027118" elapsed="0.002507"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.038788" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.039037" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:41.039222" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.030875" elapsed="0.008390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.044586" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.039653" elapsed="0.005014"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.044966" elapsed="0.004818"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.056733" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.056997" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:41.057213" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.050121" elapsed="0.007140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.061905" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.057647" elapsed="0.004322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.062178" elapsed="0.003154"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:41.068329" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:41.065478" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.065420" elapsed="0.003010"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.075140" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.075201" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.075348" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.068656" elapsed="0.006724"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:41.030144" elapsed="0.045358"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.081740" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.082025" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:41.082140" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.076874" elapsed="0.005297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.085523" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.082385" elapsed="0.003198"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.085785" elapsed="0.003239"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.091515" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:41.089245" elapsed="0.002309"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.091791" elapsed="0.002819"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:41.094679" elapsed="0.000058"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:41.076418" elapsed="0.018462"/>
</kw>
<msg time="2026-05-01T00:52:41.094986" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:41.075735" elapsed="0.019285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.095579" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.095241" elapsed="0.000397"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.096912" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:41.097006" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:41.096553" elapsed="0.000482"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.097567" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:41.097659" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:41.097230" elapsed="0.000456"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.097883" elapsed="0.000371"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.098869" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:41.098471" elapsed="0.000430"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:41.099318" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:41.099096" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.099569" elapsed="0.000379"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:41.095964" elapsed="0.004059"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.106781" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.106973" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:41.107103" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.100844" elapsed="0.006292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.111172" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.107376" elapsed="0.003933"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.111542" elapsed="0.003210"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.119801" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.119970" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:41.120144" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.114967" elapsed="0.005211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.123558" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.120408" elapsed="0.003212"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.123823" elapsed="0.003222"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:41.130164" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-05-01T00:52:41.127167" elapsed="0.003093"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.127130" elapsed="0.003169"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.130517" elapsed="0.000030"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:41.100439" elapsed="0.030199"/>
</kw>
<arg>route_inc_as</arg>
<status status="PASS" start="2026-05-01T00:52:40.960438" elapsed="0.170262"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:40.841406" elapsed="0.289441"/>
</test>
<test id="s1-s13-t41" name="Play_To_Odl_route_inc_as" line="163">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:41.135621" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:41.135265" elapsed="0.000695"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:41.137292" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:41.137144" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.137117" elapsed="0.000273"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:41.143488" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:41.143346" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.143325" elapsed="0.000244"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.145592" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:41.144686" elapsed="0.000969"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.146767" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:41.146014" elapsed="0.000810"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:41.146924" elapsed="0.000072"/>
</return>
<msg time="2026-05-01T00:52:41.147281" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:41.143867" elapsed="0.003469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:41.160739" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:41.160595" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.160567" elapsed="0.000264"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:41.162515" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:41.162277" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.162259" elapsed="0.000425"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:41.163381" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:41.162853" elapsed="0.000626"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:41.164141" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:41.163834" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:41.195531" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:41.166117" elapsed="0.029685"/>
</kw>
<msg time="2026-05-01T00:52:41.196045" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:41.196164" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:41.164544" elapsed="0.031757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:41.221287" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:41.198586" elapsed="0.022970"/>
</kw>
<msg time="2026-05-01T00:52:41.221752" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:41.221851" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:41.196849" elapsed="0.025079"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.222789" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:41.222307" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.222270" elapsed="0.000709"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.223815" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.223137" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.224552" elapsed="0.000233"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:41.224163" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.224142" elapsed="0.000778"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:41.224964" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:41.228867" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:52:41.229066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:41.228245" elapsed="0.000893"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.229362" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.229603" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:41.227379" elapsed="0.002453"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:41.225341" elapsed="0.004581"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:41.161831" elapsed="0.068275"/>
</kw>
<msg time="2026-05-01T00:52:41.230206" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:41.230253" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:41.161034" elapsed="0.069259"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:41.230568" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:52:41.230374" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.230354" elapsed="0.000307"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.231144" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.231609" elapsed="0.000082"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:41.231744" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:41.159736" elapsed="0.072128"/>
</kw>
<msg time="2026-05-01T00:52:41.231965" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:41.232040" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:41.148243" elapsed="0.083838"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.232429" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:41.232165" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.232146" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:41.147868" elapsed="0.084686"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:41.147479" elapsed="0.085109"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:41.142918" elapsed="0.089731"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:41.136768" elapsed="0.095941"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:41.136186" elapsed="0.096572"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:41.132507" elapsed="0.100308"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.239423" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.239636" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:41.239777" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.233255" elapsed="0.006559"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:41.240094" elapsed="0.004245"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.249831" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.249941" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:41.250048" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:41.244611" elapsed="0.005466"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:41.253287" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:41.252974" elapsed="0.000344"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:41.253804" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:41.253514" elapsed="0.000319"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.253997" elapsed="0.000336"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:41.250315" elapsed="0.004131"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:41.232971" elapsed="0.021552"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:41.131865" elapsed="0.122701"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:41.255305" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:41.255519" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:41.255096" elapsed="0.000454"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.288494" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_as.vanadium/route_inc_as.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:41.288079" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:41.289318" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as.vanadium/route_inc_as.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:41.289057" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as.vanadium/route_inc_as.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:41.289514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:41.288703" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.290099" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:41.289709" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:41.290427" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/route_inc_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:41.290618" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:41.290290" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.291052" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.290808" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:41.291521" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:41.291175" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.292084" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:41.291759" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:41.291610" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:41.291152" elapsed="0.001016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.292794" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:41.292319" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:41.292874" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:52:41.293040" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:41.285711" elapsed="0.007356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:41.293427" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/announce_route_inc_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/announce_route_inc_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:41.293613" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:41.293230" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:41.293994" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/withdraw_route_inc_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_as/withdraw_route_inc_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:41.294120" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:41.293800" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.294571" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.294307" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.295025" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.294785" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.295485" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.295229" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:41.295952" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:41.295686" elapsed="0.000320"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:41.296163" elapsed="0.002017"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:41.298388" elapsed="0.001317"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:41.305161" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:41.305283" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:41.305381" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:41.300705" elapsed="0.005210">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.306182" elapsed="0.000033"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:41.306543" elapsed="0.000036"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:41.300358" elapsed="0.006361">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:43.313733" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:43.313974" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:43.314086" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:43.307732" elapsed="0.006380"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:43.314655" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:43.317024" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:43.314305" elapsed="0.002768"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:43.320358" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:43.319903" elapsed="0.000484"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:43.320961" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:43.320568" elapsed="0.000422"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:43.321151" elapsed="0.000357"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:43.317309" elapsed="0.004264"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:43.307210" elapsed="0.014420"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:41.299899" elapsed="2.021780"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:43.321844" elapsed="0.002802"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:43.331729" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:43.331929" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:43.332078" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:43.325625" elapsed="0.006488"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:43.332363" elapsed="0.004194"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:43.345335" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:43.345597" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:43.345871" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:43.336836" elapsed="0.009074"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:43.352825" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:43.352098" elapsed="0.000796"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:43.354303" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:43.353256" elapsed="0.001109"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:43.355588" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:43.356022" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:43.354792" elapsed="0.001389">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:43.346308" elapsed="0.010209">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:43.325315" elapsed="0.031488">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.367032" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.367230" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.367408" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.358422" elapsed="0.009027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.367764" elapsed="0.003900"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.379218" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.379375" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:45.379555" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.371986" elapsed="0.007608"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.385159" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.384430" elapsed="0.000796"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.386349" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.385708" elapsed="0.000706"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.386857" elapsed="0.000841"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.379965" elapsed="0.007916"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.357546" elapsed="0.030469"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:43.324836" elapsed="2.063273"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:45.389448" elapsed="0.002720"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.397866" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.397988" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.398099" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.393429" elapsed="0.004706"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.398332" elapsed="0.004935"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.410999" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.411260" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:45.411438" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.403897" elapsed="0.007589"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.415443" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.414977" elapsed="0.000519"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.416226" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.415856" elapsed="0.000400"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.416494" elapsed="0.000420"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.411910" elapsed="0.005090"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.392855" elapsed="0.024211"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:45.392391" elapsed="0.024762"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:45.388583" elapsed="0.028658"/>
</kw>
<arg>route_inc_as</arg>
<status status="PASS" start="2026-05-01T00:52:41.254787" elapsed="4.162528"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:41.131271" elapsed="4.286210"/>
</test>
<test id="s1-s13-t42" name="Odl_To_Play_route_inc_lacp" line="166">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:45.426909" elapsed="0.000344"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:45.426483" elapsed="0.000873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.429039" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.428826" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.428775" elapsed="0.000389"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.436166" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.436053" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.436034" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.437319" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:45.436903" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.437884" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:45.437535" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:45.437958" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:52:45.438141" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:45.436498" elapsed="0.001669"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.444299" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.444183" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.444164" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.446026" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.445833" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.445813" elapsed="0.000383"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:45.446833" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:45.446357" elapsed="0.000540"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.447566" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:45.447257" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.480986" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:45.449526" elapsed="0.031785"/>
</kw>
<msg time="2026-05-01T00:52:45.481666" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:45.481807" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.447944" elapsed="0.033967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.508809" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:45.484395" elapsed="0.024584"/>
</kw>
<msg time="2026-05-01T00:52:45.509268" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:45.509364" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.482628" elapsed="0.026808"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.510312" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.509839" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.509796" elapsed="0.000732"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.511331" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.510693" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.512009" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.511649" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.511628" elapsed="0.000556"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:45.512232" elapsed="0.000061"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:45.516320" elapsed="0.000173"/>
</kw>
<msg time="2026-05-01T00:52:45.516539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:45.515636" elapsed="0.000986"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.516846" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.517063" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:45.514786" elapsed="0.002501"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:45.512657" elapsed="0.004718"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:45.445271" elapsed="0.072339"/>
</kw>
<msg time="2026-05-01T00:52:45.517723" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:45.517768" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.444577" elapsed="0.073230"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:45.518006" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:45.517893" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.517873" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.518636" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.519083" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.519159" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:45.443830" elapsed="0.075449"/>
</kw>
<msg time="2026-05-01T00:52:45.519382" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:45.519427" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.438636" elapsed="0.080848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.519880" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.519567" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.519548" elapsed="0.000418"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:45.438472" elapsed="0.081519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:45.438251" elapsed="0.081783"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:45.435674" elapsed="0.084431"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:45.428313" elapsed="0.091896"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.427613" elapsed="0.092649"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:45.422415" elapsed="0.097912"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.526199" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.526413" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.526582" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.520828" elapsed="0.005782"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.526787" elapsed="0.002990"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.535674" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.535825" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:45.535971" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.529948" elapsed="0.006060"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.540445" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.539965" elapsed="0.000542"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.541116" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.540731" elapsed="0.000423"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.541379" elapsed="0.000503"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.536334" elapsed="0.005635"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.520529" elapsed="0.021516"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:45.420556" elapsed="0.121547"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.543223" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.543477" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.542939" elapsed="0.000580"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.544011" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.544189" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.543744" elapsed="0.000523"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.544788" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/announce_route_inc_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/announce_route_inc_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.544966" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.544516" elapsed="0.000486"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:45.545599" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:45.545229" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.546130" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/withdraw_route_inc_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/withdraw_route_inc_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.546307" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.545864" elapsed="0.000479"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:45.546797" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:45.546586" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.547232" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.546987" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.547711" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.547443" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.548152" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.547916" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.548607" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.548350" elapsed="0.000302"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:45.548804" elapsed="0.002464"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.562015" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:45.562121" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.562359" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.551477" elapsed="0.010921"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.570013" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.562712" elapsed="0.007369"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.575649" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.575859" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:45.576007" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.570331" elapsed="0.005713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.579798" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.576287" elapsed="0.003580"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.587136" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.587250" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:45.587345" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.581377" elapsed="0.005993"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.590043" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.587566" elapsed="0.002525"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.590287" elapsed="0.002554"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.595057" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.593042" elapsed="0.002056"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.595351" elapsed="0.003045"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:45.598493" elapsed="0.000075"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:45.580873" elapsed="0.017853"/>
</kw>
<msg time="2026-05-01T00:52:45.598839" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:45.580112" elapsed="0.018762"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.599475" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.599109" elapsed="0.000433"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.600789" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:45.600895" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:45.600390" elapsed="0.000596"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.601636" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:45.601743" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:45.601214" elapsed="0.000562"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.602000" elapsed="0.000433"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.602880" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:45.602684" elapsed="0.000222"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.603234" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:45.603061" elapsed="0.000199"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.603414" elapsed="0.000327"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:45.599872" elapsed="0.003930"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:45.603955" elapsed="0.001788"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.610818" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.610948" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:45.611049" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.606285" elapsed="0.004806"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.615336" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.611287" elapsed="0.004124"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.615701" elapsed="0.004491"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.626400" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.626581" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:45.626703" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.620539" elapsed="0.006191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.629431" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.626921" elapsed="0.002576"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.629714" elapsed="0.002507"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:45.634749" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.632333" elapsed="0.002478"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.632296" elapsed="0.002542"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.641179" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.641227" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.641333" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.634998" elapsed="0.006362"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:45.606007" elapsed="0.035434"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.647228" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.647378" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.647500" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.642641" elapsed="0.004887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.650296" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.647712" elapsed="0.002632"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.650520" elapsed="0.002531"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.655303" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.653221" elapsed="0.002112"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.655542" elapsed="0.002211"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:45.657811" elapsed="0.000059"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:45.642242" elapsed="0.015750"/>
</kw>
<msg time="2026-05-01T00:52:45.658080" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:45.641674" elapsed="0.016432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.658549" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.658283" elapsed="0.000313"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.659551" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:45.659631" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:45.659267" elapsed="0.000388"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.660065" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:45.660139" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:45.659812" elapsed="0.000351"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.660324" elapsed="0.000331"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.660998" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:45.660819" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:45.661347" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:45.661176" elapsed="0.000196"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.661636" elapsed="0.000316"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:45.658868" elapsed="0.003146"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.667282" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.667435" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.667556" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.662660" elapsed="0.004922"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.670698" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.667889" elapsed="0.002857"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.670902" elapsed="0.002527"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.677592" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.677704" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.677807" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.673620" elapsed="0.004214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.680432" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.678007" elapsed="0.002489"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.680655" elapsed="0.002523"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:45.685643" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:52:45.683277" elapsed="0.002449"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.683247" elapsed="0.002507"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.685918" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:45.662326" elapsed="0.023687"/>
</kw>
<arg>route_inc_lacp</arg>
<status status="PASS" start="2026-05-01T00:52:45.542520" elapsed="0.143547"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.419078" elapsed="0.267134"/>
</test>
<test id="s1-s13-t43" name="Play_To_Odl_route_inc_lacp" line="168">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:45.690278" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:45.690008" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.691613" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.691498" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.691478" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.696750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.696640" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.696613" elapsed="0.000283"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.697993" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:45.697577" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.698503" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:45.698187" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:45.698576" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:52:45.698742" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:45.697139" elapsed="0.001628"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.704638" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.704528" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.704509" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.706201" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:45.706017" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.705998" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:45.707126" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:45.706541" elapsed="0.000646"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.707834" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:45.707561" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.739672" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:45.709827" elapsed="0.030036"/>
</kw>
<msg time="2026-05-01T00:52:45.740047" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:45.740144" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.708208" elapsed="0.032008"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:45.767940" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:45.742372" elapsed="0.025725"/>
</kw>
<msg time="2026-05-01T00:52:45.768247" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:45.768341" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.740707" elapsed="0.027706"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.769196" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.768780" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.768743" elapsed="0.000637"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.770195" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.769585" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.770869" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.770516" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.770496" elapsed="0.000551"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:45.771092" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:45.774972" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:52:45.775172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:45.774333" elapsed="0.000917"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.775565" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.775790" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:45.773520" elapsed="0.002498"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:45.771478" elapsed="0.004629"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:45.705573" elapsed="0.070719"/>
</kw>
<msg time="2026-05-01T00:52:45.776395" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:45.776441" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.704866" elapsed="0.071628"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:45.776689" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:52:45.776577" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.776558" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.777275" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.777753" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:45.777827" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:45.704172" elapsed="0.073770"/>
</kw>
<msg time="2026-05-01T00:52:45.778041" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:45.778087" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.699188" elapsed="0.078935"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.778491" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.778202" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.778184" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:45.699036" elapsed="0.079561"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:45.698835" elapsed="0.079805"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:45.696251" elapsed="0.082460"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:45.691185" elapsed="0.087586"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:45.690731" elapsed="0.088089"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:45.687772" elapsed="0.091110"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.786090" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.786269" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.786375" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.779336" elapsed="0.007064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:45.786595" elapsed="0.003310"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.796120" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.796425" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:45.796640" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:45.790085" elapsed="0.006594"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.801786" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.801205" elapsed="0.000624"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:45.802498" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:45.802066" elapsed="0.000475"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.802788" elapsed="0.000565"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:45.797094" elapsed="0.006378"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.779049" elapsed="0.024513"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:45.687166" elapsed="0.116463"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.804747" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.804984" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.804418" elapsed="0.000609"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.832502" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_lacp.vanadium/route_inc_lacp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:45.832090" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.833381" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp.vanadium/route_inc_lacp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:45.833093" elapsed="0.000422">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp.vanadium/route_inc_lacp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:45.833618" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:45.832720" elapsed="0.000925"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.834209" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:45.833817" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.834550" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/route_inc_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.834693" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.834397" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.835128" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.834881" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:45.835678" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:45.835272" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.836276" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:45.835924" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.835774" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:45.835240" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.837041" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:45.836568" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:45.837126" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:52:45.837308" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:45.829764" elapsed="0.007570"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.837742" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/announce_route_inc_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/announce_route_inc_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.837868" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.837537" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:45.838240" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/withdraw_route_inc_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lacp/withdraw_route_inc_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:45.838360" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:45.838052" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.838808" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.838561" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.839254" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.839018" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.839720" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.839476" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:45.840151" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:45.839917" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:45.840347" elapsed="0.002801"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:45.843330" elapsed="0.001731"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:45.852063" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:45.852251" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:45.852443" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:45.846065" elapsed="0.006933">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.853266" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:45.853650" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:45.845735" elapsed="0.008099">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:47.860934" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:47.861268" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:47.861529" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:47.854852" elapsed="0.006740"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:47.862758" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:47.867081" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:47.862005" elapsed="0.005148"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:47.871673" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:47.871045" elapsed="0.000671"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:47.872515" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:47.871939" elapsed="0.000617"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:47.872780" elapsed="0.000530"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:47.867496" elapsed="0.005905"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:47.854318" elapsed="0.019180"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:45.845254" elapsed="2.028314"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:47.873800" elapsed="0.002483"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:47.881952" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:47.882125" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:47.882222" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:47.877238" elapsed="0.005010"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:47.882414" elapsed="0.003826"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:47.892188" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:47.892364" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:47.892546" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:47.886493" elapsed="0.006093"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:47.897094" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:47.896627" elapsed="0.000509"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:47.898022" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:47.897363" elapsed="0.000699"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:47.898787" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:47.899063" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:47.898287" elapsed="0.000881">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:47.892927" elapsed="0.006438">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:47.876940" elapsed="0.022695">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:49.909442" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:49.909688" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:49.909840" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:49.901422" elapsed="0.008456"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:49.910138" elapsed="0.003771"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:49.918817" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:49.918956" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:49.919074" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:49.914154" elapsed="0.004947"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:49.922424" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:49.922057" elapsed="0.000417"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:49.922946" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:49.922654" elapsed="0.000320"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:49.923137" elapsed="0.000380"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:49.919367" elapsed="0.004215"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:49.900338" elapsed="0.023301"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:47.876507" elapsed="2.047173"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:49.924270" elapsed="0.002642"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:49.934430" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:49.934695" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:49.935058" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:49.928950" elapsed="0.006157"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:49.935479" elapsed="0.004397"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:49.945681" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:49.945838" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:49.945972" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:49.940135" elapsed="0.005864"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:49.949514" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:49.949144" elapsed="0.000400"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:49.949994" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:49.949704" elapsed="0.000320"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:49.950184" elapsed="0.000391"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:49.946272" elapsed="0.004369"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:49.927979" elapsed="0.022718"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:49.927217" elapsed="0.023523"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:49.923881" elapsed="0.026918"/>
</kw>
<arg>route_inc_lacp</arg>
<status status="PASS" start="2026-05-01T00:52:45.803976" elapsed="4.146875"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:45.686625" elapsed="4.264345"/>
</test>
<test id="s1-s13-t44" name="Odl_To_Play_route_inc_lan" line="171">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:49.956020" elapsed="0.000334"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:49.955538" elapsed="0.000903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:49.958170" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:49.957960" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:49.957923" elapsed="0.000363"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:49.965860" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:49.965715" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:49.965684" elapsed="0.000255"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:49.967079" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:49.966641" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:49.967670" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:49.967338" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:49.967741" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:52:49.967916" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:49.966223" elapsed="0.001717"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:49.974741" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:49.974620" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:49.974598" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:49.976717" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:49.976502" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:49.976445" elapsed="0.000468"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:49.977527" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:49.977072" elapsed="0.000519"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:49.978224" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:49.977945" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:50.014135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:49.980486" elapsed="0.033947"/>
</kw>
<msg time="2026-05-01T00:52:50.014743" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:50.014890" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:49.978623" elapsed="0.036366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:50.044052" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:50.017682" elapsed="0.026657"/>
</kw>
<msg time="2026-05-01T00:52:50.044618" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:50.044765" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.015590" elapsed="0.029317"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.046067" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.045396" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.045351" elapsed="0.000985"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.047681" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.046594" elapsed="0.001268"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.048680" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.048129" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.048099" elapsed="0.000905"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:50.049065" elapsed="0.000059"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:50.053299" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:52:50.053565" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:50.052635" elapsed="0.001004"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.053862" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.054080" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:50.051836" elapsed="0.002460"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:50.049599" elapsed="0.004783"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:49.975970" elapsed="0.078774"/>
</kw>
<msg time="2026-05-01T00:52:50.054849" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:50.054895" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:49.975024" elapsed="0.079908"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:50.055123" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:50.055013" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.054994" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.055701" elapsed="0.000083"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.056197" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.056272" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:49.974227" elapsed="0.082159"/>
</kw>
<msg time="2026-05-01T00:52:50.056499" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:50.056544" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:49.968427" elapsed="0.088155"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.056951" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.056660" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.056642" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:49.968232" elapsed="0.088823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:49.968000" elapsed="0.089090"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:49.965130" elapsed="0.092018"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:49.957402" elapsed="0.099804"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:49.956701" elapsed="0.100552"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:49.952524" elapsed="0.104783"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.063018" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.063164" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.063280" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.057759" elapsed="0.005548"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.063495" elapsed="0.002633"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.070542" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.070698" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:50.070849" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.066296" elapsed="0.004593"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:50.075600" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.075132" elapsed="0.000512"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:50.076325" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.075881" elapsed="0.000539"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.076684" elapsed="0.000536"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.071233" elapsed="0.006078"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:50.057476" elapsed="0.019914"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:49.951984" elapsed="0.125486"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.078689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.078916" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.078343" elapsed="0.000616"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.079504" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.079690" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.079198" elapsed="0.000531"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.080246" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/announce_route_inc_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/announce_route_inc_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.080449" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.079967" elapsed="0.000542"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:50.081084" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:50.080745" elapsed="0.000378"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.081667" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/withdraw_route_inc_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/withdraw_route_inc_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.081876" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.081358" elapsed="0.000563"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:50.082433" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:50.082156" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.083060" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.082716" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.083712" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.083349" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.084324" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.083992" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.085041" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.084670" elapsed="0.000435"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:50.085314" elapsed="0.003089"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.099000" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:50.099142" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.099359" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.088608" elapsed="0.010808"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.105905" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.099851" elapsed="0.006116"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.111774" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.111952" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:50.112099" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.106191" elapsed="0.005945"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.115871" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.112372" elapsed="0.003568"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.122233" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.122418" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:50.122603" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.117366" elapsed="0.005289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.126471" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.123017" elapsed="0.003525"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.126761" elapsed="0.003624"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.132612" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.130636" elapsed="0.002006"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.132857" elapsed="0.002138"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:50.135051" elapsed="0.000044"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:50.116891" elapsed="0.018315"/>
</kw>
<msg time="2026-05-01T00:52:50.135290" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:50.116182" elapsed="0.019134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.135749" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.135500" elapsed="0.000294"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.136692" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:50.136768" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:50.136414" elapsed="0.000405"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.137234" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:50.137308" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:50.136981" elapsed="0.000350"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.137502" elapsed="0.000308"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.138147" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:50.137968" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.138543" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:50.138333" elapsed="0.000236"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.138724" elapsed="0.000303"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:50.136038" elapsed="0.003048"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:50.139236" elapsed="0.001468"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.145596" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.145729" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:50.145829" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.141265" elapsed="0.004590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.148646" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.146025" elapsed="0.002671"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.148900" elapsed="0.003226"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.157012" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.157172" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:50.157317" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.152355" elapsed="0.004999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.161021" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.157625" elapsed="0.003463"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.161307" elapsed="0.003604"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:50.168281" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:50.165034" elapsed="0.003312"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.165001" elapsed="0.003378"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.174093" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.174139" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.174238" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.168613" elapsed="0.005651"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:50.140965" elapsed="0.033364"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.179358" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.179540" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.179671" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.175346" elapsed="0.004360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.183301" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.179943" elapsed="0.003425"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.183607" elapsed="0.003503"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.218837" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.187336" elapsed="0.031583"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.219347" elapsed="0.005514"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:50.224992" elapsed="0.000085"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:50.175014" elapsed="0.050407"/>
</kw>
<msg time="2026-05-01T00:52:50.225694" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:50.174516" elapsed="0.051252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.226870" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.226183" elapsed="0.000801"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.229270" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:50.229491" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:50.228542" elapsed="0.001012"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.230110" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:50.230186" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:50.229850" elapsed="0.000362"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.230385" elapsed="0.000338"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.231073" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:50.230891" elapsed="0.000209"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:50.231433" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:50.231255" elapsed="0.000219"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.231633" elapsed="0.000311"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:50.227601" elapsed="0.004407"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.237074" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.237202" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.237298" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.232603" elapsed="0.004721"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.242961" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.237519" elapsed="0.005514"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.243258" elapsed="0.003634"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.251835" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.251948" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.252053" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.247127" elapsed="0.004953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.254748" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.252254" elapsed="0.002585"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.254998" elapsed="0.002660"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:50.261127" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-05-01T00:52:50.257745" elapsed="0.003474"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.257722" elapsed="0.003533"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.261492" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:50.232279" elapsed="0.029342"/>
</kw>
<arg>route_inc_lan</arg>
<status status="PASS" start="2026-05-01T00:52:50.077865" elapsed="0.183820"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:49.951416" elapsed="0.310424"/>
</test>
<test id="s1-s13-t45" name="Play_To_Odl_route_inc_lan" line="173">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:50.267353" elapsed="0.000323"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:50.266846" elapsed="0.000909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.269274" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:50.269116" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.269088" elapsed="0.000284"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.274495" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:50.274372" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.274355" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.275571" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:50.275174" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.276054" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:50.275759" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:50.276124" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:52:50.276282" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:50.274797" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.282167" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:50.282057" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.282038" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.283697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:50.283513" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.283494" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:50.284420" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:50.284012" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:50.285130" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:50.284863" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:50.318822" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:50.287045" elapsed="0.031907"/>
</kw>
<msg time="2026-05-01T00:52:50.319088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:50.319183" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.285517" elapsed="0.033736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:50.350028" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:50.321279" elapsed="0.028885"/>
</kw>
<msg time="2026-05-01T00:52:50.350298" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:50.350392" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.319684" elapsed="0.030856"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.351232" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.350860" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.350835" elapsed="0.000575"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.352153" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.351577" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.352827" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.352445" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.352425" elapsed="0.000578"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:50.353043" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:50.357162" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:52:50.357354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:50.356083" elapsed="0.001340"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.357657" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.357874" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:50.355303" elapsed="0.002794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:50.353340" elapsed="0.004842"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:50.283052" elapsed="0.075309"/>
</kw>
<msg time="2026-05-01T00:52:50.358472" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:50.358518" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.282393" elapsed="0.076163"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:50.358745" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:52:50.358636" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.358617" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.359313" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.359759" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:50.359834" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:50.281713" elapsed="0.078234"/>
</kw>
<msg time="2026-05-01T00:52:50.360041" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:50.360085" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.276701" elapsed="0.083420"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.360481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.360197" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.360180" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:50.276555" elapsed="0.084030"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:50.276362" elapsed="0.084257"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:50.274012" elapsed="0.086665"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:50.268602" elapsed="0.092133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:50.267968" elapsed="0.092837"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:50.263679" elapsed="0.097232"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.366877" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.367057" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.367189" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.361344" elapsed="0.005881"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:50.367481" elapsed="0.004236"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.378867" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.379015" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:50.379159" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:50.371953" elapsed="0.007243"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:50.383551" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.383108" elapsed="0.000482"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:50.384191" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:50.383812" elapsed="0.000417"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.384471" elapsed="0.000472"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:50.379550" elapsed="0.005480"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:50.361065" elapsed="0.024040"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:50.262986" elapsed="0.122175"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.386179" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.386403" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.385902" elapsed="0.000542"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.413266" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_lan.vanadium/route_inc_lan.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:50.412889" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.414080" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan.vanadium/route_inc_lan.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:50.413828" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan.vanadium/route_inc_lan.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:50.414293" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:50.413479" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.414896" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:50.414502" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.415227" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/route_inc_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.415354" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.415092" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.415805" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.415560" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:50.416237" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:50.415926" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.416796" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:50.416490" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:50.416321" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:50.415906" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.417495" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:50.417039" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:50.417578" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:52:50.417737" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:50.410588" elapsed="0.007176"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.418301" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/announce_route_inc_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/announce_route_inc_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.418425" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.417927" elapsed="0.000543"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:50.418824" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/withdraw_route_inc_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_lan/withdraw_route_inc_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:50.418944" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:50.418631" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.419370" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.419127" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.419858" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.419618" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.420341" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.420097" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:50.420827" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:50.420555" elapsed="0.000318"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:50.421025" elapsed="0.002582"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:50.423767" elapsed="0.001359"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:50.430289" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:50.430401" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:50.430512" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:50.426081" elapsed="0.004841">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.431185" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:50.431534" elapsed="0.000034"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:50.425759" elapsed="0.005948">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:52.441763" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:52.441995" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:52.442137" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:52.433432" elapsed="0.008744"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:52.442849" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:52.446083" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:52.442433" elapsed="0.003795"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:52.450756" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:52.450125" elapsed="0.000672"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:52.451594" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:52.451018" elapsed="0.000616"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:52.451860" elapsed="0.000461"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:52.446569" elapsed="0.005840"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:52.432387" elapsed="0.020120"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:50.425320" elapsed="2.027254"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:52.452798" elapsed="0.002771"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:52.459917" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:52.460026" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:52.460118" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:52.456498" elapsed="0.003646"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:52.460309" elapsed="0.003333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:52.469938" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:52.470101" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:52.470246" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:52.463877" elapsed="0.006406"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:52.474591" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:52.474172" elapsed="0.000458"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:52.475495" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:52.474849" elapsed="0.000687"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:52.476191" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:52.476539" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:52.475757" elapsed="0.000890">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:52.470627" elapsed="0.006231">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:52.456200" elapsed="0.020831">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.489903" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.490174" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.490346" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.480196" elapsed="0.010184"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.490682" elapsed="0.003317"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.499266" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.499427" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:54.499658" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.494177" elapsed="0.005536"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.504167" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.503734" elapsed="0.000473"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.504923" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.504437" elapsed="0.000626"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.505301" elapsed="0.000536"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.500076" elapsed="0.005861"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.478861" elapsed="0.027180"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:52.455755" elapsed="2.050358"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:54.506953" elapsed="0.002421"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.515747" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.515953" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.516137" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.510750" elapsed="0.005430"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.516478" elapsed="0.005135"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.529196" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.529328" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:54.529446" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.521915" elapsed="0.007642"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.533062" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.532732" elapsed="0.000359"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.533611" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.533249" elapsed="0.000398"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.533833" elapsed="0.000380"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.529833" elapsed="0.004449"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.510105" elapsed="0.024236"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:54.509651" elapsed="0.024733"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:54.506403" elapsed="0.028040"/>
</kw>
<arg>route_inc_lan</arg>
<status status="PASS" start="2026-05-01T00:52:50.385477" elapsed="4.149066"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:50.262326" elapsed="4.272338"/>
</test>
<test id="s1-s13-t46" name="Odl_To_Play_route_inc_mac" line="176">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:54.543192" elapsed="0.000407"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:54.542726" elapsed="0.001006"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.546010" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.545781" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.545735" elapsed="0.000487"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.551924" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.551789" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.551766" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.553171" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:54.552706" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.553768" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:54.553372" elapsed="0.000423"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:54.553842" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:52:54.554018" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:54.552280" elapsed="0.001764"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.560132" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.560005" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.559983" elapsed="0.000229"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.561856" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.561660" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.561641" elapsed="0.000383"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:54.562642" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:54.562181" elapsed="0.000526"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.563424" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:54.563144" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.596763" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:54.565393" elapsed="0.031602"/>
</kw>
<msg time="2026-05-01T00:52:54.597195" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:54.597292" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.563829" elapsed="0.033537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.627795" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:54.599570" elapsed="0.028474"/>
</kw>
<msg time="2026-05-01T00:52:54.628248" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:54.628347" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.597911" elapsed="0.030510"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.629274" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.628816" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.628777" elapsed="0.000697"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.630325" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.629671" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.630993" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.630640" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.630619" elapsed="0.000547"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:54.631208" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:54.634842" elapsed="0.000224"/>
</kw>
<msg time="2026-05-01T00:52:54.635110" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:54.634342" elapsed="0.000840"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.635402" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.635636" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:54.633576" elapsed="0.002283"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:54.631570" elapsed="0.004375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:54.561124" elapsed="0.075002"/>
</kw>
<msg time="2026-05-01T00:52:54.636223" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:54.636269" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.560389" elapsed="0.075918"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:54.636603" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:52:54.636387" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.636367" elapsed="0.000325"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.637171" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.637636" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.637711" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:54.559595" elapsed="0.078230"/>
</kw>
<msg time="2026-05-01T00:52:54.637921" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:54.637972" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.554446" elapsed="0.083564"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.638341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.638086" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.638069" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:54.554293" elapsed="0.084149"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:54.554106" elapsed="0.084400"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:54.551303" elapsed="0.087264"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:54.545058" elapsed="0.093569"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.544072" elapsed="0.094602"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:54.537985" elapsed="0.100746"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.646252" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.646403" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.646732" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.639300" elapsed="0.007460"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.646965" elapsed="0.002597"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.655164" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.655289" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:54.655403" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.649733" elapsed="0.005698"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.658743" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.658394" elapsed="0.000378"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.659201" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.658929" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.659389" elapsed="0.000378"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.655708" elapsed="0.004124"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.638885" elapsed="0.021003"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:54.537255" elapsed="0.122677"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.660741" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.660959" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.660531" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.661338" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.661479" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.661146" elapsed="0.000362"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.661896" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/announce_route_inc_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/announce_route_inc_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.662023" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.661705" elapsed="0.000344"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:54.662425" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:54.662209" elapsed="0.000242"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.662816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/withdraw_route_inc_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/withdraw_route_inc_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.662940" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.662626" elapsed="0.000340"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:54.663318" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:54.663121" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.663827" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.663572" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.664274" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.664037" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.664729" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.664490" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.665163" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.664926" elapsed="0.000282"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:54.665359" elapsed="0.002433"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.678348" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:54.678411" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.678530" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.667979" elapsed="0.010577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.681429" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.678731" elapsed="0.002758"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.688092" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.688270" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:54.688415" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.681685" elapsed="0.006795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.692166" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.688719" elapsed="0.003563"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.699634" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.699800" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:54.699933" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.693717" elapsed="0.006252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.703666" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.700206" elapsed="0.003529"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.703956" elapsed="0.003664"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.709909" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.707866" elapsed="0.002072"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.710122" elapsed="0.002149"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:54.712328" elapsed="0.000048"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:54.693194" elapsed="0.019314"/>
</kw>
<msg time="2026-05-01T00:52:54.712596" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:54.692545" elapsed="0.020077"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.713041" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.712794" elapsed="0.000292"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.714038" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:54.714114" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:54.713766" elapsed="0.000371"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.714562" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:54.714638" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:54.714293" elapsed="0.000368"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.714818" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.715482" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:54.715282" elapsed="0.000226"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.715835" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:54.715661" elapsed="0.000199"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.716014" elapsed="0.000303"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:54.713347" elapsed="0.003029"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:54.716542" elapsed="0.001737"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.729705" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.729935" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:54.730159" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.718839" elapsed="0.011380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.736773" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.730652" elapsed="0.006232"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.737253" elapsed="0.002998"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.746406" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.746582" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:54.746706" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.740421" elapsed="0.006312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.751270" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.746917" elapsed="0.004440"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.752076" elapsed="0.003698"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:54.759152" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.755904" elapsed="0.003319"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.755868" elapsed="0.003388"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.766501" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.766570" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.766720" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.759502" elapsed="0.007255"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:54.718559" elapsed="0.048297"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.773681" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.773873" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.774618" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.768260" elapsed="0.006398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.778525" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.774914" elapsed="0.003682"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.778830" elapsed="0.003821"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.785108" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.782903" elapsed="0.002276"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.785414" elapsed="0.002370"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:54.787839" elapsed="0.000043"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:54.767780" elapsed="0.020212"/>
</kw>
<msg time="2026-05-01T00:52:54.788076" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:54.767093" elapsed="0.021010"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.788538" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.788275" elapsed="0.000309"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.789489" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:54.789565" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:54.789214" elapsed="0.000394"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.790019" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:54.790093" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:54.789764" elapsed="0.000353"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.790273" elapsed="0.000323"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.790931" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:54.790754" elapsed="0.000202"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:54.791378" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:54.791208" elapsed="0.000195"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.791571" elapsed="0.000300"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:54.788835" elapsed="0.003096"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.796779" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.796912" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.797011" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.792526" elapsed="0.004511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.799902" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.797206" elapsed="0.002744"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.800106" elapsed="0.002515"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.807447" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.807690" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.807834" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.802785" elapsed="0.005087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.811517" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.808110" elapsed="0.003474"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.811802" elapsed="0.003628"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:54.818834" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-05-01T00:52:54.815568" elapsed="0.003360"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.815537" elapsed="0.003428"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.819186" elapsed="0.000031"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:54.792204" elapsed="0.027107"/>
</kw>
<arg>route_inc_mac</arg>
<status status="PASS" start="2026-05-01T00:52:54.660215" elapsed="0.159160"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.536784" elapsed="0.282768"/>
</test>
<test id="s1-s13-t47" name="Play_To_Odl_route_inc_mac" line="178">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:54.824574" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:54.824291" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.825930" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.825804" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.825782" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.831051" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.830940" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.830921" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.832136" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:54.831750" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.832718" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:54.832324" elapsed="0.000421"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:54.832788" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:52:54.832949" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:54.831354" elapsed="0.001619"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.838753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.838643" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.838625" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.840287" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:54.840105" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.840087" elapsed="0.000379"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:54.841041" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:54.840623" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.841773" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:54.841470" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.874721" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:54.843716" elapsed="0.031267"/>
</kw>
<msg time="2026-05-01T00:52:54.875389" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:54.875515" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.842148" elapsed="0.033443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:54.901667" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:54.877821" elapsed="0.024082"/>
</kw>
<msg time="2026-05-01T00:52:54.902092" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:54.902189" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.876095" elapsed="0.026169"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.903123" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.902628" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.902592" elapsed="0.000711"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.904132" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.903477" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.904822" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.904430" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.904409" elapsed="0.000586"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:54.905038" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:54.908784" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:52:54.908982" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:54.908175" elapsed="0.000879"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.909272" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.909506" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:54.907374" elapsed="0.002394"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:54.905385" elapsed="0.004470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:54.839655" elapsed="0.070377"/>
</kw>
<msg time="2026-05-01T00:52:54.910134" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:54.910178" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.838978" elapsed="0.071238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:54.910410" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:52:54.910297" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.910276" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.911009" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.911445" elapsed="0.000116"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:54.911612" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:54.838291" elapsed="0.073434"/>
</kw>
<msg time="2026-05-01T00:52:54.911821" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:54.911865" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.833356" elapsed="0.078548"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.912297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.912038" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.912019" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:54.833210" elapsed="0.079190"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:54.833031" elapsed="0.079405"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:54.830580" elapsed="0.081939"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:54.825474" elapsed="0.087122"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:54.825011" elapsed="0.087640"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:54.822084" elapsed="0.090624"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.922957" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.923141" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.923292" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.913141" elapsed="0.010187"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:54.923587" elapsed="0.003598"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.934091" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.934238" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:54.934380" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:54.927419" elapsed="0.006998"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.938808" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.938369" elapsed="0.000478"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:54.939444" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:54.939066" elapsed="0.000438"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.939727" elapsed="0.000476"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:54.934767" elapsed="0.005521"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.912862" elapsed="0.027501"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:54.821321" elapsed="0.119097"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.941430" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.941704" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.941142" elapsed="0.000655"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.971051" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_mac.vanadium/route_inc_mac.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:54.970675" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.971853" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac.vanadium/route_inc_mac.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:52:54.971605" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac.vanadium/route_inc_mac.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:52:54.972024" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:52:54.971247" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.972680" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:54.972254" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.973015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/route_inc_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.973146" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.972875" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.973589" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.973330" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:52:54.974127" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:54.973791" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.974712" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:52:54.974366" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.974215" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:54.973767" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.975401" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:52:54.974946" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:52:54.975496" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:52:54.975660" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:52:54.968346" elapsed="0.007340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.976044" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/announce_route_inc_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/announce_route_inc_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.976169" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.975850" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:54.976559" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/withdraw_route_inc_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_mac/withdraw_route_inc_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:54.976681" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:54.976351" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.977151" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.976908" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.977613" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.977358" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.978101" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.977863" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:54.978547" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:54.978296" elapsed="0.000296"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:54.978743" elapsed="0.003744"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:54.982652" elapsed="0.002853"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:54.993272" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:54.993431" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:54.993581" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:52:54.986608" elapsed="0.007533">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.994366" elapsed="0.000025"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:54.994647" elapsed="0.000027"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:52:54.986237" elapsed="0.008551">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:57.004604" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:57.004812" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:57.005088" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:56.996433" elapsed="0.008695"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:52:57.005854" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:52:57.009220" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:52:57.005421" elapsed="0.003871"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:57.015512" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:57.014972" elapsed="0.000570"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:57.016105" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:57.015706" elapsed="0.000428"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:57.016295" elapsed="0.000376"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:57.009639" elapsed="0.007097"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:52:56.995513" elapsed="0.021278"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:54.985710" elapsed="2.031127"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:57.016998" elapsed="0.002333"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:57.026646" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:57.026809" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:57.026943" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:57.020303" elapsed="0.006676"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:57.027212" elapsed="0.004128"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:57.037081" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:57.037283" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:52:57.037441" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:57.031598" elapsed="0.005914"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:57.042066" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:57.041543" elapsed="0.000564"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:57.043092" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:57.042385" elapsed="0.000748"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:52:57.043835" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:52:57.044151" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:52:57.043359" elapsed="0.000905">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:52:57.037843" elapsed="0.006643">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:52:57.020023" elapsed="0.024641">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.586623" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.586961" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.587287" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.046243" elapsed="0.541112"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.587861" elapsed="0.006770"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.603160" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.603583" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:59.603809" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.595246" elapsed="0.008613"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.609268" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.608761" elapsed="0.000554"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.609995" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.609584" elapsed="0.000451"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.610275" elapsed="0.000569"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.604346" elapsed="0.006593"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:59.045361" elapsed="0.565664"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:57.019559" elapsed="2.591526"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:52:59.611981" elapsed="0.002677"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.620725" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.620889" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.621041" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.616118" elapsed="0.004951"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.621301" elapsed="0.004409"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.631987" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.632261" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:59.632489" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.626033" elapsed="0.006512"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.638511" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.637944" elapsed="0.000638"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.639880" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.639043" elapsed="0.000879"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.640185" elapsed="0.000431"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.632991" elapsed="0.007802"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:59.615450" elapsed="0.025408"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:59.614897" elapsed="0.026006"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:52:59.611418" elapsed="0.029555"/>
</kw>
<arg>route_inc_mac</arg>
<status status="PASS" start="2026-05-01T00:52:54.940732" elapsed="4.700296"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:54.820665" elapsed="4.820484"/>
</test>
<test id="s1-s13-t48" name="Odl_To_Play_route_inc_rou" line="181">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:59.645868" elapsed="0.000265"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:59.645518" elapsed="0.000713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.647560" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.647387" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.647361" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.653123" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.652978" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.652953" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.654395" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:59.653941" elapsed="0.000483"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.654934" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:59.654611" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:59.655021" elapsed="0.000078"/>
</return>
<msg time="2026-05-01T00:52:59.655526" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:59.653530" elapsed="0.002041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.662402" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.662252" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.662222" elapsed="0.000291"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.664333" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.664140" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.664120" elapsed="0.000403"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:59.665137" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:59.664689" elapsed="0.000518"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:59.665860" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:59.665583" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:59.700150" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:59.668068" elapsed="0.032322"/>
</kw>
<msg time="2026-05-01T00:52:59.700615" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:59.700713" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.666244" elapsed="0.034542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:52:59.727762" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:59.703064" elapsed="0.024905"/>
</kw>
<msg time="2026-05-01T00:52:59.728151" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:52:59.728247" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.701262" elapsed="0.027057"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.729225" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:59.728696" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.728658" elapsed="0.000751"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.730228" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "i "n "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.729584" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.730906" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:59.730548" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.730527" elapsed="0.000557"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:52:59.731126" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:59.735265" elapsed="0.000160"/>
</kw>
<msg time="2026-05-01T00:52:59.735494" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:52:59.734516" elapsed="0.001056"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.735795" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.736011" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:52:59.733500" elapsed="0.002734"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:52:59.731485" elapsed="0.004838"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:59.663660" elapsed="0.072862"/>
</kw>
<msg time="2026-05-01T00:52:59.736625" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:59.736671" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.662750" elapsed="0.073961"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:52:59.736917" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:52:59.736799" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.736777" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.737563" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.737996" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.738071" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:59.661709" elapsed="0.076476"/>
</kw>
<msg time="2026-05-01T00:52:59.738281" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:52:59.738325" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.656136" elapsed="0.082229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.738713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:52:59.738441" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.738423" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:59.655922" elapsed="0.082892"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:59.655693" elapsed="0.083155"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:59.652448" elapsed="0.086460"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:59.647032" elapsed="0.091936"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.646433" elapsed="0.092583"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:59.642834" elapsed="0.096239"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.744786" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.744987" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.745163" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.739614" elapsed="0.005590"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.745875" elapsed="0.004597"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.755301" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.755438" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:52:59.755578" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.750764" elapsed="0.004843"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.758924" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.758584" elapsed="0.000369"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:52:59.759429" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.759122" elapsed="0.000350"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.759638" elapsed="0.000358"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.755869" elapsed="0.004191"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:59.739303" elapsed="0.020813"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:59.642232" elapsed="0.117930"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:59.760966" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:59.761150" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:59.760760" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:59.761544" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:59.761670" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:59.761337" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:59.762043" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/announce_route_inc_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/announce_route_inc_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:59.762168" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:59.761853" elapsed="0.000387"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:59.762631" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:59.762401" elapsed="0.000257"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:52:59.763011" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/withdraw_route_inc_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/withdraw_route_inc_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:52:59.763137" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:52:59.762818" elapsed="0.000345"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:52:59.763577" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:52:59.763357" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.764018" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.763767" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.764482" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.764228" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.764922" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.764686" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.765352" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.765117" elapsed="0.000278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:59.765559" elapsed="0.002623"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.777981" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '732', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:52:59.778097" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AxEAAhmZmZkAAQAAAAogKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.778267" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.768347" elapsed="0.009961"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.782953" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.778661" elapsed="0.004350"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.789502" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.789692" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:59.789854" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.783262" elapsed="0.006634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.793897" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.790175" elapsed="0.003797"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.800652" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.800830" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:59.800971" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.795552" elapsed="0.005460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.805023" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.801273" elapsed="0.003823"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.805325" elapsed="0.003491"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.811205" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.809055" elapsed="0.002214"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.811685" elapsed="0.003375"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:59.815148" elapsed="0.000065"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:59.794967" elapsed="0.020483"/>
</kw>
<msg time="2026-05-01T00:52:59.815609" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:59.794234" elapsed="0.021501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.816779" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.816221" elapsed="0.000629"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.818560" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:59.818744" level="INFO">${len_1} = 136</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:59.817961" elapsed="0.000837"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.819941" level="INFO">Length is 136.</msg>
<msg time="2026-05-01T00:52:59.820151" level="INFO">${len_2} = 136</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:59.819172" elapsed="0.001139"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.820703" elapsed="0.000792"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.822495" level="INFO">${sum_1} = 1836</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:59.822021" elapsed="0.000536"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.823363" level="INFO">${sum_2} = 1836</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:59.822931" elapsed="0.000500"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.823832" elapsed="0.000752"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:59.817323" elapsed="0.007416"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:52:59.825094" elapsed="0.002267"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.831871" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.832024" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:59.832130" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.828006" elapsed="0.004152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.835162" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.832344" elapsed="0.002870"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.835467" elapsed="0.003441"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.847201" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.847431" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:52:59.847634" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.839155" elapsed="0.008520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.851644" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","path-id":0,"inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.847949" elapsed="0.003767"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.851954" elapsed="0.003789"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:52:59.859400" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.855872" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.855836" elapsed="0.003758"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.866925" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.867056" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.867181" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.859831" elapsed="0.007379"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:59.827688" elapsed="0.039620"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.873406" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.873570" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.873674" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.868370" elapsed="0.005331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.877632" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.873889" elapsed="0.003816"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.877941" elapsed="0.003767"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.884524" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:52:59.881960" elapsed="0.002596"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.884739" elapsed="0.002179"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:52:59.886976" elapsed="0.000044"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:52:59.868016" elapsed="0.019119"/>
</kw>
<msg time="2026-05-01T00:52:59.887225" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:52:59.867514" elapsed="0.019739"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.887724" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.887470" elapsed="0.000300"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.888701" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:59.888777" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:59.888411" elapsed="0.000391"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.889216" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:52:59.889289" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:52:59.888958" elapsed="0.000355"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.889489" elapsed="0.000306"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.890131" level="INFO">${sum_1} = 1389</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:59.889953" elapsed="0.000204"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:52:59.890495" level="INFO">${sum_2} = 1389</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:52:59.890308" elapsed="0.000213"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:52:59.890674" elapsed="0.000300"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:52:59.888025" elapsed="0.003010"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.896238" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.896532" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.896679" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.891687" elapsed="0.005031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.901171" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.896975" elapsed="0.004278"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.901514" elapsed="0.003974"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:52:59.910876" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:52:59.911027" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:52:59.911156" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:52:59.905739" elapsed="0.005446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.914107" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:52:59.911427" elapsed="0.002732"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:52:59.914326" elapsed="0.003222"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:52:59.921264" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-05-01T00:52:59.917684" elapsed="0.003687"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.917648" elapsed="0.003760"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:52:59.921654" elapsed="0.000032"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:52:59.891362" elapsed="0.030429"/>
</kw>
<arg>route_inc_rou</arg>
<status status="PASS" start="2026-05-01T00:52:59.760442" elapsed="0.161422"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:59.641660" elapsed="0.280361"/>
</test>
<test id="s1-s13-t49" name="Play_To_Odl_route_inc_rou" line="183">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:52:59.926804" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:52:59.926528" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.928207" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.928090" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.928071" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.933511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.933382" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.933364" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.934609" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:52:59.934202" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:52:59.935097" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:52:59.934800" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:52:59.935166" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:52:59.935358" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:52:59.933820" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.941406" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.941294" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.941274" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:52:59.943057" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:52:59.942871" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:52:59.942852" elapsed="0.000403"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:52:59.943963" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:52:59.943508" elapsed="0.000521"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:52:59.944688" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:52:59.944397" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:52:59.988120" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:52:59.946786" elapsed="0.041497"/>
</kw>
<msg time="2026-05-01T00:52:59.988439" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:52:59.988559" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.945204" elapsed="0.043429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:00.018870" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:52:59.990664" elapsed="0.028368"/>
</kw>
<msg time="2026-05-01T00:53:00.019177" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:00.019272" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.989059" elapsed="0.030311"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.020150" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:00.019725" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:00.019696" elapsed="0.000638"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.021117" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "i "n "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.020505" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.021789" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:00.021419" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:00.021399" elapsed="0.000567"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:00.022008" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:00.025793" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:53:00.025987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:00.025166" elapsed="0.000892"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.026277" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.026514" elapsed="0.000025"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:00.024369" elapsed="0.002372"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:00.022340" elapsed="0.004487"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:52:59.942384" elapsed="0.084622"/>
</kw>
<msg time="2026-05-01T00:53:00.027106" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:00.027151" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.941658" elapsed="0.085533"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:00.027751" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:53:00.027637" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:00.027616" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.028484" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.028921" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:00.028996" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:52:59.940910" elapsed="0.088200"/>
</kw>
<msg time="2026-05-01T00:53:00.029207" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:00.029251" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.935865" elapsed="0.093423"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.029659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:00.029366" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:00.029349" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:52:59.935713" elapsed="0.094048"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:52:59.935525" elapsed="0.094271"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:52:59.933012" elapsed="0.096843"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:52:59.927778" elapsed="0.102137"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:52:59.927263" elapsed="0.102698"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:52:59.924218" elapsed="0.105798"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:00.035873" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:00.036014" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:00.036113" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:00.030448" elapsed="0.005692"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:00.036311" elapsed="0.002949"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:00.043543" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:00.043660" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:00.043768" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:00.039447" elapsed="0.004350"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:00.047041" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:00.046720" elapsed="0.000350"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:00.047545" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:00.047228" elapsed="0.000345"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:00.047733" elapsed="0.000347"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:00.044099" elapsed="0.004043"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:00.030169" elapsed="0.018031"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:52:59.923197" elapsed="0.125048"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:00.048991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:00.049182" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;42949...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:00.048786" elapsed="0.000425"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.074836" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_rou.vanadium/route_inc_rou.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:00.074417" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:00.075718" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou.vanadium/route_inc_rou.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:00.075430" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou.vanadium/route_inc_rou.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:00.075891" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:00.075045" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.076489" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:00.076087" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:00.076821" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/route_inc_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:00.076969" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:00.076682" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.077397" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.077155" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:00.077909" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:00.077546" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.078439" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:00.078147" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:00.077997" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:00.077520" elapsed="0.001026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.079142" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:00.078697" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:00.079284" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:00.079492" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:00.072096" elapsed="0.007424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:00.079885" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/announce_route_inc_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/announce_route_inc_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:00.080012" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:00.079686" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:00.080389" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/withdraw_route_inc_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_inc_rou/withdraw_route_inc_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:00.080527" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:00.080195" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.080953" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AxEAAhmZmZkAAQAAAAogKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;inc-multi-ethernet-tag-res&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
    &lt;/inc-multi-ethernet-tag-res&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.080710" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.081394" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.081159" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.081844" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.081609" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:00.082275" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:00.082037" elapsed="0.000282"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:00.082491" elapsed="0.002768"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:00.085443" elapsed="0.001584"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:00.093610" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:00.093755" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:00.093863" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:00.088249" elapsed="0.006021">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.094538" elapsed="0.000024"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:00.094780" elapsed="0.000025"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:00.087899" elapsed="0.007012">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:02.102331" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:02.102558" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '341'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:02.102698" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:02.096114" elapsed="0.006620"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:02.103432" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "inc-multi-ethernet-tag-res": {
          "orig-route-ip": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw==",
        "route-distinguisher": "429496729:1"
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:02.107584" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:02.103001" elapsed="0.004681"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:02.113585" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:02.112921" elapsed="0.000706"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:02.114421" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:02.113856" elapsed="0.000625"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:02.114711" elapsed="0.000481"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:02.108173" elapsed="0.007121"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:02.095399" elapsed="0.019981"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:00.087201" elapsed="2.028269"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:02.115706" elapsed="0.002815"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:02.128156" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:02.128365" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:02.128561" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:02.119940" elapsed="0.008660"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:02.128929" elapsed="0.003616"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:02.137518" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:02.137705" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '489'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AxEAAhmZmZkAAQAAAAogKysrKw==","inc-multi-ethernet-tag-res":{"orig-route-ip":"43.43.43.43","ethernet-tag-id":{"vlan-id":10}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:02.137857" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:02.132770" elapsed="0.005127"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:02.142444" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:02.141980" elapsed="0.000526"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:02.143411" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:02.142742" elapsed="0.000728"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:02.144251" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "inc-multi-ethernet-tag-res": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:02.144565" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:02.143708" elapsed="0.000972">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:02.138237" elapsed="0.006646">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:02.119570" elapsed="0.025490">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "inc-multi-ethernet-tag-res": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AxEAAhmZmZkAAQAAAAogKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.154653" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.154863" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.155027" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.146637" elapsed="0.008432"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.155355" elapsed="0.003958"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.164668" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.164857" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:04.165010" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.159606" elapsed="0.005443"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.169648" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.169181" elapsed="0.000509"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.170315" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.169917" elapsed="0.000441"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.170610" elapsed="0.000564"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.165397" elapsed="0.005895"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.145802" elapsed="0.025592"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:02.118793" elapsed="2.052697"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:04.172394" elapsed="0.002710"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.181869" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.182046" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.182200" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.176895" elapsed="0.005343"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.182498" elapsed="0.003758"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.191638" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.191870" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:04.192041" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.186563" elapsed="0.005523"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.196859" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.196353" elapsed="0.000549"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.197558" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.197128" elapsed="0.000479"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.197838" elapsed="0.000487"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.192433" elapsed="0.005983"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.176368" elapsed="0.022152"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:04.175385" elapsed="0.023192"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:04.171831" elapsed="0.026851"/>
</kw>
<arg>route_inc_rou</arg>
<status status="PASS" start="2026-05-01T00:53:00.048484" elapsed="4.150272"/>
</kw>
<status status="PASS" start="2026-05-01T00:52:59.922533" elapsed="4.276379"/>
</test>
<test id="s1-s13-t50" name="Odl_To_Play_route_mac_arb" line="186">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:04.203950" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:04.203667" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.205401" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.205262" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.205230" elapsed="0.000273"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.211024" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.210912" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.210892" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.212165" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:04.211755" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.212681" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:04.212357" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:04.212783" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:53:04.212982" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:04.211331" elapsed="0.001677"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.219144" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.219029" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.219011" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.220824" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.220600" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.220580" elapsed="0.000412"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:04.221628" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:04.221150" elapsed="0.000543"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.222374" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:04.222100" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.253534" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:04.224393" elapsed="0.029360"/>
</kw>
<msg time="2026-05-01T00:53:04.253948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:04.254048" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.222805" elapsed="0.031318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.278873" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:04.256426" elapsed="0.022602"/>
</kw>
<msg time="2026-05-01T00:53:04.279173" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:04.279270" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.254691" elapsed="0.024657"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.280148" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.279711" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.279679" elapsed="0.000657"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.281199" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.280518" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.281889" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.281526" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.281504" elapsed="0.000587"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:04.282139" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:04.285949" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:53:04.286142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:04.285421" elapsed="0.000805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.286488" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.286739" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:04.284579" elapsed="0.002387"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:04.282532" elapsed="0.004523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:04.220096" elapsed="0.067142"/>
</kw>
<msg time="2026-05-01T00:53:04.287340" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:04.287387" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.219401" elapsed="0.068039"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:04.288066" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:04.287691" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.287669" elapsed="0.000490"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.288695" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.289188" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.289321" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:04.218680" elapsed="0.070761"/>
</kw>
<msg time="2026-05-01T00:53:04.289579" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:04.289644" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.213414" elapsed="0.076274"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.290034" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.289771" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.289752" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:04.213257" elapsed="0.076882"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:04.213068" elapsed="0.077106"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:04.210515" elapsed="0.079734"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:04.204933" elapsed="0.085381"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.204426" elapsed="0.085939"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:04.201076" elapsed="0.089346"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.295947" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.296104" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.296235" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.290908" elapsed="0.005353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.296437" elapsed="0.003887"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.305558" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.305711" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:04.305859" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.300613" elapsed="0.005284"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.310698" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.310150" elapsed="0.000589"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.311361" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.310967" elapsed="0.000433"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.311669" elapsed="0.000474"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.306267" elapsed="0.005966"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.290607" elapsed="0.021764"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:04.200047" elapsed="0.112384"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.313902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.314186" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.313535" elapsed="0.000710"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.314988" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.315230" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.314599" elapsed="0.000683"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.315993" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/announce_route_mac_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/announce_route_mac_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.316230" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.315629" elapsed="0.000652"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:04.317095" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:04.316615" elapsed="0.000533"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.317755" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/withdraw_route_mac_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/withdraw_route_mac_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.317929" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.317484" elapsed="0.000482"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:04.318483" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:04.318192" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.319125" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.318761" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.319796" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.319444" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.320440" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.320088" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.321067" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.320728" elapsed="0.000446"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:04.321372" elapsed="0.002486"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.336968" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '938', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:04.337168" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.337496" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.324076" elapsed="0.013489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.343828" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.338060" elapsed="0.005833"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.349481" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.350077" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:04.350268" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.344126" elapsed="0.006188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.354783" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.350586" elapsed="0.004291"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.361940" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.362569" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:04.362785" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.356605" elapsed="0.006219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.366838" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.363067" elapsed="0.003844"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.367144" elapsed="0.003995"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.373591" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.371393" elapsed="0.002228"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.373808" elapsed="0.002217"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:04.376085" elapsed="0.000054"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:04.356037" elapsed="0.020215"/>
</kw>
<msg time="2026-05-01T00:53:04.376335" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:04.355170" elapsed="0.021191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.376852" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.376567" elapsed="0.000332"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.377846" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:04.377924" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:04.377567" elapsed="0.000382"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.378391" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:04.378490" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:04.378112" elapsed="0.000404"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.378703" elapsed="0.000321"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.379427" level="INFO">${sum_1} = 3514</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:04.379217" elapsed="0.000252"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.379839" level="INFO">${sum_2} = 3514</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:04.379630" elapsed="0.000235"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.380035" elapsed="0.000317"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:04.377142" elapsed="0.003272"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:04.380591" elapsed="0.002130"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.387516" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.387663" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:04.387765" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.383335" elapsed="0.004458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.391307" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.387970" elapsed="0.003470"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.391718" elapsed="0.003627"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.400278" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.400418" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:04.400555" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.395605" elapsed="0.004978"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.403261" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.400759" elapsed="0.002553"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.403491" elapsed="0.002575"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:04.408573" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.406161" elapsed="0.002462"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.406134" elapsed="0.002514"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.414790" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.414856" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.414997" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.408879" elapsed="0.006157"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:04.383034" elapsed="0.032098"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.422003" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.422177" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.422348" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.416579" elapsed="0.005811"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.426399" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.422683" elapsed="0.003805"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.426714" elapsed="0.003700"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.433058" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.430724" elapsed="0.002377"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.433346" elapsed="0.002222"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:04.435621" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:04.416075" elapsed="0.019690"/>
</kw>
<msg time="2026-05-01T00:53:04.435848" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:04.415370" elapsed="0.020511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.436361" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.436081" elapsed="0.000337"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.437364" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:04.437441" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:04.437091" elapsed="0.000390"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.437963" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:04.438060" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:04.437642" elapsed="0.000452"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.438309" elapsed="0.000412"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.439184" level="INFO">${sum_1} = 3067</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:04.438937" elapsed="0.000283"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:04.439683" level="INFO">${sum_2} = 3067</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:04.439422" elapsed="0.000292"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.439926" elapsed="0.000389"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:04.436689" elapsed="0.003700"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.445600" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.445721" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.445820" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.441178" elapsed="0.004669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.448828" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.446022" elapsed="0.002857"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.449037" elapsed="0.002850"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.456310" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.456493" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.456750" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.452069" elapsed="0.004751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.460609" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.457065" elapsed="0.003614"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.461019" elapsed="0.004153"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:04.468856" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-05-01T00:53:04.465293" elapsed="0.003695"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.465262" elapsed="0.003779"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.469291" elapsed="0.000046"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:04.440751" elapsed="0.028729"/>
</kw>
<arg>route_mac_arb</arg>
<status status="PASS" start="2026-05-01T00:53:04.312931" elapsed="0.156622"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.199345" elapsed="0.270368"/>
</test>
<test id="s1-s13-t51" name="Play_To_Odl_route_mac_arb" line="188">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:04.474944" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:04.474594" elapsed="0.000683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.476563" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.476427" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.476404" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.482679" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.482543" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.482518" elapsed="0.000256"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.484039" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:04.483592" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.484608" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:04.484257" elapsed="0.000387"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:04.484707" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:53:04.485012" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:04.483081" elapsed="0.001971"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.491905" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.491790" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.491771" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.493730" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:04.493537" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.493518" elapsed="0.000383"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:04.494780" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:04.494058" elapsed="0.000810"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.495538" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:04.495241" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.528160" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:04.497620" elapsed="0.030768"/>
</kw>
<msg time="2026-05-01T00:53:04.528605" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:04.528710" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.495915" elapsed="0.032871"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:04.555644" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:04.531006" elapsed="0.024863"/>
</kw>
<msg time="2026-05-01T00:53:04.556042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:04.556144" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.529305" elapsed="0.026916"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.557069" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.556591" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.556554" elapsed="0.000704"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.558098" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "a "r "b "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.557418" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.558806" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.558423" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.558401" elapsed="0.000585"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:04.559031" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:04.562952" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:53:04.563150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:04.562324" elapsed="0.000898"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.563446" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.563688" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:04.561531" elapsed="0.002382"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:04.559401" elapsed="0.004605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:04.493049" elapsed="0.071138"/>
</kw>
<msg time="2026-05-01T00:53:04.564287" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:04.564333" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.492183" elapsed="0.072190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:04.564583" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:53:04.564468" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.564432" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.565241" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.565777" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:04.565853" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:04.491416" elapsed="0.074555"/>
</kw>
<msg time="2026-05-01T00:53:04.566071" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:04.566117" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.485566" elapsed="0.080592"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.566546" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.566255" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.566232" elapsed="0.000396"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:04.485388" elapsed="0.081264"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:04.485137" elapsed="0.081604"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:04.482048" elapsed="0.084759"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:04.476065" elapsed="0.090802"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:04.475505" elapsed="0.091410"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:04.471642" elapsed="0.095329"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.572313" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.572479" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.572585" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.567416" elapsed="0.005195"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:04.572786" elapsed="0.003037"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.580503" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.580681" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:04.580882" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:04.575996" elapsed="0.004932"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.585716" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.585235" elapsed="0.000524"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:04.586422" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:04.585993" elapsed="0.000491"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.586729" elapsed="0.000512"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:04.581293" elapsed="0.006040"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.567126" elapsed="0.020289"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:04.470940" elapsed="0.116558"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.588598" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.588881" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.588271" elapsed="0.000661"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.615006" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_arb.vanadium/route_mac_arb.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:04.614565" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.615997" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb.vanadium/route_mac_arb.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:04.615717" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb.vanadium/route_mac_arb.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:04.616174" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:04.615323" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.616784" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:04.616374" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.617165" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/route_mac_arb.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.617331" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.617021" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.617786" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.617538" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:04.618290" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:04.617920" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.618842" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:04.618547" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.618380" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:04.617895" elapsed="0.001031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.619544" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:04.619078" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:04.619626" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:04.619795" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:04.612088" elapsed="0.007734"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.620184" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/announce_route_mac_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/announce_route_mac_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.620316" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.619987" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:04.620773" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/withdraw_route_mac_arb.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_arb/withdraw_route_mac_arb.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:04.620931" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:04.620567" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.621364" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.621118" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.621884" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.621643" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.622323" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.622087" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:04.622771" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:04.622535" elapsed="0.000281"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:04.622968" elapsed="0.002800"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:04.625953" elapsed="0.002014"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:04.634592" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:04.634803" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:04.634967" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:04.629526" elapsed="0.006036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.635866" elapsed="0.000035"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:04.636233" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:04.628994" elapsed="0.007431">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:06.644586" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:06.644789" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:06.644934" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:06.637701" elapsed="0.007271"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:06.645676" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:06.648946" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:06.645229" elapsed="0.003787"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:06.653836" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:06.653066" elapsed="0.000813"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:06.654658" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:06.654115" elapsed="0.000571"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:06.654845" elapsed="0.000330"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:06.649337" elapsed="0.005899"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:06.636984" elapsed="0.018307"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:04.628259" elapsed="2.027078"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:06.655510" elapsed="0.002805"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:06.663516" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:06.663687" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:06.663821" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:06.659250" elapsed="0.004607"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:06.664093" elapsed="0.003938"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:06.673803" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:06.674447" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '599'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:06.674621" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:06.668263" elapsed="0.006395"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:06.679141" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:06.678733" elapsed="0.000448"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:06.680188" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:06.679403" elapsed="0.000825"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:06.681000" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mpls-label1": 24002,
       "mpls-label2": 24003
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:06.681316" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:06.680550" elapsed="0.000873">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:06.674986" elapsed="0.006714">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:06.658975" elapsed="0.022933">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.690908" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.691104" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.691252" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.683548" elapsed="0.007741"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.691562" elapsed="0.003656"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.700246" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.700497" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:08.700647" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.695478" elapsed="0.005206"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.705096" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.704648" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.705778" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.705364" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.706045" elapsed="0.000743"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.701015" elapsed="0.005865"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:08.682669" elapsed="0.024286"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:06.658535" elapsed="2.048474"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:08.707796" elapsed="0.002591"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.715360" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.715509" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.715622" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.711619" elapsed="0.004029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.715820" elapsed="0.002693"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.723578" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.723743" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:08.723898" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.718765" elapsed="0.005171"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.728762" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.728260" elapsed="0.000545"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.729508" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.729045" elapsed="0.000508"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.729789" elapsed="0.000527"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.724293" elapsed="0.006218"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:08.711055" elapsed="0.019540"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:08.710618" elapsed="0.020035"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:08.707276" elapsed="0.023460"/>
</kw>
<arg>route_mac_arb</arg>
<status status="PASS" start="2026-05-01T00:53:04.587828" elapsed="4.142980"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:04.470185" elapsed="4.260787"/>
</test>
<test id="s1-s13-t52" name="Odl_To_Play_route_mac_as" line="191">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:08.737187" elapsed="0.000328"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:08.736795" elapsed="0.000820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:08.739014" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:08.738883" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.738858" elapsed="0.000235"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:08.745815" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:08.745696" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.745676" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.747000" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:08.746592" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.747506" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:08.747191" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:08.747576" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:53:08.747743" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:08.746136" elapsed="0.001631"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:08.753478" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:08.753345" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.753325" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:08.755121" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:08.754937" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.754918" elapsed="0.000367"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:08.755884" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:08.755440" elapsed="0.000506"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:08.756581" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:08.756295" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:08.788166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:08.758563" elapsed="0.029841"/>
</kw>
<msg time="2026-05-01T00:53:08.788633" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:08.788736" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:08.756949" elapsed="0.031873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:08.818112" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:08.791197" elapsed="0.027186"/>
</kw>
<msg time="2026-05-01T00:53:08.818615" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:08.818712" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:08.789314" elapsed="0.029471"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.819710" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:08.819139" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.819097" elapsed="0.000801"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.820756" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.820053" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.821413" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:08.821056" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.821035" elapsed="0.000610"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:08.821690" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:08.825706" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:53:08.825903" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:08.824945" elapsed="0.001029"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.826230" elapsed="0.000050"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.826497" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:08.824135" elapsed="0.002696"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:08.822040" elapsed="0.004886"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:08.754439" elapsed="0.072671"/>
</kw>
<msg time="2026-05-01T00:53:08.827208" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:08.827254" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:08.753709" elapsed="0.073584"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:08.827786" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:53:08.827373" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.827353" elapsed="0.000526"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.828365" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.828842" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:08.828918" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:08.752997" elapsed="0.076035"/>
</kw>
<msg time="2026-05-01T00:53:08.829126" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:08.829170" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:08.748157" elapsed="0.081050"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.829558" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:08.829283" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.829265" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:08.748008" elapsed="0.081653"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:08.747824" elapsed="0.081871"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:08.745288" elapsed="0.084464"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:08.738577" elapsed="0.091232"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:08.737863" elapsed="0.091993"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:08.733515" elapsed="0.096396"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.835612" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.835760" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.835877" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.830417" elapsed="0.005486"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.836074" elapsed="0.002821"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.843299" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.843492" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:08.843641" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.839074" elapsed="0.004606"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.848252" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.847806" elapsed="0.000487"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:08.848974" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.848571" elapsed="0.000444"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.849244" elapsed="0.000527"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.844010" elapsed="0.005854"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:08.830108" elapsed="0.019836"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:08.732380" elapsed="0.117623"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:08.851203" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:08.851473" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:08.850917" elapsed="0.000599"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:08.852040" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:08.852222" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:08.851754" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:08.852806" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/announce_route_mac_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/announce_route_mac_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:08.853010" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:08.852530" elapsed="0.000568"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:08.853660" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:08.853332" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:08.854223" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/withdraw_route_mac_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/withdraw_route_mac_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:08.854481" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:08.853927" elapsed="0.000604"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:08.855071" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:08.854773" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.855765" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.855369" elapsed="0.000480"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.856486" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.856073" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.857181" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.856814" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.857857" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.857514" elapsed="0.000418"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:08.858154" elapsed="0.002382"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.870227" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '986', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:08.870366" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.870605" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.860744" elapsed="0.009900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.874432" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.870889" elapsed="0.003628"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.879541" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.880108" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:08.880265" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.874754" elapsed="0.005566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.884164" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.880592" elapsed="0.003643"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.891055" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.891648" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:08.891792" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.885683" elapsed="0.006146"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.895608" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.892071" elapsed="0.003615"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.895932" elapsed="0.003636"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.901702" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.899803" elapsed="0.001929"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.901911" elapsed="0.002239"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:08.904206" elapsed="0.000044"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:08.885192" elapsed="0.019165"/>
</kw>
<msg time="2026-05-01T00:53:08.904437" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:08.884504" elapsed="0.019982"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.904965" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.904677" elapsed="0.000335"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.905936" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:08.906012" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:08.905663" elapsed="0.000373"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.906522" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:08.906599" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:08.906207" elapsed="0.000416"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.906800" elapsed="0.000314"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.907543" level="INFO">${sum_1} = 3738</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:08.907318" elapsed="0.000252"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.907944" level="INFO">${sum_2} = 3738</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:08.907727" elapsed="0.000243"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.908130" elapsed="0.000310"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:08.905251" elapsed="0.003269"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:08.908673" elapsed="0.001745"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.915683" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.915825" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:08.915937" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.910965" elapsed="0.004999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.918855" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.916139" elapsed="0.002767"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.919065" elapsed="0.003625"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.928955" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.929075" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:08.929181" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.922927" elapsed="0.006282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.932004" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.929416" elapsed="0.002640"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.932218" elapsed="0.002611"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:08.937311" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:08.934916" elapsed="0.002443"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.934893" elapsed="0.002491"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.943625" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.943715" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.943864" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.937555" elapsed="0.006346"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:08.910686" elapsed="0.033309"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.950483" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.950643" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.950776" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.945389" elapsed="0.005423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.954555" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.951054" elapsed="0.003576"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.954876" elapsed="0.003658"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.960964" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:08.958772" elapsed="0.002234"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.961283" elapsed="0.003132"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:08.964514" elapsed="0.000064"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:08.944901" elapsed="0.019830"/>
</kw>
<msg time="2026-05-01T00:53:08.964845" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:08.944225" elapsed="0.020657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.965503" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.965119" elapsed="0.000458"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.966934" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:08.967041" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:08.966530" elapsed="0.000545"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.967627" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:08.967740" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:08.967300" elapsed="0.000465"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.967947" elapsed="0.000314"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.968632" level="INFO">${sum_1} = 3291</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:08.968423" elapsed="0.000235"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:08.969025" level="INFO">${sum_2} = 3291</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:08.968814" elapsed="0.000238"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:08.969211" elapsed="0.000330"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:08.965928" elapsed="0.003676"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.975274" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.975417" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.975598" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.970186" elapsed="0.005455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.979774" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.975888" elapsed="0.003976"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.980093" elapsed="0.003672"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:08.989335" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:08.989475" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:08.989583" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:08.984025" elapsed="0.005584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:08.992217" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:08.989780" elapsed="0.002484"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:08.992418" elapsed="0.002525"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:08.997361" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:53:08.995023" elapsed="0.002403"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:08.995002" elapsed="0.002468"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:08.997840" elapsed="0.000053"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:08.969859" elapsed="0.028193"/>
</kw>
<arg>route_mac_as</arg>
<status status="PASS" start="2026-05-01T00:53:08.850437" elapsed="0.147723"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:08.731614" elapsed="0.266951"/>
</test>
<test id="s1-s13-t53" name="Play_To_Odl_route_mac_as" line="193">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:09.003309" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:09.003039" elapsed="0.000582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:09.004695" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:09.004561" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.004540" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:09.011022" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:09.010867" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.010841" elapsed="0.000294"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.012870" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:09.012086" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.013838" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:09.013231" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:09.013977" elapsed="0.000061"/>
</return>
<msg time="2026-05-01T00:53:09.014284" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:09.011509" elapsed="0.002850"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:09.024316" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:09.024153" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.024123" elapsed="0.000302"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:09.026692" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:09.026406" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.026373" elapsed="0.000537"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:09.027767" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:09.027119" elapsed="0.000735"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:09.028762" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:09.028358" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:09.060932" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:09.031663" elapsed="0.029563"/>
</kw>
<msg time="2026-05-01T00:53:09.061514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:09.061666" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:09.029295" elapsed="0.032482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:09.089634" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:09.064789" elapsed="0.025090"/>
</kw>
<msg time="2026-05-01T00:53:09.090105" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:09.090248" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:09.062507" elapsed="0.027875"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.091507" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:09.090879" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.090836" elapsed="0.000949"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.092951" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.092032" elapsed="0.001115"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.094126" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:09.093590" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.093558" elapsed="0.000857"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:09.094517" elapsed="0.000060"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:09.099811" elapsed="0.000205"/>
</kw>
<msg time="2026-05-01T00:53:09.100079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:09.099096" elapsed="0.001081"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.100682" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.101015" elapsed="0.000034"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:09.097916" elapsed="0.003418"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:09.095001" elapsed="0.006484"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:09.025685" elapsed="0.076065"/>
</kw>
<msg time="2026-05-01T00:53:09.101892" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:09.101956" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:09.024686" elapsed="0.077327"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:09.102295" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-05-01T00:53:09.102135" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.102105" elapsed="0.000369"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.103175" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.103865" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:09.103976" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:09.023658" elapsed="0.080484"/>
</kw>
<msg time="2026-05-01T00:53:09.104280" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:09.104347" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:09.015170" elapsed="0.089235"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.104922" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:09.104548" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.104520" elapsed="0.000511"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:09.014854" elapsed="0.090210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:09.014502" elapsed="0.090609"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:09.010283" elapsed="0.094913"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:09.004227" elapsed="0.101055"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:09.003778" elapsed="0.101581"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:09.000783" elapsed="0.104663"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:09.113277" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:09.113507" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:09.113741" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:09.106090" elapsed="0.007691"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:09.114055" elapsed="0.004431"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:09.123965" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:09.124085" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:09.124194" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:09.118751" elapsed="0.005470"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:09.127411" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:09.127093" elapsed="0.000347"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:09.127906" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:09.127625" elapsed="0.000309"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:09.128098" elapsed="0.000345"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:09.124500" elapsed="0.004025"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:09.105669" elapsed="0.022912"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:09.000170" elapsed="0.128452"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:09.129358" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:09.129538" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:09.129153" elapsed="0.000414"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.158166" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_as.vanadium/route_mac_as.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:09.157686" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:09.159111" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as.vanadium/route_mac_as.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:09.158824" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as.vanadium/route_mac_as.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:09.159291" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:09.158435" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.159911" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:09.159509" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:09.160252" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/route_mac_as.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:09.160417" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:09.160107" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.160954" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.160699" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:09.161492" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:09.161093" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.162048" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:09.161741" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:09.161586" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:09.161066" elapsed="0.001068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.162941" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:09.162289" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:09.163039" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:53:09.163226" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:09.155192" elapsed="0.008061"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:09.163641" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/announce_route_mac_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/announce_route_mac_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:09.163792" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:09.163422" elapsed="0.000396"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:09.164170" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/withdraw_route_mac_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_as/withdraw_route_mac_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:09.164290" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:09.163978" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.164806" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;as-generated&gt;
            &lt;as&gt;16843009&lt;/as&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/as-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.164536" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.165258" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.165020" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.165722" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.165475" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:09.166211" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:09.165968" elapsed="0.000288"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:09.166431" elapsed="0.002902"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:09.169523" elapsed="0.001846"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:09.177486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:09.177670" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:09.177814" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:09.172401" elapsed="0.005929">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.178678" elapsed="0.000033"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:09.179013" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:09.172059" elapsed="0.007131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:11.188503" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:11.188703" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:11.188848" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:11.180978" elapsed="0.007907"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:11.189564" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "as-generated": {
            "as": 16843009,
            "local-discriminator": 2000
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:11.192854" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:11.189144" elapsed="0.003781"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:11.197630" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:11.196927" elapsed="0.000745"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:11.198536" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:11.197898" elapsed="0.000678"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:11.198802" elapsed="0.000499"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:11.193244" elapsed="0.006146"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:11.180056" elapsed="0.019433"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:09.171572" elapsed="2.027984"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:11.199786" elapsed="0.003180"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:11.208079" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:11.208209" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:11.208315" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:11.203936" elapsed="0.004406"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:11.208541" elapsed="0.002949"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:11.216917" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:11.217621" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '616'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","as-generated":{"as":16843009,"local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:11.217777" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:11.211712" elapsed="0.006104"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:11.222282" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:11.221858" elapsed="0.000465"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:11.223308" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:11.222564" elapsed="0.000785"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:11.224065" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "as-generated": {
        "as": 16843009,
        "local-discriminator": 2000
       },
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mpls-label1": 24002,
       "mpls-label2": 24003
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:11.224485" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "as-generated": {
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:11.223597" elapsed="0.001000">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:11.218157" elapsed="0.006677">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:11.203657" elapsed="0.021388">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "as": 16843009,
+        "local-discriminator": 2000
+       },
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.233914" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.234104" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.234252" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.226560" elapsed="0.007729"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.234568" elapsed="0.003709"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.243591" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.243769" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:13.243916" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.238539" elapsed="0.005412"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.248377" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.247953" elapsed="0.000464"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.249058" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.248669" elapsed="0.000428"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.249320" elapsed="0.000492"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.244280" elapsed="0.005620"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.225734" elapsed="0.024243"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:11.203172" elapsed="2.046861"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:13.250817" elapsed="0.003436"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.261793" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.261967" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.262120" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.256057" elapsed="0.006099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.262393" elapsed="0.003653"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.271592" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.271797" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:13.271950" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.266347" elapsed="0.005641"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.276443" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.276020" elapsed="0.000483"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.277112" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.276732" elapsed="0.000419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.277369" elapsed="0.000487"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.272329" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.255203" elapsed="0.022817"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:13.254581" elapsed="0.023494"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:13.250298" elapsed="0.027853"/>
</kw>
<arg>route_mac_as</arg>
<status status="PASS" start="2026-05-01T00:53:09.128846" elapsed="4.149372"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:08.999626" elapsed="4.278745"/>
</test>
<test id="s1-s13-t54" name="Odl_To_Play_route_mac_lacp" line="196">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:13.283899" elapsed="0.000326"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:13.283441" elapsed="0.000864"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.285860" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.285688" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.285656" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.291858" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.291711" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.291693" elapsed="0.000243"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.293124" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:13.292584" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.293632" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:13.293315" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:13.293705" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:13.293873" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:13.292182" elapsed="0.001718"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.299897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.299780" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.299758" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.301505" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.301291" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.301273" elapsed="0.000399"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:13.302255" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:13.301829" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.303164" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:13.302885" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.336060" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:13.305202" elapsed="0.030993"/>
</kw>
<msg time="2026-05-01T00:53:13.336334" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:13.336429" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.303561" elapsed="0.032967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.361198" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:13.338533" elapsed="0.022853"/>
</kw>
<msg time="2026-05-01T00:53:13.361579" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:13.361676" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.336938" elapsed="0.024813"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.362554" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.362092" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.362058" elapsed="0.000679"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.363541" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.362893" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.364322" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.363960" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.363938" elapsed="0.000576"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:13.364557" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:13.368326" elapsed="0.000175"/>
</kw>
<msg time="2026-05-01T00:53:13.368546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:13.367729" elapsed="0.000895"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.368872" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.369098" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:13.366890" elapsed="0.002427"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:13.364881" elapsed="0.004521"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:13.300838" elapsed="0.068761"/>
</kw>
<msg time="2026-05-01T00:53:13.369697" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:13.369742" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.300132" elapsed="0.069648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:13.369969" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:53:13.369859" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.369840" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.370558" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.370993" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.371069" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:13.299367" elapsed="0.071816"/>
</kw>
<msg time="2026-05-01T00:53:13.371279" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:13.371323" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.294291" elapsed="0.077072"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.371895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.371439" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.371422" elapsed="0.000552"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:13.294141" elapsed="0.077857"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:13.293957" elapsed="0.078074"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:13.291327" elapsed="0.080764"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:13.285237" elapsed="0.086913"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.284583" elapsed="0.087614"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:13.280319" elapsed="0.091935"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.379033" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.379180" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.379345" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.372716" elapsed="0.006657"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.379571" elapsed="0.003258"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.388824" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.388975" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:13.389119" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.383065" elapsed="0.006091"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.393551" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.393088" elapsed="0.000504"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.394200" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.393822" elapsed="0.000417"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.394481" elapsed="0.000457"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.389514" elapsed="0.005510"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.372417" elapsed="0.022681"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:13.279602" elapsed="0.115553"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.396280" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.396564" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.396000" elapsed="0.000607"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.397105" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.397312" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.396836" elapsed="0.000523"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.397915" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/announce_route_mac_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/announce_route_mac_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.398109" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.397615" elapsed="0.000531"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:13.398696" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:13.398369" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.399344" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/withdraw_route_mac_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/withdraw_route_mac_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.399539" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.399081" elapsed="0.000538"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:13.400183" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:13.399895" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.400770" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.400446" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.401223" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.400984" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.401679" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.401426" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.402110" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.401876" elapsed="0.000278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:13.402339" elapsed="0.002790"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.413542" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1035', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:13.413637" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.413778" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.405294" elapsed="0.008520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.419907" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.414069" elapsed="0.005914"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.425589" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.426311" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '498'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:13.426509" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.420261" elapsed="0.006290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.430702" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.426842" elapsed="0.003937"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.436647" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.437081" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '498'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:13.437183" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.432362" elapsed="0.004847"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.439934" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.437384" elapsed="0.002601"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.440145" elapsed="0.002558"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.445593" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.442894" elapsed="0.002740"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.445924" elapsed="0.003431"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:13.449439" elapsed="0.000082"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:13.431849" elapsed="0.017837"/>
</kw>
<msg time="2026-05-01T00:53:13.449808" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:13.431052" elapsed="0.018795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.450545" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.450120" elapsed="0.000495"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.452167" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:13.452296" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:13.451678" elapsed="0.000656"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.453059" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:13.453170" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:13.452630" elapsed="0.000575"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.453440" elapsed="0.000479"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.454541" level="INFO">${sum_1} = 4546</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:13.454231" elapsed="0.000348"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.455120" level="INFO">${sum_2} = 4546</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:13.454807" elapsed="0.000363"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.455448" elapsed="0.000522"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:13.451022" elapsed="0.005041"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:13.456290" elapsed="0.002029"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.464950" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.465147" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '498'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:13.465291" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.459112" elapsed="0.006211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.468611" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.465602" elapsed="0.003065"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.468919" elapsed="0.003890"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.478358" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.478615" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '498'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:13.478777" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.473075" elapsed="0.005731"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.481697" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.479042" elapsed="0.002708"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.481920" elapsed="0.002642"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:13.487071" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.484673" elapsed="0.002520"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.484640" elapsed="0.002580"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.493346" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.493411" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.493574" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.487391" elapsed="0.006212"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:13.458706" elapsed="0.034987"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.500096" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.500316" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.500500" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.494818" elapsed="0.005724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.504706" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.500837" elapsed="0.003944"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.505157" elapsed="0.003799"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.511693" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.509204" elapsed="0.002534"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.512079" elapsed="0.003457"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:13.515627" elapsed="0.000063"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:13.494437" elapsed="0.021443"/>
</kw>
<msg time="2026-05-01T00:53:13.516009" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:13.493901" elapsed="0.022149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.516700" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.516307" elapsed="0.000463"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.518141" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:13.518253" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:13.517740" elapsed="0.000548"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.519001" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:13.519112" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:13.518550" elapsed="0.000597"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.519383" elapsed="0.000560"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.520506" level="INFO">${sum_1} = 4099</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:13.520182" elapsed="0.000364"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:13.520939" level="INFO">${sum_2} = 4099</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:13.520754" elapsed="0.000210"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.521212" elapsed="0.000329"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:13.517133" elapsed="0.004506"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.526788" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.526935" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.527038" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.522276" elapsed="0.004789"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.530874" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.527256" elapsed="0.003691"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.531187" elapsed="0.003898"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.540366" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.540537" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.540657" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.535338" elapsed="0.005347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.543400" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.540877" elapsed="0.002585"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.543625" elapsed="0.002615"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:13.548774" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-05-01T00:53:13.546338" elapsed="0.002541"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.546310" elapsed="0.002608"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.549157" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:13.521954" elapsed="0.027345"/>
</kw>
<arg>route_mac_lacp</arg>
<status status="PASS" start="2026-05-01T00:53:13.395551" elapsed="0.153820"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.278945" elapsed="0.270617"/>
</test>
<test id="s1-s13-t55" name="Play_To_Odl_route_mac_lacp" line="198">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:13.555238" elapsed="0.000334"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:13.554838" elapsed="0.000818"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.557088" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.556962" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.556937" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.562408" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.562110" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.562091" elapsed="0.000423"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.563558" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:13.563145" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.564102" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:13.563749" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:13.564174" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:53:13.564349" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:13.562759" elapsed="0.001616"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.570275" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.570159" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.570139" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.571944" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:13.571712" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.571693" elapsed="0.000421"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:13.572719" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:13.572271" elapsed="0.000512"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.573406" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:13.573137" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.603434" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:13.575367" elapsed="0.028350"/>
</kw>
<msg time="2026-05-01T00:53:13.603950" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:13.604049" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.573801" elapsed="0.030323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:13.628944" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:13.606478" elapsed="0.022651"/>
</kw>
<msg time="2026-05-01T00:53:13.629303" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:13.629401" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.604629" elapsed="0.024874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.630283" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.629851" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.629815" elapsed="0.000668"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.631264" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "c "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.630643" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.632022" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.631583" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.631561" elapsed="0.000645"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:13.632251" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:13.636051" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:53:13.636244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:13.635419" elapsed="0.000895"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.636618" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.636839" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:13.634653" elapsed="0.002434"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:13.632609" elapsed="0.004593"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:13.571224" elapsed="0.066162"/>
</kw>
<msg time="2026-05-01T00:53:13.637515" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:13.637562" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.570540" elapsed="0.067058"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:13.637790" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:53:13.637679" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.637659" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.638352" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.638812" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:13.638886" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:13.569796" elapsed="0.069203"/>
</kw>
<msg time="2026-05-01T00:53:13.639095" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:13.639138" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.564783" elapsed="0.074391"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.639523" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.639252" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.639234" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:13.564634" elapsed="0.075024"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:13.564433" elapsed="0.075264"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:13.561746" elapsed="0.078011"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:13.556653" elapsed="0.083164"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:13.555921" elapsed="0.083977"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:13.551492" elapsed="0.088464"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.645678" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.645862" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.646001" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.640394" elapsed="0.005643"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:13.646280" elapsed="0.004466"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.656707" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.656837" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:13.656949" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:13.651078" elapsed="0.005899"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.660172" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.659835" elapsed="0.000364"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:13.660653" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:13.660357" elapsed="0.000326"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.660844" elapsed="0.000351"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:13.657233" elapsed="0.004025"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.640112" elapsed="0.021202"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:13.550736" elapsed="0.110620"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.662106" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.662274" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.661899" elapsed="0.000403"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.690336" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_lacp.vanadium/route_mac_lacp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:13.689946" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.691175" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp.vanadium/route_mac_lacp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:13.690915" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp.vanadium/route_mac_lacp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:13.691348" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:13.690555" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.691967" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:13.691562" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.692295" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/route_mac_lacp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.692436" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.692159" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.692892" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.692641" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:13.693428" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:13.693078" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.693977" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:13.693683" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.693532" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:13.693054" elapsed="0.001007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.694673" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:13.694212" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:13.694754" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:53:13.694919" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:13.687615" elapsed="0.007330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.695305" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/announce_route_mac_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/announce_route_mac_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.695430" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.695108" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:13.695825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/withdraw_route_mac_lacp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lacp/withdraw_route_mac_lacp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:13.695980" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:13.695632" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.696415" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lacp-auto-generated&gt;
            &lt;ce-lacp-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/ce-lacp-mac-address&gt;
            &lt;ce-lacp-port-key&gt;22&lt;/ce-lacp-port-key&gt;
        &lt;/lacp-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.696168" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.696936" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.696691" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.697375" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.697139" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:13.697822" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:13.697587" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:13.698015" elapsed="0.003114"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:13.701308" elapsed="0.001716"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:13.709251" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:13.709424" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:13.709595" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:13.704075" elapsed="0.006014">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.710353" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:13.710711" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:13.703704" elapsed="0.007183">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:15.719399" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:15.719670" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '498'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:15.719842" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:15.712288" elapsed="0.007593"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:15.720708" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lacp-auto-generated": {
            "ce-lacp-port-key": 22,
            "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:15.724188" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:15.720181" elapsed="0.004091"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:15.729411" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:15.728635" elapsed="0.000841"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:15.730416" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:15.729726" elapsed="0.000756"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:15.730819" elapsed="0.000556"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:15.724743" elapsed="0.006754"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:15.711519" elapsed="0.020064"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:13.703256" elapsed="2.028413"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:15.731928" elapsed="0.003605"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:15.744073" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:15.744289" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:15.744449" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:15.737873" elapsed="0.006655"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:15.744913" elapsed="0.004559"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:15.755623" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:15.756346" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '646'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lacp-auto-generated":{"ce-lacp-mac-address":"f2:0c:dd:80:9f:f7","ce-lacp-port-key":22},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:15.756506" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:15.749742" elapsed="0.006842"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:15.760010" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:15.759660" elapsed="0.000379"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:15.760846" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:15.760202" elapsed="0.000674"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:15.761407" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "lacp-auto-generated": {
        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
        "ce-lacp-port-key": 22
       },
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mpls-label1": 24002,
       "mpls-label2": 24003
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:15.761683" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:15.761043" elapsed="0.000842">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:15.756888" elapsed="0.005257">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:15.737239" elapsed="0.025132">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lacp-auto-generated": {
+        "ce-lacp-mac-address": "f2:0c:dd:80:9f:f7",
+        "ce-lacp-port-key": 22
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.772192" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.772509" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:17.772741" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.764056" elapsed="0.008744"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:17.773191" elapsed="0.004364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.783624" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.783791" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:17.783944" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.777810" elapsed="0.006171"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.788476" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.788018" elapsed="0.000500"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.789140" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.788744" elapsed="0.000435"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.789568" elapsed="0.000477"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.784322" elapsed="0.005812"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:17.763050" elapsed="0.027160"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:15.736015" elapsed="2.054250"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:17.791058" elapsed="0.002884"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.799056" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.799169" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:17.799292" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.795142" elapsed="0.004179"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:17.799523" elapsed="0.002901"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.807209" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.807362" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:17.807538" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.802685" elapsed="0.004892"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.812141" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.811694" elapsed="0.000488"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.812825" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.812411" elapsed="0.000452"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.813090" elapsed="0.000530"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.807926" elapsed="0.005783"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:17.794608" elapsed="0.019177"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:17.794125" elapsed="0.019715"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:17.790555" elapsed="0.023362"/>
</kw>
<arg>route_mac_lacp</arg>
<status status="PASS" start="2026-05-01T00:53:13.661600" elapsed="4.152384"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:13.550033" elapsed="4.264109"/>
</test>
<test id="s1-s13-t56" name="Odl_To_Play_route_mac_lan" line="201">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:17.819113" elapsed="0.000249"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:17.818806" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:17.820515" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:17.820373" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.820348" elapsed="0.000297"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:17.825861" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:17.825751" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.825730" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.827040" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:17.826645" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.827559" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:17.827238" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:17.827631" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:53:17.827800" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:17.826173" elapsed="0.001653"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:17.834873" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:17.834757" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.834736" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:17.836522" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:17.836286" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.836261" elapsed="0.000430"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:17.837312" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:17.836852" elapsed="0.000523"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:17.838035" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:17.837758" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:17.869653" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:17.840051" elapsed="0.029883"/>
</kw>
<msg time="2026-05-01T00:53:17.870182" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:17.870317" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:17.838417" elapsed="0.032004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:17.900539" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:17.873145" elapsed="0.027560"/>
</kw>
<msg time="2026-05-01T00:53:17.900858" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:17.900954" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:17.871103" elapsed="0.029926"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.901855" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:17.901397" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.901364" elapsed="0.000678"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.902860" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.902202" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.903537" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:17.903161" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.903140" elapsed="0.000576"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:17.903759" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:17.907687" elapsed="0.000217"/>
</kw>
<msg time="2026-05-01T00:53:17.907951" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:17.907087" elapsed="0.000936"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.908243" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.908479" elapsed="0.000027"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:17.906228" elapsed="0.002490"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:17.904095" elapsed="0.004715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:17.835821" elapsed="0.073175"/>
</kw>
<msg time="2026-05-01T00:53:17.909095" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:17.909141" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:17.835111" elapsed="0.074069"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:17.909422" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:53:17.909308" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.909239" elapsed="0.000303"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.910028" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.910594" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:17.910672" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:17.834344" elapsed="0.076443"/>
</kw>
<msg time="2026-05-01T00:53:17.910888" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:17.910933" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:17.828408" elapsed="0.082562"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:17.911306" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:17.911046" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:17.911029" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:17.828244" elapsed="0.083167"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:17.827885" elapsed="0.083559"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:17.825365" elapsed="0.086158"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:17.820066" elapsed="0.091517"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:17.819606" elapsed="0.092026"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:17.816003" elapsed="0.095686"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.917552" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.917698" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:17.917825" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.912135" elapsed="0.005732"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:17.918157" elapsed="0.003760"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.927422" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.927612" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:17.927763" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.922155" elapsed="0.005646"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.932306" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.931878" elapsed="0.000469"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:17.933022" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.932620" elapsed="0.000442"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.933326" elapsed="0.000493"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.928135" elapsed="0.005773"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:17.911851" elapsed="0.022132"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:17.815295" elapsed="0.118746"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:17.935143" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:17.935363" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:17.934859" elapsed="0.000544"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:17.935916" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:17.936097" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:17.935648" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:17.936674" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/announce_route_mac_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/announce_route_mac_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:17.936855" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:17.936359" elapsed="0.000533"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:17.937602" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:17.937251" elapsed="0.000390"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:17.938137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/withdraw_route_mac_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/withdraw_route_mac_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:17.938316" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:17.937867" elapsed="0.000486"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:17.938929" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:17.938596" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.939565" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.939193" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.940242" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.939894" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.940915" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.940574" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.941594" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.941194" elapsed="0.000463"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:17.941851" elapsed="0.002184"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.956965" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1049', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:17.957059" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.957190" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.944199" elapsed="0.013028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.961206" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.957529" elapsed="0.003767"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.966735" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.967365" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '505'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:17.967538" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.961544" elapsed="0.006034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.971215" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.967821" elapsed="0.003464"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:17.978308" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:17.978888" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '505'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:17.979027" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:17.972646" elapsed="0.006417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.982714" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.979306" elapsed="0.003477"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:17.983002" elapsed="0.003538"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:17.988999" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:17.986773" elapsed="0.002268"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.989327" elapsed="0.003011"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:17.992410" elapsed="0.000068"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:17.972159" elapsed="0.020464"/>
</kw>
<msg time="2026-05-01T00:53:17.992734" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:17.971543" elapsed="0.021230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.993410" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:17.993044" elapsed="0.000451"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.994741" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:17.994848" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:17.994337" elapsed="0.000544"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:17.995475" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:17.995583" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:17.995101" elapsed="0.000515"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.995837" elapsed="0.000426"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:17.996822" level="INFO">${sum_1} = 4545</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:17.996553" elapsed="0.000306"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:17.997398" level="INFO">${sum_2} = 4545</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:17.997075" elapsed="0.000360"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:17.997680" elapsed="0.000351"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:17.993824" elapsed="0.004267"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:17.998245" elapsed="0.001892"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.004929" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.005051" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '505'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:18.005146" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.000704" elapsed="0.004468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.008883" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.005390" elapsed="0.003562"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.009175" elapsed="0.003579"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.017991" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.018109" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '505'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:18.018213" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.012987" elapsed="0.005253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.020828" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.018412" elapsed="0.002466"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.021038" elapsed="0.002729"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:18.026381" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:18.023855" elapsed="0.002612"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.023833" elapsed="0.002671"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.033234" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.033315" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.033480" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.026727" elapsed="0.006792"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:18.000361" elapsed="0.033252"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.039673" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.039826" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:18.039957" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.034931" elapsed="0.005061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.043611" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.040230" elapsed="0.003448"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.043895" elapsed="0.003506"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:18.049779" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:18.047650" elapsed="0.002170"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:18.050063" elapsed="0.002968"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:18.053101" elapsed="0.000044"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:18.034447" elapsed="0.018832"/>
</kw>
<msg time="2026-05-01T00:53:18.053476" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:18.033841" elapsed="0.019672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.054013" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.053744" elapsed="0.000313"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.054917" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:18.054991" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:18.054662" elapsed="0.000352"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.055415" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:18.055515" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:18.055167" elapsed="0.000373"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:18.055693" elapsed="0.000300"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:18.056327" level="INFO">${sum_1} = 4098</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:18.056146" elapsed="0.000207"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:18.056700" level="INFO">${sum_2} = 4098</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:18.056520" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:18.056916" elapsed="0.000304"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:18.054284" elapsed="0.002996"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.062224" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.062373" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:18.062530" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.057871" elapsed="0.004696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.068155" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.062815" elapsed="0.005407"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.068441" elapsed="0.003535"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.077506" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.077615" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:18.077718" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.072206" elapsed="0.005538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.080341" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.077916" elapsed="0.002473"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.080561" elapsed="0.002521"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:18.085516" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:18.083160" elapsed="0.002418"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.083140" elapsed="0.002464"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.085755" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:18.057571" elapsed="0.028295"/>
</kw>
<arg>route_mac_lan</arg>
<status status="PASS" start="2026-05-01T00:53:17.934413" elapsed="0.151515"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:17.814632" elapsed="0.271439"/>
</test>
<test id="s1-s13-t57" name="Play_To_Odl_route_mac_lan" line="203">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:18.091048" elapsed="0.000288"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:18.090676" elapsed="0.000738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:18.092828" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:18.092672" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.092645" elapsed="0.000281"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:18.098400" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:18.098259" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.098241" elapsed="0.000248"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.099501" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:18.099099" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.100005" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:18.099706" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:18.100078" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:53:18.100237" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:18.098720" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:18.106051" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:18.105942" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.105923" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:18.107625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:18.107413" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.107395" elapsed="0.000399"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:18.108361" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:18.107947" elapsed="0.000476"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:18.109054" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:18.108788" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:18.142780" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:18.110984" elapsed="0.031938"/>
</kw>
<msg time="2026-05-01T00:53:18.143196" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:18.143291" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:18.109438" elapsed="0.033925"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:18.168684" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:18.145539" elapsed="0.023281"/>
</kw>
<msg time="2026-05-01T00:53:18.168954" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:18.169047" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:18.143803" elapsed="0.025316"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.169853" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:18.169476" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.169427" elapsed="0.000600"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.170778" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "l "a "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.170182" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.171420" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:18.171071" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.171050" elapsed="0.000560"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:18.171650" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:18.175195" elapsed="0.000139"/>
</kw>
<msg time="2026-05-01T00:53:18.175378" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:18.174719" elapsed="0.000726"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.175731" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.175948" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:18.173912" elapsed="0.002253"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:18.171953" elapsed="0.004297"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:18.106975" elapsed="0.069451"/>
</kw>
<msg time="2026-05-01T00:53:18.176542" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:18.176589" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:18.106280" elapsed="0.070346"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:18.176817" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:18.176705" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.176686" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.177395" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.177848" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:18.177922" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:18.105596" elapsed="0.072437"/>
</kw>
<msg time="2026-05-01T00:53:18.178128" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:18.178172" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:18.100659" elapsed="0.077550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.178687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:18.178285" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.178267" elapsed="0.000499"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:18.100511" elapsed="0.078279"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:18.100318" elapsed="0.078504"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:18.097897" elapsed="0.080982"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:18.092243" elapsed="0.086693"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:18.091647" elapsed="0.087335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:18.087616" elapsed="0.091420"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.188710" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.188842" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:18.188938" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.179479" elapsed="0.009485"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:18.189132" elapsed="0.005577"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.200956" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.201063" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:18.201166" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:18.195194" elapsed="0.005998"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:18.204319" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:18.204014" elapsed="0.000333"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:18.204794" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:18.204519" elapsed="0.000305"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:18.204985" elapsed="0.000324"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:18.201445" elapsed="0.003946"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:18.179185" elapsed="0.026263"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:18.086951" elapsed="0.118554"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:18.206223" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:18.206391" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:18.206020" elapsed="0.000400"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.235620" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_lan.vanadium/route_mac_lan.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:18.235169" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:18.236492" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan.vanadium/route_mac_lan.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:18.236202" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan.vanadium/route_mac_lan.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:18.236666" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:18.235837" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.237254" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:18.236864" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:18.237642" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/route_mac_lan.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:18.237794" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:18.237498" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.238236" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.237991" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:18.238801" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:18.238426" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.239333" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:18.239038" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:18.238888" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:18.238403" elapsed="0.001014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.240043" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:18.239584" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:18.240124" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:53:18.240287" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:18.232654" elapsed="0.007660"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:18.240691" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/announce_route_mac_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/announce_route_mac_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:18.240817" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:18.240493" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:18.241193" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/withdraw_route_mac_lan.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_lan/withdraw_route_mac_lan.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:18.241312" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:18.241003" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.241824" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;lan-auto-generated&gt;
            &lt;root-bridge-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/root-bridge-mac-address&gt;
            &lt;root-bridge-priority&gt;20&lt;/root-bridge-priority&gt;
        &lt;/lan-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.241567" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.242278" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.242039" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.242744" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.242505" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:18.243307" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:18.242949" elapsed="0.000402"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:18.243517" elapsed="0.002556"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:18.246235" elapsed="0.002407"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:18.254042" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:18.254218" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:18.254352" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:18.249669" elapsed="0.005229">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.255162" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:18.255530" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:18.249303" elapsed="0.006405">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:20.265230" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:20.265587" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '505'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:20.265823" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:20.257525" elapsed="0.008357"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:20.266982" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "lan-auto-generated": {
            "root-bridge-priority": 20,
            "root-bridge-mac-address": "f2:0c:dd:80:9f:f7"
          },
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:20.270264" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:20.266360" elapsed="0.003986"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:20.275134" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:20.274419" elapsed="0.000756"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:20.276042" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:20.275399" elapsed="0.000802"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:20.276440" elapsed="0.000493"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:20.270703" elapsed="0.006319"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:20.256494" elapsed="0.020605"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:18.248868" elapsed="2.028298"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:20.277391" elapsed="0.002912"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:20.286344" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:20.286482" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:20.286578" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:20.281305" elapsed="0.005299"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:20.286772" elapsed="0.003944"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:20.296434" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:20.296971" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '653'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","lan-auto-generated":{"root-bridge-priority":20,"root-bridge-mac-address":"f2:0c:dd:80:9f:f7"},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:20.297084" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:20.290953" elapsed="0.006158"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:20.300355" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:20.300053" elapsed="0.000331"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:20.301128" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:20.300561" elapsed="0.000598"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:20.301724" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "lan-auto-generated": {
        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
        "root-bridge-priority": 20
       },
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mpls-label1": 24002,
       "mpls-label2": 24003
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:20.301991" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:20.301372" elapsed="0.000781">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:20.297343" elapsed="0.004996">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:20.280992" elapsed="0.021521">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "lan-auto-generated": {
+        "root-bridge-mac-address": "f2:0c:dd:80:9f:f7",
+        "root-bridge-priority": 20
+       },
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.311710" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.311916" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.312070" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.304090" elapsed="0.008018"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.312358" elapsed="0.003722"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.322408" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.322611" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:22.322804" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.316323" elapsed="0.006522"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.327391" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.326919" elapsed="0.000514"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.328101" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.327692" elapsed="0.000451"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.328479" elapsed="0.000529"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.323204" elapsed="0.005896"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.303194" elapsed="0.025988"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:20.280518" elapsed="2.048724"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:22.330078" elapsed="0.003148"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.340021" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.340220" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.340398" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.334468" elapsed="0.005981"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.340746" elapsed="0.003902"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.350634" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.350798" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:22.350921" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.344890" elapsed="0.006059"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.354294" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.353951" elapsed="0.000372"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.354807" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.354499" elapsed="0.000336"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.354998" elapsed="0.000375"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.351222" elapsed="0.004225"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.333883" elapsed="0.021638"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:22.333403" elapsed="0.022161"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:22.329551" elapsed="0.026072"/>
</kw>
<arg>route_mac_lan</arg>
<status status="PASS" start="2026-05-01T00:53:18.205723" elapsed="4.149951"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:18.086357" elapsed="4.269433"/>
</test>
<test id="s1-s13-t58" name="Odl_To_Play_route_mac_mac" line="206">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:22.359646" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:22.359360" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.360958" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.360827" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.360802" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.366149" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.366039" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.366020" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.367288" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:22.366897" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.367798" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:22.367500" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:22.367869" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:22.368041" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:22.366465" elapsed="0.001601"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.373893" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.373762" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.373743" elapsed="0.000245"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.375524" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.375317" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.375299" elapsed="0.000391"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:22.376262" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:22.375846" elapsed="0.000476"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.376958" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:22.376690" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.407330" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:22.378959" elapsed="0.028648"/>
</kw>
<msg time="2026-05-01T00:53:22.407812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:22.407917" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.377327" elapsed="0.030675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.436405" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:22.411068" elapsed="0.025575"/>
</kw>
<msg time="2026-05-01T00:53:22.436829" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:22.436927" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.408716" elapsed="0.028287"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.437882" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.437357" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.437320" elapsed="0.000760"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.439013" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.438285" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.439697" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.439320" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.439298" elapsed="0.000580"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:22.439922" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:22.443791" elapsed="0.000229"/>
</kw>
<msg time="2026-05-01T00:53:22.444066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:22.443162" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.444368" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.444614" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:22.442304" elapsed="0.002539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:22.440270" elapsed="0.004663"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:22.374867" elapsed="0.070249"/>
</kw>
<msg time="2026-05-01T00:53:22.445222" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:22.445267" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.374149" elapsed="0.071157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:22.445523" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:22.445388" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.445368" elapsed="0.000245"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.446116" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.446580" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.446657" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:22.373404" elapsed="0.073553"/>
</kw>
<msg time="2026-05-01T00:53:22.447065" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:22.447111" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.368471" elapsed="0.078678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.447597" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.447229" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.447211" elapsed="0.000475"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:22.368306" elapsed="0.079404"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:22.368124" elapsed="0.079623"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:22.365674" elapsed="0.082135"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:22.360524" elapsed="0.087345"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.360062" elapsed="0.087853"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:22.357097" elapsed="0.090876"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.453974" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.454124" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.454248" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.448428" elapsed="0.005848"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.454534" elapsed="0.004198"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.464505" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.464679" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:22.464837" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.459027" elapsed="0.005849"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.469440" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.469002" elapsed="0.000500"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.470107" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.469726" elapsed="0.000420"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.470369" elapsed="0.000541"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.465231" elapsed="0.005773"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.448134" elapsed="0.022954"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:22.356609" elapsed="0.114544"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.472311" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.472625" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.472012" elapsed="0.000656"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.473194" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.473380" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.472904" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.474009" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/announce_route_mac_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/announce_route_mac_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.474210" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.473679" elapsed="0.000571"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:22.474903" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:22.474513" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.475508" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/withdraw_route_mac_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/withdraw_route_mac_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.475696" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.475198" elapsed="0.000537"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:22.476254" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:22.475967" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.476713" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.476442" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.477165" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.476926" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.477628" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.477369" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.478064" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.477826" elapsed="0.000300"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:22.478308" elapsed="0.002786"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.493227" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1039', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:22.493375" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.493670" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.481257" elapsed="0.012474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.500227" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.494129" elapsed="0.006194"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.506633" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.507131" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:22.507241" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.500714" elapsed="0.006554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.509920" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.507439" elapsed="0.002531"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.515829" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.516383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:22.516549" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.511020" elapsed="0.005566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.520339" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.516825" elapsed="0.003584"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.520651" elapsed="0.003567"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.526591" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.524448" elapsed="0.002184"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.526924" elapsed="0.002491"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:22.529485" elapsed="0.000044"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:22.510638" elapsed="0.018997"/>
</kw>
<msg time="2026-05-01T00:53:22.529715" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:22.510150" elapsed="0.019591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.530154" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.529910" elapsed="0.000289"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.531106" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:22.531181" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:22.530845" elapsed="0.000359"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.531636" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:22.531710" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:22.531361" elapsed="0.000373"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.531890" elapsed="0.000307"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.532602" level="INFO">${sum_1} = 4741</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:22.532393" elapsed="0.000234"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.532967" level="INFO">${sum_2} = 4741</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:22.532783" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.533146" elapsed="0.000303"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:22.530434" elapsed="0.003090"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:22.533676" elapsed="0.003089"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.541721" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.541846" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:22.541941" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.537305" elapsed="0.004662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.544767" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.542141" elapsed="0.002677"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.544978" elapsed="0.002913"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.554116" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.554281" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:22.554427" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.548193" elapsed="0.006300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.558160" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.554739" elapsed="0.003506"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.558495" elapsed="0.003631"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:22.565541" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.562246" elapsed="0.003408"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.562215" elapsed="0.003478"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.572448" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.572516" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.572619" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.565911" elapsed="0.006736"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:22.537006" elapsed="0.035707"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.578238" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.578414" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.578580" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.573739" elapsed="0.004878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.582498" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.578903" elapsed="0.003667"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.582793" elapsed="0.003656"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.588853" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.586707" elapsed="0.002187"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.589148" elapsed="0.003052"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:22.592252" elapsed="0.000039"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:22.573384" elapsed="0.019009"/>
</kw>
<msg time="2026-05-01T00:53:22.592488" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:22.572900" elapsed="0.019616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.592937" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.592686" elapsed="0.000296"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.593866" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:22.593941" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:22.593603" elapsed="0.000362"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.594372" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:22.594445" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:22.594122" elapsed="0.000368"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.594650" elapsed="0.000336"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.595337" level="INFO">${sum_1} = 4294</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:22.595149" elapsed="0.000213"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:22.595714" level="INFO">${sum_2} = 4294</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:22.595531" elapsed="0.000208"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.595942" elapsed="0.000310"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:22.593218" elapsed="0.003095"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.602003" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.602190" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.602324" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.596906" elapsed="0.005454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.606424" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.602636" elapsed="0.003877"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.606756" elapsed="0.003952"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.616291" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.616445" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.616606" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.611006" elapsed="0.005628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.619502" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.616843" elapsed="0.002709"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.619712" elapsed="0.003675"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:22.627084" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-05-01T00:53:22.623545" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.623505" elapsed="0.003730"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.627493" elapsed="0.000035"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:22.596600" elapsed="0.031038"/>
</kw>
<arg>route_mac_mac</arg>
<status status="PASS" start="2026-05-01T00:53:22.471568" elapsed="0.156146"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.356111" elapsed="0.271769"/>
</test>
<test id="s1-s13-t59" name="Play_To_Odl_route_mac_mac" line="208">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:22.633268" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:22.632991" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.634591" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.634470" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.634434" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.639934" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.639692" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.639674" elapsed="0.000339"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.641073" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:22.640660" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.641581" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:22.641266" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:22.641652" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:53:22.641813" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:22.640252" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.647723" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.647606" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.647581" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.649316" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:22.649125" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.649106" elapsed="0.000396"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:22.650091" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:22.649663" elapsed="0.000491"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.650807" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:22.650530" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.681695" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:22.652811" elapsed="0.029092"/>
</kw>
<msg time="2026-05-01T00:53:22.682082" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:22.682178" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.651228" elapsed="0.031024"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:22.708157" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:22.684387" elapsed="0.023980"/>
</kw>
<msg time="2026-05-01T00:53:22.708565" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:22.708664" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.682744" elapsed="0.025993"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.709547" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.709075" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.709041" elapsed="0.000693"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.710535" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "m "a "c "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.709890" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.711346" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.710833" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.710813" elapsed="0.000730"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:22.711586" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:22.715333" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:53:22.715541" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:22.714709" elapsed="0.000902"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.715894" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.716113" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:22.713909" elapsed="0.002423"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:22.711925" elapsed="0.004493"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:22.648658" elapsed="0.067958"/>
</kw>
<msg time="2026-05-01T00:53:22.716712" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:22.716758" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.647954" elapsed="0.068840"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:22.716983" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:53:22.716874" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.716854" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.717576" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.718014" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:22.718089" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:22.647231" elapsed="0.070971"/>
</kw>
<msg time="2026-05-01T00:53:22.718299" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:22.718344" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.642233" elapsed="0.076146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.718875" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.718600" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.718439" elapsed="0.000515"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:22.642084" elapsed="0.076895"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:22.641898" elapsed="0.077115"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:22.639314" elapsed="0.079758"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:22.634157" elapsed="0.084972"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:22.633710" elapsed="0.085465"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:22.629841" elapsed="0.089387"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.726484" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.726638" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.726762" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.719679" elapsed="0.007111"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:22.727018" elapsed="0.002623"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.735486" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.735600" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:22.735705" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:22.729864" elapsed="0.005867"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.740072" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.739630" elapsed="0.000482"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:22.740733" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:22.740330" elapsed="0.000442"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.740992" elapsed="0.000507"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:22.735983" elapsed="0.005607"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.719382" elapsed="0.022286"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:22.629087" elapsed="0.112638"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.742773" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.743040" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.742485" elapsed="0.000601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.770608" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_mac.vanadium/route_mac_mac.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:22.770142" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.771508" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac.vanadium/route_mac_mac.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:22.771208" elapsed="0.000382">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac.vanadium/route_mac_mac.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:22.771685" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:22.770827" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.772271" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:22.771880" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.772621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/route_mac_mac.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.772785" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.772478" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.773216" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.772973" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:22.773823" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:22.773413" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.774355" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:22.774061" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.773911" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:22.773388" elapsed="0.001050"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.775099" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:22.774609" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:22.775181" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:22.775350" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:22.767682" elapsed="0.007693"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.775806" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/announce_route_mac_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/announce_route_mac_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.775932" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.775607" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:22.776303" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/withdraw_route_mac_mac.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_mac/withdraw_route_mac_mac.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:22.776423" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:22.776115" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.776870" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;mac-auto-generated&gt;
            &lt;system-mac-address&gt;f2:0c:dd:80:9f:f7&lt;/system-mac-address&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/mac-auto-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.776624" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.777494" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.777239" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.777937" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.777699" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:22.778375" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:22.778139" elapsed="0.000281"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:22.778585" elapsed="0.003085"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:22.781830" elapsed="0.001525"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:22.789107" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:22.789295" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:22.789443" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:22.784411" elapsed="0.005618">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.790324" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:22.790706" elapsed="0.000037"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:22.784068" elapsed="0.006870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:24.800391" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:24.800628" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:24.800780" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:24.792673" elapsed="0.008145"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:24.801496" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "path-id": 0,
        "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
        "route-distinguisher": "429496729:1",
        "mac-ip-adv-route": {
          "mac-auto-generated": {
            "system-mac-address": "f2:0c:dd:80:9f:f7",
            "local-discriminator": 2000
          },
          "mpls-label1": 24002,
          "mpls-label2": 24003,
          "ip-address": "43.43.43.43",
          "ethernet-tag-id": {
            "vlan-id": 10
          },
          "mac-address": "f2:0c:dd:80:9f:f7"
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:53:24.804727" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:24.801075" elapsed="0.003725"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:24.809389" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:24.808710" elapsed="0.000721"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:24.810305" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:24.809678" elapsed="0.000791"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:24.810703" elapsed="0.000475"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:24.805120" elapsed="0.006145"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:24.791706" elapsed="0.019635"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:22.783607" elapsed="2.027799"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:24.811689" elapsed="0.002784"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:24.819268" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:24.819383" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:24.819494" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:24.815388" elapsed="0.004133"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:24.819730" elapsed="0.003882"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:24.828550" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:24.829240" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '649'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","mac-auto-generated":{"system-mac-address":"f2:0c:dd:80:9f:f7","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:24.829390" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:24.823884" elapsed="0.005543"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:24.833878" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:24.833447" elapsed="0.000472"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:24.834857" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:24.834140" elapsed="0.000757"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:24.835647" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mac-auto-generated": {
        "local-discriminator": 2000,
        "system-mac-address": "f2:0c:dd:80:9f:f7"
       },
       "mpls-label1": 24002,
       "mpls-label2": 24003
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:24.835979" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:24.835120" elapsed="0.001009">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:24.829771" elapsed="0.006541">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:24.815111" elapsed="0.021394">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mac-auto-generated": {
+        "local-discriminator": 2000,
+        "system-mac-address": "f2:0c:dd:80:9f:f7"
+       },
+       "mpls-label1": 24002,
+       "mpls-label2": 24003
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:26.845423" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:26.845658" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:26.845822" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:26.838020" elapsed="0.007841"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:26.846144" elapsed="0.004039"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:26.856586" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:26.856780" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:26.856953" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:26.850442" elapsed="0.006551"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:26.861841" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:26.861357" elapsed="0.000527"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:26.862553" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:26.862124" elapsed="0.000470"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:26.862914" elapsed="0.000630"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:26.857388" elapsed="0.006254"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:26.837151" elapsed="0.026576"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:24.814673" elapsed="2.049116"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:26.864987" elapsed="0.002867"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:26.875371" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:26.875596" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:26.875768" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:26.869733" elapsed="0.006076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:26.876075" elapsed="0.003996"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:26.886316" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:26.886579" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:26.886782" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:26.880378" elapsed="0.006446"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:26.891943" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:26.891436" elapsed="0.000553"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:26.892736" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:26.892230" elapsed="0.000547"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:26.893015" elapsed="0.000554"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:26.887267" elapsed="0.006396"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:26.868870" elapsed="0.024891"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:26.868151" elapsed="0.025691"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:26.864091" elapsed="0.029858"/>
</kw>
<arg>route_mac_mac</arg>
<status status="PASS" start="2026-05-01T00:53:22.742042" elapsed="4.151983"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:22.628361" elapsed="4.265843"/>
</test>
<test id="s1-s13-t60" name="Odl_To_Play_route_mac_rou" line="211">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:26.899929" elapsed="0.000347"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:26.899527" elapsed="0.000842"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:26.901945" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:26.901752" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.901718" elapsed="0.000431"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:26.908621" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:26.908482" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.908444" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:26.909852" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:26.909396" elapsed="0.000485"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:26.910354" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:26.910046" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:26.910427" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:53:26.910613" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:26.908991" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:26.916782" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:26.916660" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.916637" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:26.918386" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:26.918201" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.918182" elapsed="0.000401"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:26.919169" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:26.918740" elapsed="0.000493"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:26.919899" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:26.919626" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:26.953889" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:26.921947" elapsed="0.032199"/>
</kw>
<msg time="2026-05-01T00:53:26.954348" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:26.954449" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:26.920289" elapsed="0.034271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:26.983280" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:26.956959" elapsed="0.026596"/>
</kw>
<msg time="2026-05-01T00:53:26.983750" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:26.983849" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:26.955100" elapsed="0.028825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.984808" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:26.984294" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.984237" elapsed="0.000758"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:26.985883" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "o "u "t "e "_ "m "a "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:26.985161" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.986619" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:26.986203" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.986179" elapsed="0.000642"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:26.986866" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:26.990785" elapsed="0.000223"/>
</kw>
<msg time="2026-05-01T00:53:26.991055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:26.990144" elapsed="0.000986"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.991352" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.991591" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:26.989297" elapsed="0.002522"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:26.987216" elapsed="0.004693"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:26.917748" elapsed="0.074343"/>
</kw>
<msg time="2026-05-01T00:53:26.992193" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:26.992239" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:26.917029" elapsed="0.075297"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:26.992567" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:26.992415" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.992393" elapsed="0.000265"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.993155" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.993752" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:26.993829" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:26.916235" elapsed="0.077710"/>
</kw>
<msg time="2026-05-01T00:53:26.994043" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:26.994088" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:26.911042" elapsed="0.083085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:26.994503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:26.994220" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:26.994200" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:26.910893" elapsed="0.083713"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:26.910701" elapsed="0.083941"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:26.907994" elapsed="0.086709"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:26.901283" elapsed="0.093477"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:26.900619" elapsed="0.094188"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:26.896101" elapsed="0.098764"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.000399" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.000581" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.000715" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:26.995314" elapsed="0.005429"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.000997" elapsed="0.004360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.011875" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.012013" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:27.012130" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.005640" elapsed="0.006519"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:27.017805" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.017272" elapsed="0.000582"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:27.018512" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.018098" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.018783" elapsed="0.000524"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.012915" elapsed="0.006481"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:26.995020" elapsed="0.024480"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:26.895300" elapsed="0.124263"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.020735" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.021003" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.020422" elapsed="0.000622"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.021629" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.022152" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.021301" elapsed="0.000894"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.022748" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/announce_route_mac_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/announce_route_mac_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.022964" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.022448" elapsed="0.000565"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:27.023633" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:27.023264" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.024243" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/withdraw_route_mac_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/withdraw_route_mac_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.024501" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.023970" elapsed="0.000570"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:27.025113" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:27.024761" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.025630" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.025360" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.026081" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "path-id": 0,
                "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
                "route-distinguisher": "429496729:1",
                "mac-ip-adv-route": {
                    "router-id-generated": {
                        "local-discriminator": 2000,
                        "router-id": "43.43.43.43"
                    },
                    "mpls-label1": 24002,
                    "mpls-label2": 24003,
                    "ip-address": "43.43.43.43",
                    "ethernet-tag-id": {
                        "vlan-id": 10
                    },
                    "mac-address": "f2:0c:dd:80:9f:f7"
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.025843" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.026538" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.026285" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.026970" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.026736" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:27.027164" elapsed="0.003058"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.043958" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1017', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:27.044051" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=AhgAAhmZmZkAAQAAAAow8gzdgJ%2F3ICsrKys%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.044206" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.030409" elapsed="0.013852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.050739" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.044729" elapsed="0.006106"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.058306" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.059181" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:27.059293" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.051192" elapsed="0.008128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.062332" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.059506" elapsed="0.002895"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.069859" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.070530" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:27.070674" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.063792" elapsed="0.006918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.075313" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.070955" elapsed="0.004477"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.075850" elapsed="0.005753"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.083679" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.081770" elapsed="0.001938"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.083888" elapsed="0.002183"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:27.086127" elapsed="0.000045"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:27.063308" elapsed="0.022971"/>
</kw>
<msg time="2026-05-01T00:53:27.086360" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:27.062668" elapsed="0.023718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.086823" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.086575" elapsed="0.000294"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.087752" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:27.087828" level="INFO">${len_1} = 182</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:27.087490" elapsed="0.000361"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.088263" level="INFO">Length is 182.</msg>
<msg time="2026-05-01T00:53:27.088356" level="INFO">${len_2} = 182</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:27.088007" elapsed="0.000373"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.088550" elapsed="0.000306"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.089273" level="INFO">${sum_1} = 3905</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:27.089078" elapsed="0.000221"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.089670" level="INFO">${sum_2} = 3905</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:27.089480" elapsed="0.000216"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.089852" elapsed="0.000303"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:27.087109" elapsed="0.003106"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:27.090364" elapsed="0.001635"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.097044" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.097176" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:27.097273" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.092579" elapsed="0.004720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.100120" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.097490" elapsed="0.002679"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.100374" elapsed="0.003237"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.109307" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.109644" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:27.109916" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.103841" elapsed="0.006140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.116702" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","path-id":0,"mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.110437" elapsed="0.006388"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.117185" elapsed="0.002571"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:27.122231" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:27.119847" elapsed="0.002430"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.119822" elapsed="0.002672"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.129204" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.129323" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.129586" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.122656" elapsed="0.006993"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:27.092244" elapsed="0.037553"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.139316" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.139427" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.139544" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.132090" elapsed="0.007480"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.142219" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.139743" elapsed="0.002524"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.142424" elapsed="0.002578"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.147174" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.145190" elapsed="0.002030"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.147527" elapsed="0.003135"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:27.150733" elapsed="0.000047"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:27.131298" elapsed="0.019623"/>
</kw>
<msg time="2026-05-01T00:53:27.151031" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:27.130210" elapsed="0.020858"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.151680" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.151300" elapsed="0.000444"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.153012" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:27.153117" level="INFO">${len_1} = 170</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:27.152648" elapsed="0.000502"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.153763" level="INFO">Length is 170.</msg>
<msg time="2026-05-01T00:53:27.153867" level="INFO">${len_2} = 170</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:27.153366" elapsed="0.000534"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.154127" elapsed="0.000467"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.155086" level="INFO">${sum_1} = 3458</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:27.154815" elapsed="0.000359"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:27.155687" level="INFO">${sum_2} = 3458</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:27.155405" elapsed="0.000318"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.156001" elapsed="0.000509"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:27.152073" elapsed="0.004525"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.161319" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.161427" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.161543" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.157377" elapsed="0.004192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.164392" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.161742" elapsed="0.002699"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.164614" elapsed="0.003329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.173001" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.173154" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.173300" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.168170" elapsed="0.005167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.177008" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.173603" elapsed="0.003472"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.177293" elapsed="0.003550"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:27.184211" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:53:27.180957" elapsed="0.003343"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.180926" elapsed="0.003450"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.184621" elapsed="0.000033"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:27.156960" elapsed="0.027789"/>
</kw>
<arg>route_mac_rou</arg>
<status status="PASS" start="2026-05-01T00:53:27.019947" elapsed="0.164867"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:26.894680" elapsed="0.290290"/>
</test>
<test id="s1-s13-t61" name="Play_To_Odl_route_mac_rou" line="213">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:27.188864" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:27.188592" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:27.190133" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:27.190018" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.190000" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:27.195286" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:27.195177" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.195156" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.196501" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:27.196057" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.197001" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:27.196701" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:27.197071" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:53:27.197229" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:27.195674" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:27.203040" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:27.202932" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.202913" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:27.204678" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:27.204425" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.204406" elapsed="0.000437"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:27.205419" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:27.205002" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:27.206123" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:27.205853" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:27.238419" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:27.208036" elapsed="0.030532"/>
</kw>
<msg time="2026-05-01T00:53:27.238705" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:27.238799" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:27.206504" elapsed="0.032367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:27.275519" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:27.240889" elapsed="0.034893"/>
</kw>
<msg time="2026-05-01T00:53:27.275990" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:27.276089" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:27.239269" elapsed="0.036897"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.277066" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:27.276588" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.276546" elapsed="0.000709"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.278109" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "o "u "t "e "_ "m "a "c "_ "r "o "u "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.277415" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.278847" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:27.278428" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.278403" elapsed="0.000667"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:27.279122" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:27.283042" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:53:27.283242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:27.282376" elapsed="0.000939"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.283624" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.283849" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:27.281595" elapsed="0.002479"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:27.279515" elapsed="0.004647"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:27.203942" elapsed="0.080403"/>
</kw>
<msg time="2026-05-01T00:53:27.284565" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:27.284614" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:27.203265" elapsed="0.081388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:27.284862" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:53:27.284737" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.284716" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.285439" elapsed="0.000123"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.286001" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:27.286078" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:27.202593" elapsed="0.083627"/>
</kw>
<msg time="2026-05-01T00:53:27.286336" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:27.286382" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:27.197663" elapsed="0.088757"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.286782" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:27.286519" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.286500" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:27.197514" elapsed="0.089389"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:27.197314" elapsed="0.089633"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:27.194805" elapsed="0.092217"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:27.189729" elapsed="0.097351"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:27.189280" elapsed="0.097847"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:27.186376" elapsed="0.100812"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.295583" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.295777" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.295911" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.287643" elapsed="0.008303"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:27.296192" elapsed="0.004681"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.306530" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.306751" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:27.306900" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:27.301132" elapsed="0.005805"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:27.311478" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.311016" elapsed="0.000512"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:27.312147" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:27.311757" elapsed="0.000430"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.312491" elapsed="0.000517"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:27.307267" elapsed="0.005878"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:27.287343" elapsed="0.025913"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:27.185897" elapsed="0.127425"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.314391" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.314629" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.314108" elapsed="0.000562"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.342214" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_rou.vanadium/route_mac_rou.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:27.341837" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.343025" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou.vanadium/route_mac_rou.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:27.342772" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou.vanadium/route_mac_rou.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:27.343198" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:27.342412" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.343918" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:27.343533" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.344245" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/route_mac_rou.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.344560" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.344110" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.344990" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "path-id": 0,
                "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
                "route-distinguisher": "429496729:1",
                "mac-ip-adv-route": {
                    "router-id-generated": {
                        "local-discriminator": 2000,
                        "router-id": "43.43.43.43"
                    },
                    "mpls-label1": 24002,
                    "mpls-label2": 24003,
                    "ip-address": "43.43.43.43",
                    "ethernet-tag-id": {
                        "vlan-id": 10
                    },
                    "mac-address": "f2:0c:dd:80:9f:f7"
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.344748" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:27.345512" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:27.345164" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.346045" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:27.345751" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:27.345599" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:27.345139" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.346782" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:27.346280" elapsed="0.000530"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:27.346862" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:53:27.347025" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:27.339494" elapsed="0.007557"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.347411" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/announce_route_mac_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/announce_route_mac_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.347554" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.347215" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:27.347931" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/withdraw_route_mac_rou.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/route_mac_rou/withdraw_route_mac_rou.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:27.348050" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:27.347740" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.348529" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;mac-ip-adv-route&gt;
        &lt;router-id-generated&gt;
            &lt;router-id&gt;43.43.43.43&lt;/router-id&gt;
            &lt;local-discriminator&gt;2000&lt;/local-discriminator&gt;
        &lt;/router-id-generated&gt;
        &lt;ethernet-tag-id&gt;
            &lt;vlan-id&gt;10&lt;/vlan-id&gt;
        &lt;/ethernet-tag-id&gt;
        &lt;mac-address&gt;f2:0c:dd:80:9f:f7&lt;/mac-address&gt;
        &lt;ip-address&gt;43.43.43.43&lt;/ip-address&gt;
        &lt;mpls-label1&gt;24002&lt;/mpls-label1&gt;
        &lt;mpls-label2&gt;24003&lt;/mpls-label2&gt;
    &lt;/mac-ip-adv-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.348232" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.348978" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "path-id": 0,
                "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
                "route-distinguisher": "429496729:1",
                "mac-ip-adv-route": {
                    "router-id-generated": {
                        "local-discriminator": 2000,
                        "router-id": "43.43.43.43"
                    },
                    "mpls-label1": 24002,
                    "mpls-label2": 24003,
                    "ip-address": "43.43.43.43",
                    "ethernet-tag-id": {
                        "vlan-id": 10
                    },
                    "mac-address": "f2:0c:dd:80:9f:f7"
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.348740" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.349419" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.349181" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:27.349867" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:27.349632" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:27.350060" elapsed="0.002283"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:27.352603" elapsed="0.001749"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:27.361327" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:27.361484" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:27.361594" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:27.355323" elapsed="0.006661">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.362177" elapsed="0.000023"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:27.362424" elapsed="0.000024"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:27.354989" elapsed="0.007584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:29.371701" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:29.371968" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:29.372162" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:29.364212" elapsed="0.007997"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:29.372898" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "path-id": 0,
                "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=",
                "route-distinguisher": "429496729:1",
                "mac-ip-adv-route": {
                    "router-id-generated": {
                        "local-discriminator": 2000,
                        "router-id": "43.43.43.43"
                    },
                    "mpls-label1": 24002,
                    "mpls-label2": 24003,
                    "ip-address": "43.43.43.43",
                    "ethernet-tag-id": {
                        "vlan-id": 10
                    },
                    "mac-address": "f2:0c:dd:80:9f:f7"
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:29.376157" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:29.372495" elapsed="0.003734"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:29.380934" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:29.380112" elapsed="0.000863"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:29.381956" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:29.381300" elapsed="0.000696"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:29.382218" elapsed="0.000480"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:29.376569" elapsed="0.006216"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:29.363233" elapsed="0.019625"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:27.354563" elapsed="2.028360"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:29.383144" elapsed="0.002673"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:29.394799" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:29.394954" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:29.395101" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:29.387087" elapsed="0.008051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:29.395370" elapsed="0.003595"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:29.404057" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:29.404771" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '635'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys=","mac-ip-adv-route":{"ip-address":"43.43.43.43","router-id-generated":{"router-id":"43.43.43.43","local-discriminator":2000},"ethernet-tag-id":{"vlan-id":10},"mac-address":"f2:0c:dd:80:9f:f7","mpls-label2":24003,"mpls-label1":24002},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:29.404922" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:29.399195" elapsed="0.005763"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:29.409299" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:29.408873" elapsed="0.000466"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:29.410275" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:29.409581" elapsed="0.000738"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:29.410998" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "mac-ip-adv-route": {
       "ethernet-tag-id": {
        "vlan-id": 10
       },
       "ip-address": "43.43.43.43",
       "mac-address": "f2:0c:dd:80:9f:f7",
       "mpls-label1": 24002,
       "mpls-label2": 24003,
       "router-id-generated": {
        "local-discriminator": 2000,
        "router-id": "43.43.43.43"
       }
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:29.411412" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "mac-ip-adv-route": {
+       "ethernet-tag-id": {
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:29.410563" elapsed="0.000980">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:29.405319" elapsed="0.006456">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:29.386704" elapsed="0.025278">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
    [ Message content over the limit has been removed. ]
+        "vlan-id": 10
+       },
+       "ip-address": "43.43.43.43",
+       "mac-address": "f2:0c:dd:80:9f:f7",
+       "mpls-label1": 24002,
+       "mpls-label2": 24003,
+       "router-id-generated": {
+        "local-discriminator": 2000,
+        "router-id": "43.43.43.43"
+       }
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "AhgAAhmZmZkAAQAAAAow8gzdgJ/3ICsrKys="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.421650" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.422010" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.422252" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.413713" elapsed="0.008598"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.422586" elapsed="0.003744"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.431975" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.432084" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:31.432186" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.426587" elapsed="0.005625"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.435484" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.435148" elapsed="0.000365"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.435942" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.435670" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.436129" elapsed="0.000351"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.432534" elapsed="0.004010"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.412840" elapsed="0.023760"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:29.386089" elapsed="2.050552"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:31.437187" elapsed="0.002691"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.446892" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.447079" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.447228" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.441654" elapsed="0.005611"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.447545" elapsed="0.003805"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.457118" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.457271" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:31.457418" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.451606" elapsed="0.005880"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.462090" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.461643" elapsed="0.000488"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.462789" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.462356" elapsed="0.000484"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.463114" elapsed="0.000503"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.457876" elapsed="0.005834"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.441198" elapsed="0.022587"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:31.440177" elapsed="0.023663"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:31.436836" elapsed="0.027084"/>
</kw>
<arg>route_mac_rou</arg>
<status status="PASS" start="2026-05-01T00:53:27.313673" elapsed="4.150314"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:27.185397" elapsed="4.278820"/>
</test>
<test id="s1-s13-t62" name="Odl_To_Play_pmsi_rsvp_te_p2mp_lsp" line="216">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:31.468739" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:31.468471" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.470147" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.470020" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.469997" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.475474" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.475349" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.475330" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.476598" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:31.476177" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.477096" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:31.476795" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:31.477167" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:53:31.477342" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:31.475791" elapsed="0.001576"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.483140" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.483029" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.483009" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.484704" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.484519" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.484499" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:31.485642" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:31.485182" elapsed="0.000524"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.486350" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:31.486076" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.515941" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:31.488299" elapsed="0.027898"/>
</kw>
<msg time="2026-05-01T00:53:31.516394" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:31.516524" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.486747" elapsed="0.029853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.542310" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "r "s "v "p "_ "t "e "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:31.518811" elapsed="0.023742"/>
</kw>
<msg time="2026-05-01T00:53:31.542698" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:31.542811" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.517087" elapsed="0.025799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.543681" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.543229" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.543199" elapsed="0.000664"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.544644" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "r "s "v "p "_ "t "e "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.544022" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.545403" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.545045" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.545024" elapsed="0.000570"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:31.545637" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:31.549429" elapsed="0.000167"/>
</kw>
<msg time="2026-05-01T00:53:31.549640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:31.548834" elapsed="0.000879"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.549949" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.550170" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:31.548020" elapsed="0.002371"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:31.545999" elapsed="0.004494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:31.484046" elapsed="0.066630"/>
</kw>
<msg time="2026-05-01T00:53:31.550775" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:31.550822" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.483369" elapsed="0.067491"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:31.551280" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:31.550941" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.550920" elapsed="0.000451"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.551885" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.552323" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.552401" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:31.482652" elapsed="0.070014"/>
</kw>
<msg time="2026-05-01T00:53:31.552762" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:31.552807" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.477792" elapsed="0.075052"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.553181" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.552922" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.552904" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:31.477629" elapsed="0.075656"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:31.477427" elapsed="0.075892"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:31.474977" elapsed="0.078399"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:31.469619" elapsed="0.083815"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.469157" elapsed="0.084341"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:31.466267" elapsed="0.087289"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.558890" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.559078" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.559195" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.554027" elapsed="0.005196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.559402" elapsed="0.002687"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.566661" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.566773" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:31.566877" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.562259" elapsed="0.004644"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.570051" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.569705" elapsed="0.000375"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.570529" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.570239" elapsed="0.000318"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.570717" elapsed="0.000334"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.567138" elapsed="0.003976"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.553708" elapsed="0.017462"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:31.465422" elapsed="0.105790"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.572022" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.572227" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.571816" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.572625" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.572752" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.572415" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.573127" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/announce_pmsi_rsvp_te_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/announce_pmsi_rsvp_te_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.573252" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.572937" elapsed="0.000342"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:31.573670" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:31.573439" elapsed="0.000258"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.574106" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/withdraw_pmsi_rsvp_te_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/withdraw_pmsi_rsvp_te_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.574231" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.573914" elapsed="0.000343"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:31.574630" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:31.574414" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.575070" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;rsvp-te-p2mp-lsp&gt;
                &lt;p2mp-id&gt;1111111111&lt;/p2mp-id&gt;
                &lt;tunnel-id&gt;11111&lt;/tunnel-id&gt;
                &lt;extended-tunnel-id&gt;10.10.10.10&lt;/extended-tunnel-id&gt;
            &lt;/rsvp-te-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.574820" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.575543" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "rsvp-te-p2mp-lsp": {
                            "extended-tunnel-id": "10.10.10.10",
                            "p2mp-id": 1111111111,
                            "tunnel-id": 11111
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.575286" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.575992" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.575752" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.576433" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.576194" elapsed="0.000306"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:31.576655" elapsed="0.002166"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.589756" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1089', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;rsvp-te-p2mp-lsp&gt;
                &lt;p2mp-id&gt;1111111111&lt;/p2mp-id&gt;
                &lt;tunnel-id&gt;11111&lt;/tunnel-id&gt;
                &lt;extended-tunnel-id&gt;10.10.10.10&lt;/extended-tunnel-id&gt;
            &lt;/rsvp-te-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:31.589842" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.589988" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.579007" elapsed="0.011008"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.592695" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.590192" elapsed="0.002546"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.599015" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.599478" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '502'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:31.599590" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.592898" elapsed="0.006718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.602405" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.599787" elapsed="0.002681"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.607472" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.607882" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '502'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:31.607979" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.603496" elapsed="0.004510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.610643" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.608178" elapsed="0.002515"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.610850" elapsed="0.002518"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.615633" level="INFO">${update} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.613549" elapsed="0.002114"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.615866" elapsed="0.002209"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:31.618133" elapsed="0.000046"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:31.603131" elapsed="0.015163"/>
</kw>
<msg time="2026-05-01T00:53:31.618382" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:31.602646" elapsed="0.015765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.618920" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.618664" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.619896" level="INFO">Length is 188.</msg>
<msg time="2026-05-01T00:53:31.619972" level="INFO">${len_1} = 188</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:31.619622" elapsed="0.000373"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.620408" level="INFO">Length is 188.</msg>
<msg time="2026-05-01T00:53:31.620500" level="INFO">${len_2} = 188</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:31.620152" elapsed="0.000373"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.620684" elapsed="0.000309"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.621346" level="INFO">${sum_1} = 3045</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:31.621153" elapsed="0.000218"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.621743" level="INFO">${sum_2} = 3045</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:31.621553" elapsed="0.000215"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.621937" elapsed="0.000309"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:31.619221" elapsed="0.003085"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:31.622475" elapsed="0.001776"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.629038" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.629188" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '502'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:31.629287" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.624829" elapsed="0.004483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.632274" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.629504" elapsed="0.002821"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.632499" elapsed="0.002533"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.639695" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.639834" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '502'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:31.639947" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.635198" elapsed="0.004836"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.642693" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.640213" elapsed="0.002530"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.642901" elapsed="0.002541"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:31.647983" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.645553" elapsed="0.002482"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.645526" elapsed="0.002534"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.654167" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.654227" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.654353" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.648216" elapsed="0.006165"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:31.624543" elapsed="0.029939"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.661677" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.661841" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.661943" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.655567" elapsed="0.006402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.664693" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.662156" elapsed="0.002584"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.664898" elapsed="0.002516"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.669537" level="INFO">${update} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.667598" elapsed="0.001969"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.669746" elapsed="0.002221"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:31.672021" elapsed="0.000040"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:31.655192" elapsed="0.016975"/>
</kw>
<msg time="2026-05-01T00:53:31.672251" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:31.654675" elapsed="0.017603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.672718" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.672469" elapsed="0.000296"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.673661" level="INFO">Length is 176.</msg>
<msg time="2026-05-01T00:53:31.673736" level="INFO">${len_1} = 176</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:31.673382" elapsed="0.000437"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.674252" level="INFO">Length is 176.</msg>
<msg time="2026-05-01T00:53:31.674327" level="INFO">${len_2} = 176</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:31.673995" elapsed="0.000356"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.674524" elapsed="0.000310"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.675183" level="INFO">${sum_1} = 2598</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:31.674993" elapsed="0.000216"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:31.675567" level="INFO">${sum_2} = 2598</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:31.675361" elapsed="0.000233"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.675749" elapsed="0.000304"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:31.673007" elapsed="0.003105"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.682625" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.682739" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.682834" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.676698" elapsed="0.006164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.685697" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.683030" elapsed="0.002715"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.685921" elapsed="0.002502"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.692510" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.692620" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.692722" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.688602" elapsed="0.004147"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.695339" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.692918" elapsed="0.002470"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.695558" elapsed="0.002607"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:31.700569" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:31.698248" elapsed="0.002384"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.698227" elapsed="0.002431"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.700810" elapsed="0.000021"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:31.676382" elapsed="0.024551"/>
</kw>
<arg>pmsi_rsvp_te_p2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:31.571513" elapsed="0.129467"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.464675" elapsed="0.236421"/>
</test>
<test id="s1-s13-t63" name="Play_To_Odl_pmsi_rsvp_te_p2mp_lsp" line="219">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:31.705087" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:31.704821" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.706388" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.706275" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.706256" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.711490" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.711351" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.711334" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.712578" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:31.712171" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.713061" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:31.712769" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:31.713131" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:53:31.713288" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:31.711790" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.719074" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.718967" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.718948" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.720605" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:31.720396" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.720378" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:31.721332" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:31.720924" elapsed="0.000471"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.722060" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:31.721758" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.749726" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:31.723986" elapsed="0.025909"/>
</kw>
<msg time="2026-05-01T00:53:31.750050" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:31.750147" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.722436" elapsed="0.027784"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:31.778078" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "r "s "v "p "_ "t "e "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:31.752358" elapsed="0.026152"/>
</kw>
<msg time="2026-05-01T00:53:31.778891" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:31.779128" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.750721" elapsed="0.028588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.781218" elapsed="0.000124"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.780212" elapsed="0.001346"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.780147" elapsed="0.001562"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.783734" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "r "s "v "p "_ "t "e "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.782150" elapsed="0.002042"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.785559" elapsed="0.000118"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.784665" elapsed="0.001182"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.784615" elapsed="0.001446"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:31.786163" elapsed="0.000083"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:31.790198" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:53:31.790400" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:31.789555" elapsed="0.000937"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.790740" elapsed="0.000030"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.790984" elapsed="0.000025"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:31.788741" elapsed="0.002472"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:31.786656" elapsed="0.004646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:31.719957" elapsed="0.071601"/>
</kw>
<msg time="2026-05-01T00:53:31.791660" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:31.791706" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.719299" elapsed="0.072447"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:31.791947" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:31.791832" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.791809" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.792554" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.792997" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:31.793072" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:31.718627" elapsed="0.074560"/>
</kw>
<msg time="2026-05-01T00:53:31.793285" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:31.793331" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.713715" elapsed="0.079656"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.793731" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.793449" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.793431" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:31.713568" elapsed="0.080290"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:31.713371" elapsed="0.080549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:31.710988" elapsed="0.082992"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:31.705985" elapsed="0.088052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:31.705521" elapsed="0.088566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:31.702629" elapsed="0.091513"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.802201" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.802436" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.802569" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.794638" elapsed="0.007959"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:31.802796" elapsed="0.003064"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.811626" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.811815" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:31.811991" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:31.806076" elapsed="0.005955"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.816639" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.816168" elapsed="0.000511"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:31.817280" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:31.816899" elapsed="0.000419"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.817560" elapsed="0.000491"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:31.812391" elapsed="0.005750"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.794298" elapsed="0.023920"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:31.702131" elapsed="0.116146"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.819403" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.819658" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.819093" elapsed="0.000611"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.846968" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp.vanadium/pmsi_rsvp_te_p2mp_lsp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:31.846495" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.847883" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp.vanadium/pmsi_rsvp_te_p2mp_lsp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:31.847599" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp.vanadium/pmsi_rsvp_te_p2mp_lsp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:31.848056" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:31.847206" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.848663" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:31.848253" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.849100" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/pmsi_rsvp_te_p2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.849262" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.848939" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.849748" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "rsvp-te-p2mp-lsp": {
                            "extended-tunnel-id": "10.10.10.10",
                            "p2mp-id": 1111111111,
                            "tunnel-id": 11111
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.849474" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:31.850332" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:31.849934" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.850898" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:31.850600" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.850428" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:31.849864" elapsed="0.001117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.851650" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:31.851132" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:31.851732" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:53:31.851904" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:31.843992" elapsed="0.007939"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.852295" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/announce_pmsi_rsvp_te_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/announce_pmsi_rsvp_te_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.852433" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.852097" elapsed="0.000377"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:31.852825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/withdraw_pmsi_rsvp_te_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_rsvp_te_p2mp_lsp/withdraw_pmsi_rsvp_te_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:31.852945" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:31.852634" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.853397" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;rsvp-te-p2mp-lsp&gt;
                &lt;p2mp-id&gt;1111111111&lt;/p2mp-id&gt;
                &lt;tunnel-id&gt;11111&lt;/tunnel-id&gt;
                &lt;extended-tunnel-id&gt;10.10.10.10&lt;/extended-tunnel-id&gt;
            &lt;/rsvp-te-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.853150" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.853943" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "rsvp-te-p2mp-lsp": {
                            "extended-tunnel-id": "10.10.10.10",
                            "p2mp-id": 1111111111,
                            "tunnel-id": 11111
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.853672" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.854410" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.854160" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:31.854886" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:31.854641" elapsed="0.000298"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:31.855093" elapsed="0.003119"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:31.858696" elapsed="0.002317"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:31.870487" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:31.870645" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:31.870770" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:31.863332" elapsed="0.007890">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.871447" elapsed="0.000050"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:31.871740" elapsed="0.000025"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:31.862579" elapsed="0.009300">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:33.881274" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:33.881533" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '502'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:33.881682" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:33.873513" elapsed="0.008206"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:33.882491" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "rsvp-te-p2mp-lsp": {
                            "extended-tunnel-id": "10.10.10.10",
                            "p2mp-id": 1111111111,
                            "tunnel-id": 11111
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:33.885694" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:33.882058" elapsed="0.003707"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:33.890413" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:33.889717" elapsed="0.000757"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:33.891378" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:33.890743" elapsed="0.000675"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:33.891665" elapsed="0.000461"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:33.886083" elapsed="0.006130"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:33.872571" elapsed="0.019720"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:31.861507" elapsed="2.030849"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:33.892604" elapsed="0.002418"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:33.902762" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:33.902873" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:33.902968" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:33.896295" elapsed="0.006699"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:33.903160" elapsed="0.002865"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:33.910558" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:33.911272" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '650'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"rsvp-te-p2mp-lsp":{"p2mp-id":1111111111,"tunnel-id":11111,"extended-tunnel-id":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:33.911488" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:33.906192" elapsed="0.005336"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:33.915820" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:33.915399" elapsed="0.000461"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:33.916803" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:33.916078" elapsed="0.000765"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:33.917522" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "leaf-information-required": true,
        "mpls-label": 20024,
        "rsvp-te-p2mp-lsp": {
         "extended-tunnel-id": "10.10.10.10",
         "p2mp-id": 1111111111,
         "tunnel-id": 11111
        }
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:33.917851" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,41 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "leaf-information-required": true,
+        "mpls-label": 20024,
+        "rsvp-te-p2mp-lsp": {
+         "extended-tunnel-id": "10.10.10.10",
+         "p2mp-id": 1111111111,
+         "tunnel-id": 11111
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:33.917066" elapsed="0.000892">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,41 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p2mp-id": 1111111111,
+         "tunnel-id": 11111
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:33.911847" elapsed="0.006340">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,41 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p2mp-id": 1111111111,
+         "tunnel-id": 11111
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:33.895912" elapsed="0.022481">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,41 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p2mp-id": 1111111111,
+         "tunnel-id": 11111
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:35.927977" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:35.928179" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:35.928406" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:35.920156" elapsed="0.008290"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:35.928737" elapsed="0.003863"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:35.938537" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:35.938721" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:35.938880" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:35.932843" elapsed="0.006075"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:35.943532" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:35.943008" elapsed="0.000567"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:35.944196" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:35.943802" elapsed="0.000434"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:35.944511" elapsed="0.000499"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:35.939327" elapsed="0.005774"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:35.919107" elapsed="0.026070"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:33.895266" elapsed="2.049966"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:35.946060" elapsed="0.002598"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:35.954184" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:35.954323" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:35.954434" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:35.949917" elapsed="0.004566"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:35.954664" elapsed="0.003433"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:35.964136" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:35.964411" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:35.964709" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:35.958335" elapsed="0.006440"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:35.970535" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:35.970083" elapsed="0.000494"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:35.971226" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:35.970824" elapsed="0.000467"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:35.971538" elapsed="0.000470"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:35.965441" elapsed="0.006657"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:35.949330" elapsed="0.022842"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:35.948878" elapsed="0.023350"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:35.945533" elapsed="0.026772"/>
</kw>
<arg>pmsi_rsvp_te_p2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:31.818626" elapsed="4.153745"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:31.701418" elapsed="4.271144"/>
</test>
<test id="s1-s13-t64" name="Odl_To_Play_pmsi_mldp_p2mp_lsp" line="222">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:35.977481" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:35.977193" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:35.978863" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:35.978727" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:35.978693" elapsed="0.000268"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:35.985958" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:35.985845" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:35.985826" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:35.987073" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:35.986680" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:35.987623" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:35.987303" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:35.987694" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:53:35.987862" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:35.986275" elapsed="0.001611"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:35.993594" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:35.993480" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:35.993447" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:35.995140" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:35.994954" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:35.994935" elapsed="0.000414"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:35.995946" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:35.995525" elapsed="0.000483"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:35.996657" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:35.996363" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:36.027049" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:35.998625" elapsed="0.028694"/>
</kw>
<msg time="2026-05-01T00:53:36.027545" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:36.027665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:35.997034" elapsed="0.030704"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:36.055170" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "m "l "d "p "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:36.030090" elapsed="0.025400"/>
</kw>
<msg time="2026-05-01T00:53:36.055697" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:36.055799" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.028389" elapsed="0.027483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.056720" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.056221" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.056183" elapsed="0.000730"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.057788" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "m "l "d "p "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.057092" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.058493" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.058099" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.058078" elapsed="0.000600"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:36.058721" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:36.062715" elapsed="0.000156"/>
</kw>
<msg time="2026-05-01T00:53:36.062918" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:36.062004" elapsed="0.000990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.063215" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.063470" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:36.061169" elapsed="0.002529"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:36.059072" elapsed="0.004715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:35.994507" elapsed="0.069461"/>
</kw>
<msg time="2026-05-01T00:53:36.064067" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:36.064113" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:35.993822" elapsed="0.070329"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:36.064624" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:53:36.064234" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.064213" elapsed="0.000506"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.065211" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.065675" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.065751" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:35.993123" elapsed="0.072740"/>
</kw>
<msg time="2026-05-01T00:53:36.065957" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:36.066000" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:35.988277" elapsed="0.077758"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.066380" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.066111" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.066094" elapsed="0.000433"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:35.988127" elapsed="0.078430"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:35.987944" elapsed="0.078646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:35.985421" elapsed="0.081229"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:35.978379" elapsed="0.088328"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:35.977911" elapsed="0.088842"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:35.974394" elapsed="0.092414"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.072422" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.072602" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.072725" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.067251" elapsed="0.005502"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.072932" elapsed="0.003104"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.081896" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.082094" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:36.082267" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.076224" elapsed="0.006085"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:36.087146" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.086694" elapsed="0.000494"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:36.087906" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.087491" elapsed="0.000456"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.088183" elapsed="0.000526"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.082727" elapsed="0.006077"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:36.066965" elapsed="0.021919"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:35.973707" elapsed="0.115238"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.090109" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.090359" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.089812" elapsed="0.000589"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.090997" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.091185" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.090716" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.091775" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/announce_pmsi_mldp_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/announce_pmsi_mldp_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.091959" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.091490" elapsed="0.000508"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:36.092563" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:36.092229" elapsed="0.000375"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.093115" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/withdraw_pmsi_mldp_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/withdraw_pmsi_mldp_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.093296" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.092837" elapsed="0.000498"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:36.093888" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:36.093594" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.094548" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-p2mp-lsp&gt;
                &lt;address-family xmlns:x="urn:opendaylight:params:xml:ns:yang:bgp-types"&gt;x:ipv4-address-family&lt;/address-family&gt;
                &lt;root-node-address&gt;10.10.10.10&lt;/root-node-address&gt;
                &lt;opaque-value&gt;
                    &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                    &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
                &lt;/opaque-value&gt;
            &lt;/mldp-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.094163" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.095211" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "mldp-p2mp-lsp": {
                            "address-family": "bgp-types:ipv4-address-family",
                            "opaque-value": [
                                {
                                    "opaque": "01:01:01:01:01:01:01",
                                    "opaque-type": 1
                                }
                            ],
                            "root-node-address": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.094864" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.095903" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.095556" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.096555" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.096190" elapsed="0.000474"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:36.096889" elapsed="0.002559"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.113097" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1287', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-p2mp-lsp&gt;
                &lt;address-family xmlns:x="urn:opendaylight:params:xml:ns:yang:bgp-types"&gt;x:ipv4-address-family&lt;/address-family&gt;
                &lt;root-node-address&gt;10.10.10.10&lt;/root-node-address&gt;
                &lt;opaque-value&gt;
                    &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                    &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
                &lt;/opaque-value&gt;
            &lt;/mldp-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:36.113216" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.113396" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.099656" elapsed="0.013781"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.117754" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.113767" elapsed="0.004054"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.125215" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.126341" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '575'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:36.126738" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.118070" elapsed="0.008736"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.131714" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.127441" elapsed="0.004349"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.138500" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.139208" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '575'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:36.139504" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.133311" elapsed="0.006236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.143638" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.139834" elapsed="0.003878"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.143944" elapsed="0.003672"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.149868" level="INFO">${update} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.147848" elapsed="0.002050"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.150078" elapsed="0.002171"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:36.152308" elapsed="0.000047"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:36.132794" elapsed="0.019693"/>
</kw>
<msg time="2026-05-01T00:53:36.152580" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:36.132041" elapsed="0.020565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.153023" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.152777" elapsed="0.000291"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.154131" level="INFO">Length is 204.</msg>
<msg time="2026-05-01T00:53:36.154206" level="INFO">${len_1} = 204</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:36.153871" elapsed="0.000358"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.154655" level="INFO">Length is 204.</msg>
<msg time="2026-05-01T00:53:36.154729" level="INFO">${len_2} = 204</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:36.154382" elapsed="0.000371"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.154908" elapsed="0.000302"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.155609" level="INFO">${sum_1} = 2584</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:36.155390" elapsed="0.000245"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.155970" level="INFO">${sum_2} = 2584</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:36.155786" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.156147" elapsed="0.000299"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:36.153322" elapsed="0.003199"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:36.156669" elapsed="0.001723"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.163766" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.163896" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '575'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:36.163992" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.158948" elapsed="0.005070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.167798" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.164227" elapsed="0.003641"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.168087" elapsed="0.003525"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.176574" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.176695" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '575'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:36.176801" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.171842" elapsed="0.004985"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.179468" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.176997" elapsed="0.002529"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.179684" elapsed="0.003172"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:36.186351" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:36.182979" elapsed="0.003438"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.182946" elapsed="0.003522"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.193086" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.193133" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.193232" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.186690" elapsed="0.006568"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:36.158673" elapsed="0.034649"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.198865" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.199016" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.199147" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.194315" elapsed="0.004907"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.203000" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.199537" elapsed="0.003529"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.203286" elapsed="0.003522"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.209134" level="INFO">${update} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.207034" elapsed="0.002141"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.209418" elapsed="0.003078"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:36.212585" elapsed="0.000057"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:36.193988" elapsed="0.018804"/>
</kw>
<msg time="2026-05-01T00:53:36.212903" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:36.193512" elapsed="0.019427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.213561" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.213171" elapsed="0.000456"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.214832" level="INFO">Length is 192.</msg>
<msg time="2026-05-01T00:53:36.214936" level="INFO">${len_1} = 192</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:36.214446" elapsed="0.000523"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.215598" level="INFO">Length is 192.</msg>
<msg time="2026-05-01T00:53:36.215701" level="INFO">${len_2} = 192</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:36.215184" elapsed="0.000549"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.215951" elapsed="0.000421"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.217006" level="INFO">${sum_1} = 2137</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:36.216612" elapsed="0.000429"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:36.217528" level="INFO">${sum_2} = 2137</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:36.217252" elapsed="0.000316"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.217782" elapsed="0.000416"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:36.213945" elapsed="0.004336"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.223955" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.224065" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.224157" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.219187" elapsed="0.004995"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.227010" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.224356" elapsed="0.002702"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.227254" elapsed="0.003113"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.235331" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.235549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.235696" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.230667" elapsed="0.005065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.239373" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.235971" elapsed="0.003470"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.239678" elapsed="0.003489"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:36.245992" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:36.243276" elapsed="0.002779"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.243248" elapsed="0.002832"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.246233" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:36.218712" elapsed="0.027609"/>
</kw>
<arg>pmsi_mldp_p2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:36.089346" elapsed="0.157021"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:35.973002" elapsed="0.273499"/>
</test>
<test id="s1-s13-t65" name="Play_To_Odl_pmsi_mldp_p2mp_lsp" line="224">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:36.250217" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:36.249952" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.251526" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:36.251398" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.251378" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.256613" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:36.256500" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.256481" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.257690" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:36.257288" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.258172" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:36.257879" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:36.258242" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:53:36.258397" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:36.256913" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.264376" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:36.264267" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.264249" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.265920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:36.265737" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.265719" elapsed="0.000367"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:36.266681" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:36.266241" elapsed="0.000503"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:36.267420" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:36.267100" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:36.296990" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:36.269372" elapsed="0.027755"/>
</kw>
<msg time="2026-05-01T00:53:36.297274" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:36.297372" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.267817" elapsed="0.029627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:36.322545" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "m "l "d "p "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:36.299466" elapsed="0.023220"/>
</kw>
<msg time="2026-05-01T00:53:36.322825" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:36.322921" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.297875" elapsed="0.025117"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.323744" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.323306" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.323281" elapsed="0.000642"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.324687" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "m "l "d "p "_ "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.324083" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.325345" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.324987" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.324966" elapsed="0.000591"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:36.325598" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:36.329257" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:53:36.329466" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:36.328694" elapsed="0.000846"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.329759" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.329979" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:36.327900" elapsed="0.002300"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:36.325910" elapsed="0.004376"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:36.265266" elapsed="0.065214"/>
</kw>
<msg time="2026-05-01T00:53:36.330578" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:36.330622" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.264619" elapsed="0.066040"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:36.330849" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:53:36.330738" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.330719" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.331439" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.331898" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:36.331974" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:36.263924" elapsed="0.068207"/>
</kw>
<msg time="2026-05-01T00:53:36.332227" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:36.332272" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.258835" elapsed="0.073472"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.332662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.332385" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.332367" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:36.258686" elapsed="0.074082"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:36.258499" elapsed="0.074303"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:36.256128" elapsed="0.076734"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:36.251079" elapsed="0.081843"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:36.250648" elapsed="0.082320"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:36.247794" elapsed="0.085230"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.338339" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.338492" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.338594" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.333513" elapsed="0.005107"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:36.338788" elapsed="0.003637"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.347120" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.347269" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:36.347484" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:36.342683" elapsed="0.004843"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:36.351976" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.351543" elapsed="0.000473"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:36.352643" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:36.352234" elapsed="0.000448"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.352902" elapsed="0.000459"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:36.347850" elapsed="0.005597"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:36.333178" elapsed="0.020370"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:36.247184" elapsed="0.106468"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.354686" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.354895" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.354379" elapsed="0.000556"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.382508" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp.vanadium/pmsi_mldp_p2mp_lsp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:36.382113" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.383285" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp.vanadium/pmsi_mldp_p2mp_lsp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:36.383045" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp.vanadium/pmsi_mldp_p2mp_lsp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:36.383536" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:36.382704" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.384118" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:36.383730" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.384444" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/pmsi_mldp_p2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.384589" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.384310" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.385023" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "mldp-p2mp-lsp": {
                            "address-family": "bgp-types:ipv4-address-family",
                            "opaque-value": [
                                {
                                    "opaque": "01:01:01:01:01:01:01",
                                    "opaque-type": 1
                                }
                            ],
                            "root-node-address": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.384778" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:36.385470" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:36.385146" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.386006" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:36.385713" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:36.385562" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:36.385127" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.386705" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:36.386239" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:36.386782" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:53:36.386939" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:36.379812" elapsed="0.007153"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.387361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/announce_pmsi_mldp_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/announce_pmsi_mldp_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.387537" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.387163" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:36.387929" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/withdraw_pmsi_mldp_p2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_p2mp_lsp/withdraw_pmsi_mldp_p2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:36.388051" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:36.387734" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.388501" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-p2mp-lsp&gt;
                &lt;address-family xmlns:x="urn:opendaylight:params:xml:ns:yang:bgp-types"&gt;x:ipv4-address-family&lt;/address-family&gt;
                &lt;root-node-address&gt;10.10.10.10&lt;/root-node-address&gt;
                &lt;opaque-value&gt;
                    &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                    &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
                &lt;/opaque-value&gt;
            &lt;/mldp-p2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.388237" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.388959" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "mldp-p2mp-lsp": {
                            "address-family": "bgp-types:ipv4-address-family",
                            "opaque-value": [
                                {
                                    "opaque": "01:01:01:01:01:01:01",
                                    "opaque-type": 1
                                }
                            ],
                            "root-node-address": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.388718" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.389404" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.389166" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:36.389856" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:36.389617" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:36.390050" elapsed="0.002664"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:36.392894" elapsed="0.001783"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:36.399693" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:36.399804" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:36.399963" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:36.395665" elapsed="0.004671">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.400556" elapsed="0.000040"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:36.400906" elapsed="0.000034"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:36.395301" elapsed="0.005784">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:38.409310" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:38.409549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '575'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:38.409741" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:38.402740" elapsed="0.007040"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:38.410439" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "mldp-p2mp-lsp": {
                            "address-family": "bgp-types:ipv4-address-family",
                            "opaque-value": [
                                {
                                    "opaque": "01:01:01:01:01:01:01",
                                    "opaque-type": 1
                                }
                            ],
                            "root-node-address": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:38.413709" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:38.410040" elapsed="0.003742"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:38.418617" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:38.417855" elapsed="0.000803"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:38.419582" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:38.418881" elapsed="0.000743"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:38.419848" elapsed="0.000480"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:38.414102" elapsed="0.006315"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:38.401801" elapsed="0.018715"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:36.394875" elapsed="2.025784"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:38.420885" elapsed="0.005525"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:38.431006" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:38.431173" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:38.431306" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:38.427377" elapsed="0.003966"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:38.431603" elapsed="0.003997"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:38.442427" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:38.443684" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '723'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"mldp-p2mp-lsp":{"root-node-address":"10.10.10.10","address-family":"bgp-types:ipv4-address-family","opaque-value":[{"opaque":"01:01:01:01:01:01:01","opaque-type":1}]}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:38.443932" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:38.435840" elapsed="0.008150"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:38.450185" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:38.449770" elapsed="0.000456"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:38.451229" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:38.450448" elapsed="0.000821"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:38.451970" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "leaf-information-required": true,
        "mldp-p2mp-lsp": {
         "address-family": "bgp-types:ipv4-address-family",
         "opaque-value": [
          {
           "opaque": "01:01:01:01:01:01:01",
           "opaque-type": 1
          }
         ],
         "root-node-address": "10.10.10.10"
        },
        "mpls-label": 20024
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:38.452327" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,46 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "leaf-information-required": true,
+        "mldp-p2mp-lsp": {
+         "address-family": "bgp-types:ipv4-address-family",
+         "opaque-value": [
+          {
+           "opaque": "01:01:01:01:01:01:01",
+           "opaque-type": 1
+          }
+         ],
+         "root-node-address": "10.10.10.10"
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:38.451516" elapsed="0.001007">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,46 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "root-node-address": "10.10.10.10"
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:38.444607" elapsed="0.008151">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,46 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "root-node-address": "10.10.10.10"
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:38.427091" elapsed="0.025877">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,46 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "root-node-address": "10.10.10.10"
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.461280" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.461498" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.461650" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.454513" elapsed="0.007175"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.461944" elapsed="0.003993"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.472008" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.472163" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:40.472309" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.466180" elapsed="0.006167"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.476868" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.476338" elapsed="0.000580"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.477559" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.477146" elapsed="0.000453"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.477821" elapsed="0.000580"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.472728" elapsed="0.005783"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.453684" elapsed="0.024905"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:38.426644" elapsed="2.052000"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:40.479401" elapsed="0.002536"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.488313" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.488495" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.488644" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.483587" elapsed="0.005094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.488941" elapsed="0.004182"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.498691" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.498841" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:40.498984" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.493361" elapsed="0.005659"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.503660" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.503222" elapsed="0.000478"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.504304" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.503925" elapsed="0.000418"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.504608" elapsed="0.000490"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.499343" elapsed="0.005845"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.482829" elapsed="0.022436"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:40.482209" elapsed="0.023111"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:40.478911" elapsed="0.026485"/>
</kw>
<arg>pmsi_mldp_p2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:36.353958" elapsed="4.151528"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:36.246725" elapsed="4.258919"/>
</test>
<test id="s1-s13-t66" name="Odl_To_Play_pmsi_pim_ssm_tree" line="227">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:40.511751" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:40.511355" elapsed="0.000768"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.513674" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.513499" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.513446" elapsed="0.000316"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.518859" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.518750" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.518730" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.519960" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:40.519570" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.520467" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:40.520154" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:40.520552" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:53:40.520726" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:40.519166" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.526781" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.526667" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.526648" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.528516" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.528302" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.528284" elapsed="0.000417"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:40.529338" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:40.528893" elapsed="0.000509"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.530072" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:40.529798" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.561166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:40.532012" elapsed="0.029379"/>
</kw>
<msg time="2026-05-01T00:53:40.561620" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:40.561723" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.530462" elapsed="0.031334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.586278" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "p "i "m "_ "s "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:40.563903" elapsed="0.022617"/>
</kw>
<msg time="2026-05-01T00:53:40.586700" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:40.586797" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.562265" elapsed="0.024605"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.587676" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.587206" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.587172" elapsed="0.000686"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.588669" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "p "i "m "_ "s "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.588013" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.589358" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.589002" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.588982" elapsed="0.000565"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:40.589590" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:40.593458" elapsed="0.000154"/>
</kw>
<msg time="2026-05-01T00:53:40.593722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:40.592722" elapsed="0.001074"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.594016" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.594236" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:40.591937" elapsed="0.002725"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:40.589931" elapsed="0.004828"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:40.527852" elapsed="0.067091"/>
</kw>
<msg time="2026-05-01T00:53:40.595044" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:40.595089" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.527074" elapsed="0.068053"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:40.595324" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:40.595209" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.595189" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.595949" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.596376" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.596567" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:40.526255" elapsed="0.070431"/>
</kw>
<msg time="2026-05-01T00:53:40.596818" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:40.596866" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.521205" elapsed="0.075699"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.597240" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.596983" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.596965" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:40.521040" elapsed="0.076301"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:40.520853" elapsed="0.076521"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:40.518364" elapsed="0.079068"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:40.513056" elapsed="0.084453"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.512336" elapsed="0.085221"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:40.508158" elapsed="0.089453"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.603217" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.603363" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.603529" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.598049" elapsed="0.005509"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.603745" elapsed="0.003023"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.612828" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.612999" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:40.613158" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.607091" elapsed="0.006108"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.617917" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.617446" elapsed="0.000514"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.618616" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.618194" elapsed="0.000464"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.618893" elapsed="0.000496"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.613583" elapsed="0.005919"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.597765" elapsed="0.021822"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:40.507006" elapsed="0.112644"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.620820" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.621093" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.620502" elapsed="0.000635"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.621679" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.621862" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.621373" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.622590" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/announce_pmsi_pim_ssm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/announce_pmsi_pim_ssm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.622786" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.622202" elapsed="0.000623"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:40.623372" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:40.623063" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.623946" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/withdraw_pmsi_pim_ssm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/withdraw_pmsi_pim_ssm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.624127" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.623667" elapsed="0.000498"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:40.624707" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:40.624394" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.625505" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-ssm-tree&gt;
                &lt;p-address&gt;11.12.13.14&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-ssm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.625104" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.626004" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-ssm-tree": {
                            "p-address": "11.12.13.14",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.625766" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.626444" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.626209" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.626931" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.626696" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:40.627124" elapsed="0.002448"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.640233" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1039', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-ssm-tree&gt;
                &lt;p-address&gt;11.12.13.14&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-ssm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:40.640365" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.640597" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.629762" elapsed="0.010885"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.649402" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.640957" elapsed="0.008581"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.656501" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.657016" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:40.657136" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.649917" elapsed="0.007247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.659938" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.657350" elapsed="0.002639"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.665594" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.666203" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:40.666357" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.661050" elapsed="0.005346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.670641" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.666692" elapsed="0.004026"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.670946" elapsed="0.003674"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.677298" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.674855" elapsed="0.002485"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.677631" elapsed="0.003322"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:40.681037" elapsed="0.000064"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:40.660679" elapsed="0.020586"/>
</kw>
<msg time="2026-05-01T00:53:40.681386" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:40.660170" elapsed="0.021255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.682074" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.681704" elapsed="0.000437"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.683550" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:40.683664" level="INFO">${len_1} = 180</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:40.683129" elapsed="0.000571"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.684302" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:40.684411" level="INFO">${len_2} = 180</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:40.683931" elapsed="0.000533"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.684702" elapsed="0.000495"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.685868" level="INFO">${sum_1} = 2563</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:40.685579" elapsed="0.000327"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.686406" level="INFO">${sum_2} = 2563</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:40.686133" elapsed="0.000310"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.686716" elapsed="0.000453"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:40.682560" elapsed="0.004696"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:40.687502" elapsed="0.002076"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.695699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.695846" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:40.695943" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.690136" elapsed="0.005832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.741520" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.696143" elapsed="0.045450"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.741812" elapsed="0.002568"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.748796" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.748960" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:40.749074" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.744564" elapsed="0.004537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.751690" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.749277" elapsed="0.002464"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.751900" elapsed="0.002892"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:40.758263" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.754913" elapsed="0.003419"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.754880" elapsed="0.003485"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.765933" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.765998" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.766136" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.758670" elapsed="0.007503"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:40.689853" elapsed="0.076418"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.772373" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.772557" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.772691" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.767689" elapsed="0.005039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.776381" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.773010" elapsed="0.003456"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.776691" elapsed="0.003511"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.782746" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.780434" elapsed="0.002378"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.783034" elapsed="0.003053"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:40.786156" elapsed="0.000049"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:40.767184" elapsed="0.019159"/>
</kw>
<msg time="2026-05-01T00:53:40.786471" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:40.766534" elapsed="0.019976"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.787091" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.786750" elapsed="0.000405"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.788410" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:40.788539" level="INFO">${len_1} = 168</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:40.788047" elapsed="0.000527"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.789184" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:40.789288" level="INFO">${len_2} = 168</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:40.788794" elapsed="0.000529"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.789564" elapsed="0.000436"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.790502" level="INFO">${sum_1} = 2116</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:40.790223" elapsed="0.000316"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:40.791007" level="INFO">${sum_2} = 2116</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:40.790755" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.791255" elapsed="0.000443"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:40.787496" elapsed="0.004379"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.798168" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.798276" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.798370" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.792684" elapsed="0.005711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.801193" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.798587" elapsed="0.002654"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.801395" elapsed="0.002506"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.807847" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.807996" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.808137" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.804063" elapsed="0.004111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.811845" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.808412" elapsed="0.003499"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.812129" elapsed="0.003505"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:40.818624" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:53:40.815748" elapsed="0.002940"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.815718" elapsed="0.002997"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.818867" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:40.792237" elapsed="0.026718"/>
</kw>
<arg>pmsi_pim_ssm_tree</arg>
<status status="PASS" start="2026-05-01T00:53:40.620039" elapsed="0.198963"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.506231" elapsed="0.312886"/>
</test>
<test id="s1-s13-t67" name="Play_To_Odl_pmsi_pim_ssm_tree" line="229">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:40.822863" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:40.822597" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.824125" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.824014" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.823995" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.829203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.829097" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.829079" elapsed="0.000234"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.830320" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:40.829939" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.830820" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:40.830522" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:40.830890" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:53:40.831046" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:40.829562" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.836806" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.836699" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.836680" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.838359" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:40.838177" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.838158" elapsed="0.000392"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:40.839112" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:40.838704" elapsed="0.000469"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.839800" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:40.839537" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.869976" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:40.841745" elapsed="0.028554"/>
</kw>
<msg time="2026-05-01T00:53:40.870592" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:40.870738" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.840171" elapsed="0.030671"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:40.900498" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "p "i "m "_ "s "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:40.874142" elapsed="0.026844"/>
</kw>
<msg time="2026-05-01T00:53:40.901390" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:40.901655" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.871559" elapsed="0.030181"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.902622" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.902102" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.902057" elapsed="0.000754"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.903679" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "p "i "m "_ "s "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.902972" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.904336" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.903981" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.903961" elapsed="0.000568"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:40.904574" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:40.908243" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:53:40.908433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:40.907759" elapsed="0.000767"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.908827" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.909153" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:40.906967" elapsed="0.002413"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:40.904939" elapsed="0.004749"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:40.837736" elapsed="0.072146"/>
</kw>
<msg time="2026-05-01T00:53:40.909982" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:40.910026" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.837062" elapsed="0.073001"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:40.910251" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:53:40.910142" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.910123" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.910892" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.911329" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:40.911402" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:40.836344" elapsed="0.075189"/>
</kw>
<msg time="2026-05-01T00:53:40.911630" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:40.911676" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.831465" elapsed="0.080247"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.912055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.911800" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.911773" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:40.831306" elapsed="0.080850"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:40.831127" elapsed="0.081065"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:40.828724" elapsed="0.083528"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:40.823724" elapsed="0.088586"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:40.823277" elapsed="0.089080"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:40.820370" elapsed="0.092044"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.918528" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.918678" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.918789" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.913076" elapsed="0.005741"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:40.919005" elapsed="0.002789"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.926171" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.926384" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:40.926560" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:40.922026" elapsed="0.004572"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.931084" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.930647" elapsed="0.000477"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:40.931744" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:40.931343" elapsed="0.000439"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.932001" elapsed="0.000489"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:40.926927" elapsed="0.005651"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.912742" elapsed="0.019912"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:40.819900" elapsed="0.112818"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.934004" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.934230" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.933668" elapsed="0.000606"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.962633" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree.vanadium/pmsi_pim_ssm_tree.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:40.962201" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.963587" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree.vanadium/pmsi_pim_ssm_tree.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:40.963242" elapsed="0.000433">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree.vanadium/pmsi_pim_ssm_tree.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:40.963778" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:40.962867" elapsed="0.000936"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.964411" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:40.964005" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.964815" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/pmsi_pim_ssm_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.964977" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.964665" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.965479" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-ssm-tree": {
                            "p-address": "11.12.13.14",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.965209" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:40.966048" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:40.965671" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.966728" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:40.966330" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.966171" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:40.965640" elapsed="0.001200"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.967544" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:40.967021" elapsed="0.000552"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:40.967629" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:53:40.967801" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:40.959698" elapsed="0.008130"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.968231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/announce_pmsi_pim_ssm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/announce_pmsi_pim_ssm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.968389" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.968020" elapsed="0.000397"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:40.968794" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/withdraw_pmsi_pim_ssm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_ssm_tree/withdraw_pmsi_pim_ssm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:40.968950" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:40.968597" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.969483" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-ssm-tree&gt;
                &lt;p-address&gt;11.12.13.14&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-ssm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.969179" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.969958" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-ssm-tree": {
                            "p-address": "11.12.13.14",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.969712" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.970445" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.970186" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:40.971156" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:40.970703" elapsed="0.000500"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:40.971419" elapsed="0.002089"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:40.973696" elapsed="0.001507"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:40.980489" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:40.980670" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:40.980808" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:40.976250" elapsed="0.005092">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.981629" elapsed="0.000033"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:40.981961" elapsed="0.000035"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:40.975885" elapsed="0.006254">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:42.991330" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:42.991624" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:42.991806" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:42.983785" elapsed="0.008058"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:42.992515" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-ssm-tree": {
                            "p-address": "11.12.13.14",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:42.995762" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:42.992097" elapsed="0.003735"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:43.000630" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:42.999922" elapsed="0.000822"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:43.001651" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:43.000975" elapsed="0.000718"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:43.001939" elapsed="0.000473"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:42.996150" elapsed="0.006395"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:42.982849" elapsed="0.019777"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:40.975400" elapsed="2.027291"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:43.002883" elapsed="0.002427"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:43.010669" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:43.010801" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:43.010906" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:43.006329" elapsed="0.004603"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:43.011097" elapsed="0.002570"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:43.017745" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:43.018234" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '632'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-ssm-tree":{"p-address":"11.12.13.14","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:43.018340" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:43.013839" elapsed="0.004527"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:43.021412" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:43.021129" elapsed="0.000311"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:43.022146" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:43.021641" elapsed="0.000533"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:43.022660" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "leaf-information-required": true,
        "mpls-label": 20024,
        "pim-ssm-tree": {
         "p-address": "11.12.13.14",
         "p-multicast-group": "10.10.10.10"
        }
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:43.022930" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "leaf-information-required": true,
+        "mpls-label": 20024,
+        "pim-ssm-tree": {
+         "p-address": "11.12.13.14",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:43.022331" elapsed="0.000679">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "11.12.13.14",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:43.018609" elapsed="0.004567">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "11.12.13.14",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:43.006052" elapsed="0.017273">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "11.12.13.14",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.032883" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.033163" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.033401" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.024958" elapsed="0.008531"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.033885" elapsed="0.004286"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.043658" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.043840" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:45.044003" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.038485" elapsed="0.005557"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.049037" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.048558" elapsed="0.000522"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.049768" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.049319" elapsed="0.000490"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.050051" elapsed="0.000605"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.044417" elapsed="0.006335"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.024115" elapsed="0.026718"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:43.005531" elapsed="2.045362"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:45.051723" elapsed="0.002850"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.059985" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.060119" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.060228" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.055571" elapsed="0.004684"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.060430" elapsed="0.002765"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.068436" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.068626" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:45.068778" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.063447" elapsed="0.005370"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.073696" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.073212" elapsed="0.000527"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.074492" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.074011" elapsed="0.000525"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.074815" elapsed="0.000492"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.069175" elapsed="0.006227"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.055240" elapsed="0.020266"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:45.054766" elapsed="0.020800"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:45.051178" elapsed="0.024471"/>
</kw>
<arg>pmsi_pim_ssm_tree</arg>
<status status="PASS" start="2026-05-01T00:53:40.933095" elapsed="4.142646"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:40.819439" elapsed="4.256477"/>
</test>
<test id="s1-s13-t68" name="Odl_To_Play_pmsi_pim_sm_tree" line="232">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:45.081860" elapsed="0.000334"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:45.081432" elapsed="0.000899"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.083624" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.083479" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.083437" elapsed="0.000273"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.089024" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.088916" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.088897" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.090121" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:45.089729" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.090649" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:45.090330" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:45.090721" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:53:45.090896" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:45.089331" elapsed="0.001590"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.096950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.096839" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.096819" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.098518" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.098307" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.098274" elapsed="0.000410"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:45.099255" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:45.098839" elapsed="0.000477"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.099971" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:45.099690" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.130563" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:45.101917" elapsed="0.028845"/>
</kw>
<msg time="2026-05-01T00:53:45.130939" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:45.131035" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.100340" elapsed="0.030767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.156052" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "p "i "m "_ "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:45.133192" elapsed="0.023000"/>
</kw>
<msg time="2026-05-01T00:53:45.156325" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:45.156420" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.131571" elapsed="0.024942"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.157224" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.156835" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.156808" elapsed="0.000594"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.158154" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "p "i "m "_ "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.157571" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.158950" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.158592" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.158571" elapsed="0.000553"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:45.159165" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:45.162835" elapsed="0.000332"/>
</kw>
<msg time="2026-05-01T00:53:45.163212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:45.162242" elapsed="0.001039"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.163514" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.163736" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:45.161478" elapsed="0.002485"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:45.159504" elapsed="0.004547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:45.097851" elapsed="0.066378"/>
</kw>
<msg time="2026-05-01T00:53:45.164324" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:45.164367" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.097186" elapsed="0.067219"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:45.164608" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:53:45.164498" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.164479" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.165172" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.165698" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.165773" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:45.096445" elapsed="0.069438"/>
</kw>
<msg time="2026-05-01T00:53:45.165978" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:45.166022" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.091320" elapsed="0.074738"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.166401" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.166133" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.166116" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:45.091168" elapsed="0.075350"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:45.090981" elapsed="0.075571"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:45.088546" elapsed="0.078063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:45.083147" elapsed="0.083518"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.082607" elapsed="0.084103"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:45.078011" elapsed="0.088756"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.171689" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.171832" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.172003" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.167205" elapsed="0.004826"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.172204" elapsed="0.002694"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.178798" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.178920" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:45.179028" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.175065" elapsed="0.003989"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.182193" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.181884" elapsed="0.000338"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.182684" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.182395" elapsed="0.000316"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.182870" elapsed="0.000339"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.179301" elapsed="0.003971"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.166925" elapsed="0.016402"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:45.077246" elapsed="0.106124"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.184157" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.184358" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.183953" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.184753" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.184881" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.184561" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.185254" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/announce_pmsi_pim_sm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/announce_pmsi_pim_sm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.185378" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.185065" elapsed="0.000339"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:45.185791" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:45.185578" elapsed="0.000242"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.186168" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/withdraw_pmsi_pim_sm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/withdraw_pmsi_pim_sm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.186292" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.185981" elapsed="0.000410"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:45.186772" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:45.186568" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.187205" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-sm-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-sm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.186959" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.187672" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-sm-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.187417" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.188114" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.187878" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.188562" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.188312" elapsed="0.000295"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:45.188758" elapsed="0.002543"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.204830" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1037', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-sm-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-sm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:45.204912" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.205038" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.191488" elapsed="0.013576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.208047" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.205267" elapsed="0.002825"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.213337" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.213863" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '483'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:45.213983" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.208257" elapsed="0.005752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.216893" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.214187" elapsed="0.002762"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.222388" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.222832" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '483'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:45.222937" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.218190" elapsed="0.004773"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.225633" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.223143" elapsed="0.002540"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.225843" elapsed="0.002537"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.230605" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.228561" elapsed="0.002073"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.230814" elapsed="0.002136"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:45.233005" elapsed="0.000044"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:45.217778" elapsed="0.015379"/>
</kw>
<msg time="2026-05-01T00:53:45.233240" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:45.217157" elapsed="0.016109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.233700" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.233438" elapsed="0.000307"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.234667" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:45.234742" level="INFO">${len_1} = 180</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:45.234382" elapsed="0.000384"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.235237" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:45.235312" level="INFO">${len_2} = 180</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:45.234980" elapsed="0.000357"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.235511" elapsed="0.000310"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.236176" level="INFO">${sum_1} = 2686</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:45.235985" elapsed="0.000217"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.236559" level="INFO">${sum_2} = 2686</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:45.236354" elapsed="0.000231"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.236740" elapsed="0.000304"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:45.233995" elapsed="0.003109"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:45.237254" elapsed="0.001870"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.243692" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.243835" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '483'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:45.243932" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.239689" elapsed="0.004268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.246866" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.244129" elapsed="0.002787"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.247074" elapsed="0.002508"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.253683" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.253816" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '483'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:45.253927" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.249748" elapsed="0.004205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.256598" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.254132" elapsed="0.002516"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.256872" elapsed="0.002504"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:45.261778" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.259482" elapsed="0.002459"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.259442" elapsed="0.002530"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.268043" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.268089" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.268192" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.262132" elapsed="0.006087"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:45.239387" elapsed="0.028904"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.273183" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.273304" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.273397" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.269307" elapsed="0.004115"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.276052" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.273616" elapsed="0.002484"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.276255" elapsed="0.002526"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.280922" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.278946" elapsed="0.002007"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.281136" elapsed="0.002190"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:45.283380" elapsed="0.000041"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:45.268964" elapsed="0.014577"/>
</kw>
<msg time="2026-05-01T00:53:45.283625" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:45.268484" elapsed="0.015168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.284068" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.283821" elapsed="0.000293"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.285016" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:45.285090" level="INFO">${len_1} = 168</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:45.284749" elapsed="0.000364"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.285533" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:45.285609" level="INFO">${len_2} = 168</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:45.285267" elapsed="0.000366"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.285828" elapsed="0.000444"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.286683" level="INFO">${sum_1} = 2239</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:45.286485" elapsed="0.000225"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:45.287125" level="INFO">${sum_2} = 2239</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:45.286938" elapsed="0.000212"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.287304" elapsed="0.000320"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:45.284357" elapsed="0.003331"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.293193" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.293336" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.293435" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.288293" elapsed="0.005188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.296422" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.293661" elapsed="0.002825"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.296644" elapsed="0.002547"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.303394" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.303609" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.303770" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.299353" elapsed="0.004455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.307751" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.304065" elapsed="0.003755"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.308053" elapsed="0.003604"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:45.315215" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-05-01T00:53:45.311785" elapsed="0.003532"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.311751" elapsed="0.003605"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.315621" elapsed="0.000035"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:45.287980" elapsed="0.027781"/>
</kw>
<arg>pmsi_pim_sm_tree</arg>
<status status="PASS" start="2026-05-01T00:53:45.183655" elapsed="0.132177"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.076522" elapsed="0.239476"/>
</test>
<test id="s1-s13-t69" name="Play_To_Odl_pmsi_pim_sm_tree" line="234">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:45.321590" elapsed="0.000266"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:45.321256" elapsed="0.000662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.323410" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.323201" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.323176" elapsed="0.000338"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.329735" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.329609" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.329588" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.331042" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:45.330615" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.331548" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:45.331235" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:45.331619" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:45.331785" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:45.330116" elapsed="0.001694"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.339131" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.339020" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.339000" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.340674" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:45.340491" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.340471" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:45.341409" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:45.340991" elapsed="0.000499"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.342105" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:45.341837" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.374185" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:45.344318" elapsed="0.030001"/>
</kw>
<msg time="2026-05-01T00:53:45.374493" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:45.374592" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.342691" elapsed="0.031974"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:45.400076" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "p "i "m "_ "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:45.376644" elapsed="0.023573"/>
</kw>
<msg time="2026-05-01T00:53:45.400351" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:45.400446" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.375075" elapsed="0.025478"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.401239" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.400864" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.400838" elapsed="0.000584"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.402182" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "p "i "m "_ "s "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.401592" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.402879" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.402522" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.402501" elapsed="0.000556"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:45.403097" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:45.406848" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:53:45.407036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:45.406256" elapsed="0.000849"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.407322" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.407559" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:45.405391" elapsed="0.002390"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:45.403422" elapsed="0.004447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:45.340027" elapsed="0.068022"/>
</kw>
<msg time="2026-05-01T00:53:45.408144" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:45.408188" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.339360" elapsed="0.068865"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:45.408412" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:53:45.408303" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.408284" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.408983" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.409411" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:45.409527" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:45.338665" elapsed="0.070975"/>
</kw>
<msg time="2026-05-01T00:53:45.409737" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:45.409780" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.332197" elapsed="0.077623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.410155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.409900" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.409882" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:45.332051" elapsed="0.078205"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:45.331868" elapsed="0.078421"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:45.329154" elapsed="0.081191"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:45.322843" elapsed="0.087592"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:45.322275" elapsed="0.088277"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:45.318423" elapsed="0.092186"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.416088" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.416255" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.416386" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.411043" elapsed="0.005371"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:45.416719" elapsed="0.003586"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.425871" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.426050" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:45.426207" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:45.420585" elapsed="0.005661"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.431090" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.430626" elapsed="0.000506"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:45.431793" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:45.431368" elapsed="0.000468"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.432076" elapsed="0.000535"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:45.426679" elapsed="0.006025"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.410761" elapsed="0.022026"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:45.317445" elapsed="0.115404"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.433933" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.434189" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.433634" elapsed="0.000597"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.460196" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree.vanadium/pmsi_pim_sm_tree.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:45.459769" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.461063" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree.vanadium/pmsi_pim_sm_tree.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:45.460785" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree.vanadium/pmsi_pim_sm_tree.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:45.461238" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:45.460410" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.461836" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:45.461433" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.462166" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/pmsi_pim_sm_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.462326" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.462027" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.462929" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-sm-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.462674" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:45.463437" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:45.463068" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.463999" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:45.463700" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.463547" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:45.463042" elapsed="0.001040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.464715" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:45.464232" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:45.464796" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:45.464966" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:45.457373" elapsed="0.007620"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.465352" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/announce_pmsi_pim_sm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/announce_pmsi_pim_sm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.465546" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.465156" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:45.465939" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/withdraw_pmsi_pim_sm_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_pim_sm_tree/withdraw_pmsi_pim_sm_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:45.466062" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:45.465747" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.466527" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;pim-sm-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/pim-sm-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.466249" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.466986" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-sm-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.466742" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.467492" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.467234" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:45.467935" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:45.467695" elapsed="0.000284"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:45.468133" elapsed="0.002582"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:45.470903" elapsed="0.001758"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:45.478925" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:45.479106" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:45.479247" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:45.474018" elapsed="0.005810">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.480097" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:45.480433" elapsed="0.000055"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:45.473553" elapsed="0.007079">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:47.488412" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:47.488667" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '483'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:47.488823" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:47.481879" elapsed="0.006984"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:47.489590" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "pim-sm-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:47.493100" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:47.489145" elapsed="0.004031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:47.498009" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:47.497240" elapsed="0.000812"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:47.498957" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:47.498289" elapsed="0.000711"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:47.499287" elapsed="0.000513"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:47.493556" elapsed="0.006336"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:47.481175" elapsed="0.018798"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:45.472930" elapsed="2.027117"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:47.500285" elapsed="0.002730"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:47.510286" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:47.510492" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:47.510638" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:47.504382" elapsed="0.006296"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:47.510930" elapsed="0.004148"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:47.520705" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:47.521418" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '631'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"pim-sm-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:47.521582" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:47.515429" elapsed="0.006188"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:47.526235" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:47.525802" elapsed="0.000474"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:47.527312" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:47.526534" elapsed="0.000889"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:47.528172" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "leaf-information-required": true,
        "mpls-label": 20024,
        "pim-sm-tree": {
         "p-address": "43.43.43.43",
         "p-multicast-group": "10.10.10.10"
        }
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:47.528525" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "leaf-information-required": true,
+        "mpls-label": 20024,
+        "pim-sm-tree": {
+         "p-address": "43.43.43.43",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:47.527699" elapsed="0.000945">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "43.43.43.43",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:47.522018" elapsed="0.006878">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "43.43.43.43",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:47.503983" elapsed="0.025136">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "p-address": "43.43.43.43",
+         "p-multicast-group": "10.10.10.10"
+        }
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.538735" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.539017" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.539256" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.530665" elapsed="0.008651"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.539751" elapsed="0.003802"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.549314" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.549577" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:49.549723" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.543810" elapsed="0.005950"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.554082" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.553662" elapsed="0.000460"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.554739" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.554341" elapsed="0.000438"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.555000" elapsed="0.000476"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.550086" elapsed="0.005479"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.529852" elapsed="0.025791"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:47.503327" elapsed="2.052373"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:49.556522" elapsed="0.002655"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.564349" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.564474" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.564579" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.560516" elapsed="0.004088"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.564767" elapsed="0.002526"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.571733" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.571903" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:49.572048" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.567470" elapsed="0.004614"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.576444" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.576053" elapsed="0.000457"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.577224" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.576732" elapsed="0.000530"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.577509" elapsed="0.000449"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.572396" elapsed="0.005697"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.559841" elapsed="0.018327"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:49.559373" elapsed="0.018847"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:49.555985" elapsed="0.022310"/>
</kw>
<arg>pmsi_pim_sm_tree</arg>
<status status="PASS" start="2026-05-01T00:53:45.433171" elapsed="4.145188"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:45.316473" elapsed="4.262061"/>
</test>
<test id="s1-s13-t70" name="Odl_To_Play_pmsi_bidir_pim_tree" line="237">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:49.583738" elapsed="0.000310"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:49.583348" elapsed="0.000776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.585568" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.585382" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.585352" elapsed="0.000321"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.591356" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.591249" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.591230" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.592470" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:49.592071" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.592958" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:49.592662" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:49.593034" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:53:49.593196" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:49.591672" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.599011" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.598897" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.598879" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.600572" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.600365" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.600346" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:49.601299" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:49.600892" elapsed="0.000468"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.601996" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:49.601728" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.631687" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:49.603930" elapsed="0.027960"/>
</kw>
<msg time="2026-05-01T00:53:49.632042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:49.632138" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.602366" elapsed="0.029844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.658738" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "b "i "d "i "r "_ "p "i "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:49.634235" elapsed="0.024641"/>
</kw>
<msg time="2026-05-01T00:53:49.659009" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:49.659102" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.632645" elapsed="0.026529"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.659949" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.659503" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.659477" elapsed="0.000838"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.661064" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "b "i "d "i "r "_ "p "i "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.660484" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.661735" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.661364" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.661344" elapsed="0.000567"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:49.661950" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:49.665758" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:53:49.665942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:49.665203" elapsed="0.000807"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.666224" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.666441" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:49.664402" elapsed="0.002275"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:49.662417" elapsed="0.004346"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:49.599924" elapsed="0.067016"/>
</kw>
<msg time="2026-05-01T00:53:49.667033" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:49.667077" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.599238" elapsed="0.067876"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:49.667300" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:53:49.667191" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.667172" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.667879" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.668314" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.668389" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:49.598554" elapsed="0.070018"/>
</kw>
<msg time="2026-05-01T00:53:49.668668" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:49.668713" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.593617" elapsed="0.075134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.669090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.668834" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.668817" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:49.593468" elapsed="0.075723"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:49.593277" elapsed="0.075945"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:49.590876" elapsed="0.078403"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:49.584971" elapsed="0.084366"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.584338" elapsed="0.085045"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:49.580297" elapsed="0.089141"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.674178" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.674307" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.674418" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.669916" elapsed="0.004528"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.674630" elapsed="0.002883"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.681690" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.681838" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:49.681981" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.677681" elapsed="0.004339"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.686345" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.685938" elapsed="0.000448"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.687008" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.686629" elapsed="0.000423"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.687277" elapsed="0.000481"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.682342" elapsed="0.005521"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.669639" elapsed="0.018308"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:49.579611" elapsed="0.108393"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.689077" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.689322" level="INFO">${data_xml} = &lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-d...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.688799" elapsed="0.000564"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.689873" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.690049" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.689605" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.690589" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/announce_pmsi_bidir_pim_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/announce_pmsi_bidir_pim_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.690803" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.690304" elapsed="0.000537"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:49.691360" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:49.691067" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.691954" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/withdraw_pmsi_bidir_pim_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/withdraw_pmsi_bidir_pim_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.692132" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.691644" elapsed="0.000525"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:49.692695" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:49.692391" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.693217" level="INFO">&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;bidir-pim-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/bidir-pim-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.692959" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.693684" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "bidir-pim-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.693430" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.694129" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.693891" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.694579" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.694326" elapsed="0.000298"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:49.694774" elapsed="0.002187"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.706820" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1020', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;bidir-pim-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/bidir-pim-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:49.706953" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.707086" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.697143" elapsed="0.009979"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.712326" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.707362" elapsed="0.005062"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.718736" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.719148" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '486'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:49.719252" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.712817" elapsed="0.006461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.721933" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.719469" elapsed="0.002514"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.727408" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.728435" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '486'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:49.728707" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.722941" elapsed="0.005830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.735363" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.729193" elapsed="0.006343"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.736074" elapsed="0.003051"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.741876" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.739292" elapsed="0.002688"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.742334" elapsed="0.004104"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:49.746530" elapsed="0.000054"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:49.722612" elapsed="0.024112"/>
</kw>
<msg time="2026-05-01T00:53:49.746882" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:49.722158" elapsed="0.024760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.747524" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.747153" elapsed="0.000436"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.748844" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:49.748948" level="INFO">${len_1} = 180</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:49.748480" elapsed="0.000501"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.749569" level="INFO">Length is 180.</msg>
<msg time="2026-05-01T00:53:49.749672" level="INFO">${len_2} = 180</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:49.749198" elapsed="0.000507"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.749922" elapsed="0.000421"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.750847" level="INFO">${sum_1} = 2687</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:49.750585" elapsed="0.000298"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.751348" level="INFO">${sum_2} = 2687</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:49.751096" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.751619" elapsed="0.000441"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:49.747954" elapsed="0.004188"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:49.752352" elapsed="0.001784"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.759150" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.759271" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '486'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:49.759365" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.754674" elapsed="0.004718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.762323" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.759581" elapsed="0.002792"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.762543" elapsed="0.002540"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.769999" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.770161" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '486'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:49.770352" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.765308" elapsed="0.005081"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.774248" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.770656" elapsed="0.003668"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.774591" elapsed="0.003501"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:49.781470" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.778205" elapsed="0.003333"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.778174" elapsed="0.003396"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.788439" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.788560" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.788750" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.781780" elapsed="0.007018"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:49.754376" elapsed="0.034544"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.794043" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.794198" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.794327" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.789917" elapsed="0.004446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.798021" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.794629" elapsed="0.003458"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.798304" elapsed="0.003503"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.804092" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.802034" elapsed="0.002099"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.804375" elapsed="0.002986"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:49.807431" elapsed="0.000063"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:49.789588" elapsed="0.018045"/>
</kw>
<msg time="2026-05-01T00:53:49.807741" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:49.789123" elapsed="0.018653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.808365" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.808025" elapsed="0.000403"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.809676" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:49.809845" level="INFO">${len_1} = 168</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:49.809285" elapsed="0.000595"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.810480" level="INFO">Length is 168.</msg>
<msg time="2026-05-01T00:53:49.810590" level="INFO">${len_2} = 168</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:49.810101" elapsed="0.000522"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.810843" elapsed="0.000425"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.811771" level="INFO">${sum_1} = 2240</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:49.811511" elapsed="0.000296"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:49.812329" level="INFO">${sum_2} = 2240</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:49.812070" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.812601" elapsed="0.000419"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:49.808779" elapsed="0.004301"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.817408" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.817539" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.817632" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.813647" elapsed="0.004011"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.820527" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.817831" elapsed="0.002745"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.820732" elapsed="0.003506"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.829149" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.829257" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.829359" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.824488" elapsed="0.004897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.832010" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.829577" elapsed="0.002481"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.832214" elapsed="0.002504"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:49.837117" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:49.834794" elapsed="0.002384"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.834775" elapsed="0.002429"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.837354" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:49.813329" elapsed="0.024164"/>
</kw>
<arg>pmsi_bidir_pim_tree</arg>
<status status="PASS" start="2026-05-01T00:53:49.688364" elapsed="0.149176"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.578953" elapsed="0.258708"/>
</test>
<test id="s1-s13-t71" name="Play_To_Odl_pmsi_bidir_pim_tree" line="239">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:49.841389" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:49.841123" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.842661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.842550" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.842531" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.847794" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.847687" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.847669" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.848913" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:49.848527" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.849397" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:49.849104" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:49.849482" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:53:49.849641" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:49.848129" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.855494" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.855367" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.855349" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.857044" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:49.856863" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.856845" elapsed="0.000363"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:49.857788" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:49.857361" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.858506" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:49.858223" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.888373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:49.860430" elapsed="0.028095"/>
</kw>
<msg time="2026-05-01T00:53:49.888661" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:49.888756" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.858877" elapsed="0.029951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:49.916442" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "b "i "d "i "r "_ "p "i "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:49.890852" elapsed="0.025843"/>
</kw>
<msg time="2026-05-01T00:53:49.916898" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:49.917045" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.889231" elapsed="0.027918"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.918128" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.917612" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.917579" elapsed="0.000799"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.919417" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "b "i "d "i "r "_ "p "i "m "_ "t "r "e "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.918614" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.920798" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.920116" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.920076" elapsed="0.001013"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:49.921148" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:49.924907" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:53:49.925099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:49.924312" elapsed="0.000856"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.925389" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.925624" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:49.923517" elapsed="0.002327"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:49.921551" elapsed="0.004379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:49.856400" elapsed="0.069707"/>
</kw>
<msg time="2026-05-01T00:53:49.926201" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:49.926252" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.855732" elapsed="0.070559"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:49.926544" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:53:49.926370" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.926350" elapsed="0.000281"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.927111" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.927559" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:49.927634" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:49.855020" elapsed="0.072726"/>
</kw>
<msg time="2026-05-01T00:53:49.927840" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:49.927902" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.850050" elapsed="0.077895"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:49.928281" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.928024" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.928006" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:49.849903" elapsed="0.078479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:49.849724" elapsed="0.078691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:49.847315" elapsed="0.081175"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:49.842246" elapsed="0.086302"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:49.841821" elapsed="0.086773"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:49.838929" elapsed="0.089719"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.933955" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.934130" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:49.934231" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.929075" elapsed="0.005183"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:49.934428" elapsed="0.002659"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:49.944950" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:49.945098" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:49.945241" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:49.937253" elapsed="0.008026"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.949746" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.949299" elapsed="0.000487"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:49.950381" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:49.950006" elapsed="0.000414"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.950661" elapsed="0.000450"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:49.945629" elapsed="0.005568"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.928798" elapsed="0.022474"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:49.838466" elapsed="0.112862"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.952378" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.952615" level="INFO">${data_xml} = &lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-d...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.952073" elapsed="0.000582"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.980829" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree.vanadium/pmsi_bidir_pim_tree.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:49.980434" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.981626" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree.vanadium/pmsi_bidir_pim_tree.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:49.981366" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree.vanadium/pmsi_bidir_pim_tree.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:49.981800" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:49.981026" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.982416" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:49.981993" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.982804" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/pmsi_bidir_pim_tree.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.982930" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.982666" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.983529" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "bidir-pim-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.983170" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:49.984155" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:49.983700" elapsed="0.000546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.984979" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:49.984544" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.984299" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:49.983672" elapsed="0.001424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.985987" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:49.985308" elapsed="0.000723"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:49.986102" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:53:49.986348" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:49.978053" elapsed="0.008333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.986914" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/announce_pmsi_bidir_pim_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/announce_pmsi_bidir_pim_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.987110" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.986642" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:49.987664" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/withdraw_pmsi_bidir_pim_tree.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_bidir_pim_tree/withdraw_pmsi_bidir_pim_tree.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:49.988002" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:49.987371" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.988663" level="INFO">&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;true&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;bidir-pim-tree&gt;
                &lt;p-address&gt;43.43.43.43&lt;/p-address&gt;
                &lt;p-multicast-group&gt;10.10.10.10&lt;/p-multicast-group&gt;
            &lt;/bidir-pim-tree&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.988284" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.989217" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "bidir-pim-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.988961" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.989726" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.989480" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:49.991745" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:49.989949" elapsed="0.001847"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:49.991982" elapsed="0.002345"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:49.994554" elapsed="0.001704"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:50.002846" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:50.003005" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:50.003301" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:49.997397" elapsed="0.006453">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:50.004238" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:50.004618" elapsed="0.000038"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:49.996950" elapsed="0.007853">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:52.015219" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:52.015447" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '486'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:52.015648" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:52.006653" elapsed="0.009033"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:52.016422" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": true,
                        "mpls-label": 20024,
                        "bidir-pim-tree": {
                            "p-address": "43.43.43.43",
                            "p-multicast-group": "10.10.10.10"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:52.020097" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:52.015987" elapsed="0.004189"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:52.025373" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:52.024605" elapsed="0.000812"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:52.026338" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:52.025679" elapsed="0.000701"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:52.026635" elapsed="0.000508"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:52.020564" elapsed="0.006670"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:52.005538" elapsed="0.021779"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:49.996520" elapsed="2.030868"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:52.027645" elapsed="0.002542"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:52.036428" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:52.036622" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:52.036727" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:52.031164" elapsed="0.005589"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:52.036929" elapsed="0.002981"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:52.045630" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:52.046386" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '634'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":true,"mpls-label":20024,"bidir-pim-tree":{"p-address":"43.43.43.43","p-multicast-group":"10.10.10.10"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:52.046579" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:52.040080" elapsed="0.006539"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:52.051610" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:52.051124" elapsed="0.000529"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:52.052680" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:52.051888" elapsed="0.000914"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:52.053577" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "bidir-pim-tree": {
         "p-address": "43.43.43.43",
         "p-multicast-group": "10.10.10.10"
        },
        "leaf-information-required": true,
        "mpls-label": 20024
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:52.053937" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "bidir-pim-tree": {
+         "p-address": "43.43.43.43",
+         "p-multicast-group": "10.10.10.10"
+        },
+        "leaf-information-required": true,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:52.053044" elapsed="0.001010">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": true,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:52.046998" elapsed="0.007307">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": true,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:52.030872" elapsed="0.023677">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": true,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.063857" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.064048" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.064196" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.056003" elapsed="0.008230"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.064499" elapsed="0.003666"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.074810" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.075028" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:54.075174" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.068399" elapsed="0.006812"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.079585" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.079134" elapsed="0.000491"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.080229" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.079847" elapsed="0.000421"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.080514" elapsed="0.000465"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.075559" elapsed="0.005507"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.055180" elapsed="0.025963"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:52.030393" elapsed="2.050805"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:54.082015" elapsed="0.002459"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.090053" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.090176" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.090323" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.085862" elapsed="0.004498"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.090620" elapsed="0.003583"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.099368" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.099545" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:54.099689" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.094436" elapsed="0.005290"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.104117" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.103720" elapsed="0.000436"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.104773" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.104376" elapsed="0.000435"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.105029" elapsed="0.000490"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.100043" elapsed="0.005614"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.085096" elapsed="0.020636"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:54.084674" elapsed="0.021111"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:54.081517" elapsed="0.024342"/>
</kw>
<arg>pmsi_bidir_pim_tree</arg>
<status status="PASS" start="2026-05-01T00:53:49.951644" elapsed="4.154279"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:49.837974" elapsed="4.268102"/>
</test>
<test id="s1-s13-t72" name="Odl_To_Play_pmsi_ingress_replication" line="242">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:54.110998" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:54.110732" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.112304" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.112179" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.112154" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.117485" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.117359" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.117339" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.118572" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:54.118171" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.119062" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:54.118764" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:54.119132" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:53:54.119297" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:54.117789" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.125096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.124985" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.124967" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.126665" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.126479" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.126437" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:54.127396" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:54.126983" elapsed="0.000491"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.128095" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:54.127827" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.165505" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:54.130049" elapsed="0.035595"/>
</kw>
<msg time="2026-05-01T00:53:54.165779" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:54.165872" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.128481" elapsed="0.037462"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.208115" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "i "n "g "r "e "s "s "_ "r "e "p "l "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:54.167877" elapsed="0.040463"/>
</kw>
<msg time="2026-05-01T00:53:54.208578" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:54.208714" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.166337" elapsed="0.042483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.209964" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.209372" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.209290" elapsed="0.000938"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.211350" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "i "n "g "r "e "s "s "_ "r "e "p "l "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.210488" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.212324" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.211806" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.211776" elapsed="0.000831"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:54.212674" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:54.217878" elapsed="0.000201"/>
</kw>
<msg time="2026-05-01T00:53:54.218144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:54.217008" elapsed="0.001232"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.218640" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.218866" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:54.215948" elapsed="0.003142"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:54.213122" elapsed="0.006058"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:54.126014" elapsed="0.093375"/>
</kw>
<msg time="2026-05-01T00:53:54.219510" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:54.219559" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.125356" elapsed="0.094243"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:54.219802" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:54.219686" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.219663" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.220417" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.220909" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.220988" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:54.124645" elapsed="0.096458"/>
</kw>
<msg time="2026-05-01T00:53:54.221206" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:54.221252" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.119734" elapsed="0.101557"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.221817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.221411" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.221392" elapsed="0.000505"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:54.119584" elapsed="0.102338"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:54.119380" elapsed="0.102579"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:54.116956" elapsed="0.105065"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:54.111879" elapsed="0.110202"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.111413" elapsed="0.110715"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:54.107881" elapsed="0.114304"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.236796" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.236984" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.237144" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.222721" elapsed="0.014480"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.237671" elapsed="0.006690"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.250697" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.250806" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:54.250914" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.244823" elapsed="0.006129"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.254197" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.253863" elapsed="0.000394"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.254907" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.254511" elapsed="0.000437"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.255177" elapsed="0.000530"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.251195" elapsed="0.004600"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.222395" elapsed="0.033479"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:54.107189" elapsed="0.148742"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.257088" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.257318" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.256800" elapsed="0.000593"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.257957" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.258142" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.257674" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.258728" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/announce_pmsi_ingress_replication.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/announce_pmsi_ingress_replication.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.258961" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.258411" elapsed="0.000589"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:54.259554" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:54.259227" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.260136" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/withdraw_pmsi_ingress_replication.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/withdraw_pmsi_ingress_replication.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.260325" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.259853" elapsed="0.000509"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:54.260952" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:54.260628" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.261666" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;ingress-replication&gt;
                &lt;receiving-endpoint-address&gt;172.12.123.3&lt;/receiving-endpoint-address&gt;
            &lt;/ingress-replication&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.261231" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.262386" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": false,
                        "mpls-label": 20024,
                        "ingress-replication": {
                            "receiving-endpoint-address": "172.12.123.3"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.261987" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.263074" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.262730" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.263754" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.263384" elapsed="0.000432"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:54.264032" elapsed="0.002342"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.283388" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1022', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;ingress-replication&gt;
                &lt;receiving-endpoint-address&gt;172.12.123.3&lt;/receiving-endpoint-address&gt;
            &lt;/ingress-replication&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:54.283693" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.283947" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.266578" elapsed="0.017449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.290621" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.284430" elapsed="0.006275"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.300821" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.301447" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '476'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:54.301626" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.290942" elapsed="0.010723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.305493" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.301935" elapsed="0.003632"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.313799" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.314343" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '476'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:54.314504" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.307014" elapsed="0.007530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.318494" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.314788" elapsed="0.003784"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.318797" elapsed="0.003713"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.325134" level="INFO">${update} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.322782" elapsed="0.002398"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.325509" elapsed="0.003116"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:54.328700" elapsed="0.000057"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:54.306531" elapsed="0.022375"/>
</kw>
<msg time="2026-05-01T00:53:54.329071" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:54.305817" elapsed="0.023293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.329785" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.329402" elapsed="0.000449"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.331142" level="INFO">Length is 172.</msg>
<msg time="2026-05-01T00:53:54.331255" level="INFO">${len_1} = 172</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:54.330769" elapsed="0.000520"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.331930" level="INFO">Length is 172.</msg>
<msg time="2026-05-01T00:53:54.332037" level="INFO">${len_2} = 172</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:54.331558" elapsed="0.000514"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.332295" elapsed="0.000487"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.333279" level="INFO">${sum_1} = 2773</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:54.333008" elapsed="0.000307"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.333879" level="INFO">${sum_2} = 2773</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:54.333583" elapsed="0.000333"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.334138" elapsed="0.000461"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:54.330188" elapsed="0.004496"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:54.334926" elapsed="0.001469"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.342429" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.342582" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '476'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:54.342680" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.336949" elapsed="0.005757"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.345595" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.342879" elapsed="0.002768"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.345829" elapsed="0.003477"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.355398" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.355615" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '476'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:54.355825" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.349579" elapsed="0.006286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.359618" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.356107" elapsed="0.003583"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.359914" elapsed="0.003637"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:54.366803" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.363673" elapsed="0.003178"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.363642" elapsed="0.003234"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.372771" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.372819" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.372919" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.367031" elapsed="0.005915"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:54.336671" elapsed="0.036341"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.378887" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.379039" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.379169" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.374087" elapsed="0.005119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.382848" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.379441" elapsed="0.003474"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.383132" elapsed="0.003536"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.388713" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.386895" elapsed="0.001858"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.388998" elapsed="0.003034"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:54.392102" elapsed="0.000046"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:54.373754" elapsed="0.018531"/>
</kw>
<msg time="2026-05-01T00:53:54.392393" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:54.373197" elapsed="0.019231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.393023" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.392681" elapsed="0.000405"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.394307" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:53:54.394410" level="INFO">${len_1} = 160</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:54.393948" elapsed="0.000564"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.395095" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:53:54.395199" level="INFO">${len_2} = 160</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:54.394738" elapsed="0.000493"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.395469" elapsed="0.000431"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.396376" level="INFO">${sum_1} = 2326</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:54.396120" elapsed="0.000292"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:54.396899" level="INFO">${sum_2} = 2326</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:54.396646" elapsed="0.000288"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.397149" elapsed="0.000480"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:54.393422" elapsed="0.004291"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.402204" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.402313" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.402406" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.398396" elapsed="0.004035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.405221" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.402624" elapsed="0.002645"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.405481" elapsed="0.003232"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.413848" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.413999" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.414141" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.408937" elapsed="0.005244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.417876" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.414418" elapsed="0.003527"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.418163" elapsed="0.003555"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:54.425060" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:53:54.421827" elapsed="0.003323"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.421799" elapsed="0.003387"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.425445" elapsed="0.000052"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:54.398067" elapsed="0.027575"/>
</kw>
<arg>pmsi_ingress_replication</arg>
<status status="PASS" start="2026-05-01T00:53:54.256309" elapsed="0.169398"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.106519" elapsed="0.319341"/>
</test>
<test id="s1-s13-t73" name="Play_To_Odl_pmsi_ingress_replication" line="244">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:54.429654" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:54.429350" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.430918" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.430806" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.430787" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.435985" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.435877" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.435860" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.437055" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:54.436674" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.437597" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:54.437246" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:54.437668" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:53:54.437825" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:54.436282" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.443668" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.443554" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.443533" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.445220" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:54.445033" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.445015" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:54.445998" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:54.445581" elapsed="0.000478"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.446691" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:54.446409" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.502263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:54.448605" elapsed="0.053827"/>
</kw>
<msg time="2026-05-01T00:53:54.502608" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:54.502706" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.447059" elapsed="0.055720"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:54.539009" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "i "n "g "r "e "s "s "_ "r "e "p "l "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:54.504783" elapsed="0.034392"/>
</kw>
<msg time="2026-05-01T00:53:54.539322" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:54.539419" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.503197" elapsed="0.036323"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.540287" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.539856" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.539820" elapsed="0.000673"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.541286" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "i "n "g "r "e "s "s "_ "r "e "p "l "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.540656" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.542130" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.541749" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.541727" elapsed="0.000590"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:54.542361" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:54.546080" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:53:54.546273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:54.545597" elapsed="0.000748"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.546608" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.546837" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:54.544755" elapsed="0.002304"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:54.542711" elapsed="0.004438"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:54.444592" elapsed="0.102737"/>
</kw>
<msg time="2026-05-01T00:53:54.547426" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:54.547599" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.443908" elapsed="0.103738"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:54.547844" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:53:54.547731" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.547711" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.548417" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.548931" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:54.549009" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:54.443180" elapsed="0.105948"/>
</kw>
<msg time="2026-05-01T00:53:54.549226" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:54.549271" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.438240" elapsed="0.111071"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.549794" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.549390" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.549373" elapsed="0.000505"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:54.438087" elapsed="0.111814"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:54.437907" elapsed="0.112030"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:54.435518" elapsed="0.114479"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:54.430517" elapsed="0.119537"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:54.430070" elapsed="0.120033"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:54.427180" elapsed="0.122982"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.560837" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.561022" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.561125" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.550619" elapsed="0.010533"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:54.561627" elapsed="0.006564"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.575333" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.575443" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:54.575570" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:54.568644" elapsed="0.006953"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.579065" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.578619" elapsed="0.000486"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:54.579771" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:54.579330" elapsed="0.000482"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.580038" elapsed="0.000515"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:54.575830" elapsed="0.004816"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.550317" elapsed="0.030405"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:54.426705" elapsed="0.154077"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.581874" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.582089" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.581565" elapsed="0.000564"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.610911" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication.vanadium/pmsi_ingress_replication.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:54.610527" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.611757" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication.vanadium/pmsi_ingress_replication.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:54.611505" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication.vanadium/pmsi_ingress_replication.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:54.611936" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:54.611137" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.612575" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:54.612159" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.612950" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/pmsi_ingress_replication.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.613082" level="INFO">${template} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.612811" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.613596" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": false,
                        "mpls-label": 20024,
                        "ingress-replication": {
                            "receiving-endpoint-address": "172.12.123.3"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.613298" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:54.614045" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:54.613722" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.614632" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:54.614301" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.614134" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:54.613700" elapsed="0.001019"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.615507" level="INFO">${final_text} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:54.614874" elapsed="0.000670"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:54.615598" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:53:54.615778" level="INFO">${data_json} = {
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-dist...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:54.608158" elapsed="0.007647"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.616170" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/announce_pmsi_ingress_replication.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/announce_pmsi_ingress_replication.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.616297" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.615972" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:54.616713" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/withdraw_pmsi_ingress_replication.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_ingress_replication/withdraw_pmsi_ingress_replication.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:54.616840" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:54.616499" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.617271" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;ingress-replication&gt;
                &lt;receiving-endpoint-address&gt;172.12.123.3&lt;/receiving-endpoint-address&gt;
            &lt;/ingress-replication&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.617024" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.617813" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": false,
                        "mpls-label": 20024,
                        "ingress-replication": {
                            "receiving-endpoint-address": "172.12.123.3"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.617541" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.618312" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.618065" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:54.618787" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:54.618529" elapsed="0.000310"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:54.618994" elapsed="0.002673"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:54.621828" elapsed="0.001803"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:54.630518" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:54.630678" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:54.630835" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:54.624637" elapsed="0.006699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.631633" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:54.632003" elapsed="0.000038"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:54.624283" elapsed="0.007903">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:56.641938" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:56.642163" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '476'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:56.642312" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:56.633833" elapsed="0.008516"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:53:56.643031" level="INFO">{
    "odl-bgp-evpn:evpn-routes": {
        "evpn-route": [
            {
                "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
                "path-id": 0,
                "route-distinguisher": "429496729:1",
                "es-route": {
                    "orig-route-ip": "43.43.43.43",
                    "arbitrary": {
                        "arbitrary": "AAAAAAAAAAAA"
                    }
                },
                "attributes": {
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "pmsi-tunnel": {
                        "leaf-information-required": false,
                        "mpls-label": 20024,
                        "ingress-replication": {
                            "receiving-endpoint-address": "172.12.123.3"
                        }
                    },
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    }
                }
            }
        ]
    }
}</msg>
<msg time="2026-05-01T00:53:56.646276" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:53:56.642631" elapsed="0.003857"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:56.651245" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:56.650564" elapsed="0.000724"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:56.652139" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:56.651532" elapsed="0.000646"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:56.652399" elapsed="0.000480"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:56.646838" elapsed="0.006129"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:53:56.632897" elapsed="0.020144"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:54.623829" elapsed="2.029276"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:56.653329" elapsed="0.002413"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:56.661625" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:56.661738" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:56.661843" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:56.656669" elapsed="0.005200"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:56.662035" elapsed="0.002577"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:56.669080" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:56.669802" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '624'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"ingress-replication":{"receiving-endpoint-address":"172.12.123.3"}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:53:56.669953" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:56.664776" elapsed="0.005213"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:56.675055" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:56.673874" elapsed="0.001222"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:56.676043" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:56.675326" elapsed="0.000757"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:53:56.676823" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "ingress-replication": {
         "receiving-endpoint-address": "172.12.123.3"
        },
        "leaf-information-required": false,
        "mpls-label": 20024
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:53:56.677143" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "ingress-replication": {
+         "receiving-endpoint-address": "172.12.123.3"
+        },
+        "leaf-information-required": false,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:53:56.676358" elapsed="0.000891">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": false,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:53:56.670329" elapsed="0.007170">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": false,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:53:56.656369" elapsed="0.021341">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,39 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+        },
+        "leaf-information-required": false,
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.688029" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.688305" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.688481" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.679360" elapsed="0.009160"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.688764" elapsed="0.003657"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.698021" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.698189" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:58.698293" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.692679" elapsed="0.005642"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.701482" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.701156" elapsed="0.000356"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.701943" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.701676" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.702126" elapsed="0.000328"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.698584" elapsed="0.003946"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:58.678357" elapsed="0.024229"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:56.655935" elapsed="2.046691"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:58.703170" elapsed="0.002580"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.713923" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.714076" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.714231" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.709112" elapsed="0.005155"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.714542" elapsed="0.003662"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.723016" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.723163" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:58.723304" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.718434" elapsed="0.004906"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.727883" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.727402" elapsed="0.000520"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.728603" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.728176" elapsed="0.000466"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.728868" elapsed="0.000490"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.723727" elapsed="0.005816"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:58.708684" elapsed="0.020937"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:58.706023" elapsed="0.023654"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:53:58.702815" elapsed="0.026938"/>
</kw>
<arg>pmsi_ingress_replication</arg>
<status status="PASS" start="2026-05-01T00:53:54.581088" elapsed="4.148731"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:54.426135" elapsed="4.303836"/>
</test>
<test id="s1-s13-t74" name="Odl_To_Play_pmsi_mldp_mp2mp_lsp" line="247">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:58.735329" elapsed="0.000413"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:58.734952" elapsed="0.000873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:58.737015" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.736891" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.736868" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:58.742264" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.742156" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.742137" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.743342" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:58.742960" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.743861" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:58.743547" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:58.743932" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:53:58.744096" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:58.742582" elapsed="0.001539"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:58.749836" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.749726" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.749708" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:58.751366" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.751175" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.751156" elapsed="0.000404"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:58.752181" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:58.751745" elapsed="0.000499"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:58.752898" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:58.752623" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:58.783675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:58.754866" elapsed="0.028973"/>
</kw>
<msg time="2026-05-01T00:53:58.784053" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:58.784174" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.753291" elapsed="0.030971"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:58.810672" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "m "l "d "p "_ "m "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:58.786696" elapsed="0.024117"/>
</kw>
<msg time="2026-05-01T00:53:58.810947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:58.811041" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.784793" elapsed="0.026320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.811874" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:58.811418" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.811393" elapsed="0.000661"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.812870" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "p "m "s "i "_ "m "l "d "p "_ "m "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.812256" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.813549" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:58.813171" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.813151" elapsed="0.000575"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:58.813766" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:58.817404" elapsed="0.000223"/>
</kw>
<msg time="2026-05-01T00:53:58.817671" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:58.816849" elapsed="0.000890"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.817955" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.818176" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:58.816030" elapsed="0.002362"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:58.814074" elapsed="0.004419"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:58.750715" elapsed="0.067955"/>
</kw>
<msg time="2026-05-01T00:53:58.818764" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:58.818808" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.750062" elapsed="0.068784"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:58.819230" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:53:58.818925" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.818906" elapsed="0.000418"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.819818" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.820276" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:58.820351" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:58.749364" elapsed="0.071114"/>
</kw>
<msg time="2026-05-01T00:53:58.820579" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:58.820636" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.744519" elapsed="0.076157"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.821008" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:58.820753" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.820736" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:58.744354" elapsed="0.076754"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:58.744176" elapsed="0.076963"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:58.741793" elapsed="0.079403"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:58.736593" elapsed="0.084661"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.736046" elapsed="0.085253"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:58.731811" elapsed="0.089543"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.826760" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.826892" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.827004" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.821980" elapsed="0.005051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.827200" elapsed="0.002684"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.834200" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.834354" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:58.834527" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.830051" elapsed="0.004515"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.838927" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.838484" elapsed="0.000485"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:58.839598" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.839191" elapsed="0.000447"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.839861" elapsed="0.000509"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.834885" elapsed="0.005593"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:58.821692" elapsed="0.018868"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:58.731071" elapsed="0.109545"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:58.841732" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:58.841947" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:58.841424" elapsed="0.000564"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:58.842508" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:58.842689" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.json</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:58.842211" elapsed="0.000516"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:58.843218" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/announce_pmsi_mldp_mp2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/announce_pmsi_mldp_mp2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:58.843431" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:58.842949" elapsed="0.000542"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:58.844011" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:58.843717" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:58.844622" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/withdraw_pmsi_mldp_mp2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/withdraw_pmsi_mldp_mp2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:58.844833" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:58.844273" elapsed="0.000597"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:53:58.845381" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:53:58.845092" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.846024" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-mp2mp-lsp&gt;
                &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
            &lt;/mldp-mp2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.845677" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.846697" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          },
          "pmsi-tunnel": {
            "leaf-information-required": false,
            "mpls-label": 20024,
            "mldp-mp2mp-lsp": {
              "opaque-type": 1,
              "opaque": "01:01:01:01:01:01:01"
            }
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.846326" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.847325" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.846988" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.847973" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.847634" elapsed="0.000402"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:58.848249" elapsed="0.002368"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.866973" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '1025', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-mp2mp-lsp&gt;
                &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
            &lt;/mldp-mp2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
 
 </msg>
<msg time="2026-05-01T00:53:58.867181" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes/evpn-route=BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw%3D%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.867418" level="INFO">${resp} = &lt;Response [201]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>data=${data_xml}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=201</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.850801" elapsed="0.016713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.873511" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.867910" elapsed="0.005663"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.878120" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.878705" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '475'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:58.878857" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS_XML}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.873800" elapsed="0.005095"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.882620" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.879130" elapsed="0.003562"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.889433" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.889985" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '475'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:58.890121" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.884025" elapsed="0.006133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.893848" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.890398" elapsed="0.003520"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.894139" elapsed="0.003508"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.899722" level="INFO">${update} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.897812" elapsed="0.001940"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.899931" elapsed="0.002180"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:58.902162" elapsed="0.000036"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:58.883564" elapsed="0.018735"/>
</kw>
<msg time="2026-05-01T00:53:58.902418" level="INFO">${aupdate} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${aupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:58.882931" elapsed="0.019513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.902887" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.902639" elapsed="0.000294"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.903824" level="INFO">Length is 184.</msg>
<msg time="2026-05-01T00:53:58.903899" level="INFO">${len_1} = 184</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:58.903557" elapsed="0.000366"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.904337" level="INFO">Length is 184.</msg>
<msg time="2026-05-01T00:53:58.904411" level="INFO">${len_2} = 184</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:58.904082" elapsed="0.000353"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.904618" elapsed="0.000339"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.905305" level="INFO">${sum_1} = 2497</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:58.905117" elapsed="0.000218"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.905839" level="INFO">${sum_2} = 2497</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:58.905580" elapsed="0.000294"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.906129" elapsed="0.000456"/>
</kw>
<arg>${aupdate}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:58.903168" elapsed="0.003501"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:58.906884" elapsed="0.002020"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.914039" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.914204" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '475'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:58.914337" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.909651" elapsed="0.004722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.918327" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.914642" elapsed="0.003755"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.918644" elapsed="0.003330"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.926326" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.926447" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '475'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:53:58.926610" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.922140" elapsed="0.004497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.929244" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","path-id":0,"es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.926810" elapsed="0.002484"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.929530" elapsed="0.003576"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-05-01T00:53:58.936555" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.933221" elapsed="0.003398"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.933190" elapsed="0.003462"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.941748" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.941794" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.941893" level="INFO">${resp} = &lt;Response [204]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.936864" elapsed="0.005056"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:58.909228" elapsed="0.032757"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.946905" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.947055" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.947185" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.942951" elapsed="0.004275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.950976" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.947517" elapsed="0.003526"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.951264" elapsed="0.003565"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.957628" level="INFO">${update} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:53:58.955059" elapsed="0.002613"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.957924" elapsed="0.003035"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:53:58.961029" elapsed="0.000043"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-05-01T00:53:58.942619" elapsed="0.018636"/>
</kw>
<msg time="2026-05-01T00:53:58.961372" level="INFO">${wupdate} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${wupdate}</var>
<arg>4x</arg>
<arg>2s</arg>
<arg>Get_Update_Content</arg>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:58.942149" elapsed="0.019262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.962010" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.961667" elapsed="0.000407"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.963289" level="INFO">Length is 172.</msg>
<msg time="2026-05-01T00:53:58.963443" level="INFO">${len_1} = 172</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:58.962928" elapsed="0.000578"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.964084" level="INFO">Length is 172.</msg>
<msg time="2026-05-01T00:53:58.964189" level="INFO">${len_2} = 172</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:53:58.963726" elapsed="0.000497"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.964441" elapsed="0.000451"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.965400" level="INFO">${sum_1} = 2050</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:58.965112" elapsed="0.000325"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:53:58.965930" level="INFO">${sum_2} = 2050</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:53:58.965676" elapsed="0.000290"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:58.966180" elapsed="0.000448"/>
</kw>
<arg>${wupdate}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:53:58.962397" elapsed="0.004314"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.971810" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.971918" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.972011" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.967502" elapsed="0.004535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.974871" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.972205" elapsed="0.002714"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.975076" elapsed="0.002576"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:58.983382" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:58.983561" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:58.983707" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>headers=${HEADERS}</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:58.977816" elapsed="0.005928"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:58.987397" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:58.983980" elapsed="0.003506"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:58.987708" elapsed="0.003519"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-05-01T00:53:58.994573" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:53:58.991334" elapsed="0.003300"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.991306" elapsed="0.003354"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}</arg>
<arg>expected_status=204</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:58.994811" elapsed="0.000022"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-05-01T00:53:58.967059" elapsed="0.027874"/>
</kw>
<arg>pmsi_mldp_mp2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:58.840977" elapsed="0.154002"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:58.730391" elapsed="0.264696"/>
</test>
<test id="s1-s13-t75" name="Play_To_Odl_pmsi_mldp_mp2mp_lsp" line="249">
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:53:58.998849" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:53:58.998580" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:59.000103" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:58.999992" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:58.999974" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:59.005170" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:59.005064" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.005046" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.006257" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:59.005880" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.006759" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:53:59.006446" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:53:59.006829" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:53:59.006983" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:53:59.005501" elapsed="0.001507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:59.012976" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:59.012868" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.012848" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:53:59.014527" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:53:59.014312" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.014294" elapsed="0.000403"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:53:59.015265" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:53:59.014851" elapsed="0.000477"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:53:59.015970" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:59.015704" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:53:59.049993" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:53:59.018038" elapsed="0.032087"/>
</kw>
<msg time="2026-05-01T00:53:59.050260" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:53:59.050354" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:59.016343" elapsed="0.034085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:53:59.077896" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "m "l "d "p "_ "m "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:53:59.052381" elapsed="0.025666"/>
</kw>
<msg time="2026-05-01T00:53:59.078178" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:53:59.078272" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:59.050852" elapsed="0.027493"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.079033" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:59.078673" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.078651" elapsed="0.000557"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.079953" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "p "m "s "i "_ "m "l "d "p "_ "m "p "2 "m "p "_ "l "s "p "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.079360" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.080665" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:59.080289" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.080269" elapsed="0.000571"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:53:59.080879" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:53:59.084363" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:53:59.084564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:53:59.083855" elapsed="0.000773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.084854" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.085070" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:53:59.083103" elapsed="0.002185"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:53:59.081147" elapsed="0.004226"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:53:59.013867" elapsed="0.071702"/>
</kw>
<msg time="2026-05-01T00:53:59.085662" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:59.085706" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:59.013205" elapsed="0.072539"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:53:59.085929" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:53:59.085822" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.085803" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.086735" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.087158" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:53:59.087231" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:53:59.012347" elapsed="0.074992"/>
</kw>
<msg time="2026-05-01T00:53:59.087432" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:53:59.087492" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:59.007386" elapsed="0.080144"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.087858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:59.087606" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.087588" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:53:59.007240" elapsed="0.080718"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:53:59.007063" elapsed="0.080926"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:53:59.004704" elapsed="0.083340"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:53:58.999704" elapsed="0.088394"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:53:58.999260" elapsed="0.088882"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:53:58.996328" elapsed="0.091867"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:59.093560" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:59.093713" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:59.093809" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:59.088655" elapsed="0.005180"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:53:59.094003" elapsed="0.002863"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:59.101772" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:59.101918" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:53:59.102087" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:53:59.097036" elapsed="0.005089"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:59.106523" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:59.106007" elapsed="0.000557"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:53:59.107158" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:53:59.106785" elapsed="0.000411"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:53:59.107415" elapsed="0.000471"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:53:59.102446" elapsed="0.005526"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:59.088338" elapsed="0.019708"/>
</kw>
<arg>SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing</arg>
<arg>AND</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-05-01T00:53:58.995866" elapsed="0.112235"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:59.109109" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:59.109304" level="INFO">${data_xml} = &lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguish...</msg>
<var>${data_xml}</var>
<arg>${EVPN_DIR}/${totest}/${totest}.xml</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:59.108833" elapsed="0.000511"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.136868" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp.vanadium/pmsi_mldp_mp2mp_lsp.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:59.136491" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:53:59.137678" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp.vanadium/pmsi_mldp_mp2mp_lsp.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:53:59.137406" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp.vanadium/pmsi_mldp_mp2mp_lsp.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:53:59.137849" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:53:59.137064" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.138475" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:53:59.138041" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:59.138861" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/pmsi_mldp_mp2mp_lsp.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:59.138988" level="INFO">${template} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:59.138722" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.139415" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          },
          "pmsi-tunnel": {
            "leaf-information-required": false,
            "mpls-label": 20024,
            "mldp-mp2mp-lsp": {
              "opaque-type": 1,
              "opaque": "01:01:01:01:01:01:01"
            }
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.139173" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:53:59.139857" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:53:59.139554" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.140382" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:53:59.140088" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:59.139940" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-05-01T00:53:59.139535" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.141093" level="INFO">${final_text} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:53:59.140651" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:53:59.141171" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:53:59.141328" level="INFO">${data_json} = {
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "...</msg>
<var>${data_json}</var>
<arg>${EVPN_DIR}/${totest}</arg>
<arg>${totest}.json</arg>
<doc>Check if ${folder}.vanadium/${file_name} exists. If yes read and Log contents of file ${folder}.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default ${folder}/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:53:59.134103" elapsed="0.007251"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:59.141758" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/announce_pmsi_mldp_mp2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/announce_pmsi_mldp_mp2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:59.141883" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${announce_hex}</var>
<arg>${EVPN_DIR}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:59.141552" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:53:59.142256" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/withdraw_pmsi_mldp_mp2mp_lsp.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l2vpn_evpn/pmsi_mldp_mp2mp_lsp/withdraw_pmsi_mldp_mp2mp_lsp.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:53:59.142421" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<var>${withdraw_hex}</var>
<arg>${EVPN_DIR}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:53:59.142066" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.142872" level="INFO">&lt;?xml version="1.0" ?&gt;
&lt;evpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-evpn"&gt;
    &lt;route-key&gt;BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-distinguisher&gt;429496729:1&lt;/route-distinguisher&gt;
    &lt;es-route&gt;
        &lt;orig-route-ip&gt;43.43.43.43&lt;/orig-route-ip&gt;
        &lt;arbitrary&gt;
            &lt;arbitrary&gt;AAAAAAAAAAAA&lt;/arbitrary&gt;
        &lt;/arbitrary&gt;
    &lt;/es-route&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pmsi-tunnel&gt;
            &lt;leaf-information-required&gt;false&lt;/leaf-information-required&gt;
            &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;mldp-mp2mp-lsp&gt;
                &lt;opaque-type&gt;1&lt;/opaque-type&gt;
                &lt;opaque&gt;01:01:01:01:01:01:01&lt;/opaque&gt;
            &lt;/mldp-mp2mp-lsp&gt;
        &lt;/pmsi-tunnel&gt;
    &lt;/attributes&gt;
&lt;/evpn-route&gt;
</msg>
<arg>${data_xml}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.142627" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.143317" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          },
          "pmsi-tunnel": {
            "leaf-information-required": false,
            "mpls-label": 20024,
            "mldp-mp2mp-lsp": {
              "opaque-type": 1,
              "opaque": "01:01:01:01:01:01:01"
            }
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          }
        }
      }
    ]
  }
}</msg>
<arg>${data_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.143081" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.143819" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.143577" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:53:59.144255" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:53:59.144017" elapsed="0.000282"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:53:59.144448" elapsed="0.002635"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:53:59.147241" elapsed="0.002918"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:53:59.157184" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:53:59.157336" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:53:59.157502" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:53:59.151148" elapsed="0.006848">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Log Many" owner="BuiltIn">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.158258" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="NOT RUN" start="2026-05-01T00:53:59.158651" elapsed="0.000034"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-05-01T00:53:59.150826" elapsed="0.008000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</status>
</kw>
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:01.169073" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:01.169443" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '475'} 
 body={"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}} 
 </msg>
<msg time="2026-05-01T00:54:01.169763" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:01.160701" elapsed="0.009141"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:54:01.170857" level="INFO">{
  "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
      {
        "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==",
        "path-id": 0,
        "route-distinguisher": "429496729:1",
        "es-route": {
          "orig-route-ip": "43.43.43.43",
          "arbitrary": {
            "arbitrary": "AAAAAAAAAAAA"
          }
        },
        "attributes": {
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          },
          "pmsi-tunnel": {
            "leaf-information-required": false,
            "mpls-label": 20024,
            "mldp-mp2mp-lsp": {
              "opaque-type": 1,
              "opaque": "01:01:01:01:01:01:01"
            }
          },
          "ipv4-next-hop": {
            "global": "199.20.166.41"
          }
        }
      }
    ]
  }
}</msg>
<msg time="2026-05-01T00:54:01.174113" level="INFO">{"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}</msg>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:54:01.170357" elapsed="0.003919"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:01.178982" level="INFO">${expected_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:01.178374" elapsed="0.000639"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:01.179643" level="INFO">${actual_normalized} = {
 "odl-bgp-evpn:evpn-routes": {
  "evpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "local-pref": {
      "pref": 100
     },
     "origin"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:01.179173" elapsed="0.000498"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:54:01.179838" elapsed="0.000395"/>
</kw>
<arg>${exp_content}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:54:01.174633" elapsed="0.005676"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-05-01T00:54:01.159668" elapsed="0.020712"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Loc_Rib_Presence</arg>
<arg>${data_json}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:53:59.150332" elapsed="2.030114"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:54:01.180692" elapsed="0.002666"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:01.190854" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:01.191052" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:01.191189" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:01.184604" elapsed="0.006622"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:54:01.191507" elapsed="0.004127"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:01.201701" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:01.202488" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '623'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false},"odl-bgp-evpn:evpn-routes":{"evpn-route":[{"path-id":0,"route-key":"BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw==","es-route":{"orig-route-ip":"43.43.43.43","arbitrary":{"arbitrary":"AAAAAAAAAAAA"}},"attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"pmsi-tunnel":{"leaf-information-required":false,"mpls-label":20024,"mldp-mp2mp-lsp":{"opaque":"01:01:01:01:01:01:01","opaque-type":1}},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"429496729:1"}]}}]} 
 </msg>
<msg time="2026-05-01T00:54:01.202652" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:01.195870" elapsed="0.006821"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:01.207092" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:01.206639" elapsed="0.000507"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:01.208108" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:01.207375" elapsed="0.000773"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:54:01.208858" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "odl-bgp-evpn:evpn-routes": {
    "evpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       },
       "pmsi-tunnel": {
        "leaf-information-required": false,
        "mldp-mp2mp-lsp": {
         "opaque": "01:01:01:01:01:01:01",
         "opaque-type": 1
        },
        "mpls-label": 20024
       }
      },
      "es-route": {
       "arbitrary": {
        "arbitrary": "AAAAAAAAAAAA"
       },
       "orig-route-ip": "43.43.43.43"
      },
      "path-id": 0,
      "route-distinguisher": "429496729:1",
      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
     }
    ]
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:54:01.209334" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
+       "pmsi-tunnel": {
+        "leaf-information-required": false,
+        "mldp-mp2mp-lsp": {
+         "opaque": "01:01:01:01:01:01:01",
+         "opaque-type": 1
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:54:01.208372" elapsed="0.001121">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "opaque-type": 1
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:54:01.203023" elapsed="0.006755">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "opaque-type": 1
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:54:01.184213" elapsed="0.025811">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": false
    },
+   "odl-bgp-evpn:evpn-routes": {
+    "evpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       },
    [ Message content over the limit has been removed. ]
+         "opaque-type": 1
+        },
+        "mpls-label": 20024
+       }
+      },
+      "es-route": {
+       "arbitrary": {
+        "arbitrary": "AAAAAAAAAAAA"
+       },
+       "orig-route-ip": "43.43.43.43"
+      },
+      "path-id": 0,
+      "route-distinguisher": "429496729:1",
+      "route-key": "BBcAAhmZmZkAAQAAAAAAAAAAAAAgKysrKw=="
+     }
+    ]
+   },
    "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.218900" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.219236" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:03.219484" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.211541" elapsed="0.007984"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:54:03.219791" elapsed="0.003934"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.228916" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.229074" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:54:03.229224" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.223985" elapsed="0.005277"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:03.233924" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.233483" elapsed="0.000556"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:03.234711" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.234279" elapsed="0.000473"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:54:03.234990" elapsed="0.000531"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:54:03.229649" elapsed="0.005964"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.210722" elapsed="0.024971"/>
</kw>
<arg>4x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:54:01.183652" elapsed="2.052101"/>
</kw>
<kw name="Withdraw_Route_And_Verify" type="TEARDOWN">
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:54:03.236576" elapsed="0.002604"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.244247" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.244358" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:03.244492" level="INFO">${resp} = &lt;Response [409]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.240354" elapsed="0.004167"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-01T00:54:03.244688" elapsed="0.002570"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.252030" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.252186" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '149'} 
 body={"bgp-rib:tables":[{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:54:03.252335" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.247423" elapsed="0.004951"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:03.257111" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.256690" elapsed="0.000463"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:54:03.257807" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "odl-bgp-evpn:l2vpn-address-family",
   "attributes": {
    "uptodate": false
   },
   "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.257388" elapsed="0.000461"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:54:03.258082" elapsed="0.000503"/>
</kw>
<arg>${EMPTY_ROUTES}</arg>
<arg>${resp.content}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:54:03.252747" elapsed="0.005932"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.239845" elapsed="0.018914"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>Verify_Test_Preconditions</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:54:03.239394" elapsed="0.019422"/>
</kw>
<arg>${withdraw_hex}</arg>
<doc>Sends withdraw update message from exabgp and verifies route removal from odl's rib</doc>
<status status="PASS" start="2026-05-01T00:54:03.236029" elapsed="0.022870"/>
</kw>
<arg>pmsi_mldp_mp2mp_lsp</arg>
<status status="PASS" start="2026-05-01T00:53:59.108395" elapsed="4.150574"/>
</kw>
<status status="PASS" start="2026-05-01T00:53:58.995387" elapsed="4.263739"/>
</test>
<test id="s1-s13-t76" name="Kill_Talking_BGP_Speaker" line="252">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:03.263979" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:03.263709" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.265295" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.265170" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.265149" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.270433" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.270325" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.270307" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.271602" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.271128" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.272092" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.271796" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:03.272163" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:54:03.272326" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.270749" elapsed="0.001602"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.278159" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.278049" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.278030" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.279484" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.279350" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.279331" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:03.280012" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.279709" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.280420" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.280204" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.309526" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:03.280974" elapsed="0.028652"/>
</kw>
<msg time="2026-05-01T00:54:03.309790" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:03.309836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.280633" elapsed="0.029239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.336418" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:03.310384" elapsed="0.026155"/>
</kw>
<msg time="2026-05-01T00:54:03.336698" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:03.336743" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.310045" elapsed="0.026734"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.337081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.336856" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.336836" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.337630" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.337305" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.337986" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.337768" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.337749" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:03.338142" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.340760" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:54:03.340968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.339651" elapsed="0.001474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.341408" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.341776" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:03.338980" elapsed="0.002984"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:03.338426" elapsed="0.003605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:03.279013" elapsed="0.063117"/>
</kw>
<msg time="2026-05-01T00:54:03.342225" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.342271" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.278388" elapsed="0.063922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:03.342520" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:54:03.342390" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.342371" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.343029" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.343381" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.343473" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:03.277704" elapsed="0.065935"/>
</kw>
<msg time="2026-05-01T00:54:03.343737" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.343782" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.272751" elapsed="0.071069"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.344156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.343899" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.343881" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:03.272604" elapsed="0.071657"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:03.272407" elapsed="0.071885"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:03.269954" elapsed="0.074393"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:03.264875" elapsed="0.079528"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.264403" elapsed="0.080050"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:03.260413" elapsed="0.084111"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.345745" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.345404" elapsed="0.000378"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:03.345949" elapsed="0.002023"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:03.345135" elapsed="0.002901"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.367807" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:03.348567" elapsed="0.019301"/>
</kw>
<msg time="2026-05-01T00:54:03.368007" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.368052" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.348207" elapsed="0.019871"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.368874" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:54:03.381030" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:03.381182" level="INFO">${output_log} = 2026-05-01 00:51:12,834 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:12,834 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:03.368585" elapsed="0.012636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.381888" level="INFO">2026-05-01 00:51:12,834 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:51:12,835 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:51:12,836 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400010080010400190046400200b44700
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400190046020641040000fbf0
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400190046020641040000fbf0'
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400190046020641040000fbf0
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:12,856 INFO BGP-Thread-1 (job): ... idle for 0.012s
2026-05-01 00:51:12,856 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.013s
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:13,860 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.014s
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.015s
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.016s
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:17,866 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.017s
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:18,868 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.019s
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:18,947 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:51:18,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.096s
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:19,009 INFO BGP-Thread-1 (job): ... idle for 0.061s
2026-05-01 00:51:19,009 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.157s
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:20,011 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.158s
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:21,013 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.159s
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:21] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:22,015 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:22,015 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.161s
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:23,017 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.162s
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:23,458 INFO BGP-Thread-1 (job): ... idle for 0.440s
2026-05-01 00:51:23,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.602s
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:23,541 INFO BGP-Thread-1 (job): ... idle for 0.082s
2026-05-01 00:51:23,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.684s
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.685s
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.686s
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:26,569 INFO BGP-Thread-1 (job): ... idle for 1.023s
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.709s
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.710s
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:27,988 INFO BGP-Thread-1 (job): ... idle for 0.416s
2026-05-01 00:51:27,989 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.126s
2026-05-01 00:51:27,989 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:28,057 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:51:28,057 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.193s
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:28,058 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:29,059 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:29,059 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.195s
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:30,061 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:30,061 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.196s
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:30] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.197s
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:32,065 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:32,065 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.198s
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:32,536 INFO BGP-Thread-1 (job): ... idle for 0.470s
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.669s
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,538 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,538 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:32,625 INFO BGP-Thread-1 (job): ... idle for 0.087s
2026-05-01 00:51:32,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.756s
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.757s
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:34,629 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:34,629 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.758s
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:35,631 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:35,631 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.759s
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.760s
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.224s
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:37,099 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:37,099 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:37,183 INFO BGP-Thread-1 (job): ... idle for 0.084s
2026-05-01 00:51:37,184 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.308s
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.309s
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.310s
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:39,189 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:39,189 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:39] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.311s
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:40,191 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:40,191 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.312s
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,193 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:41,659 INFO BGP-Thread-1 (job): ... idle for 0.467s
2026-05-01 00:51:41,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.779s
2026-05-01 00:51:41,660 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:41,737 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.855s
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.856s
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:42,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:42,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.857s
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:43,743 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.859s
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.860s
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:45,747 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:45,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.323s
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:46,211 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:46,211 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:46,295 INFO BGP-Thread-1 (job): ... idle for 0.084s
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.407s
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:46,297 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.408s
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:47,299 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:47,299 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:48,300 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.409s
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:48] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:49,302 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:49,302 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.411s
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:50,304 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:50,304 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.412s
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): ... idle for 0.476s
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.888s
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:50,862 INFO BGP-Thread-1 (job): ... idle for 0.079s
2026-05-01 00:51:50,862 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.967s
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:51] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.968s
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:51,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:51,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.969s
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:53,868 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.971s
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:54,884 INFO BGP-Thread-1 (job): ... idle for 1.015s
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.986s
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:55,339 INFO BGP-Thread-1 (job): ... idle for 0.454s
2026-05-01 00:51:55,340 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.440s
2026-05-01 00:51:55,340 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:55,420 INFO BGP-Thread-1 (job): ... idle for 0.079s
2026-05-01 00:51:55,420 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.519s
2026-05-01 00:51:55,420 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:55,420 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:56,426 INFO BGP-Thread-1 (job): ... idle for 1.005s
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.524s
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.531s
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:57,435 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:57] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:58,441 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.537s
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.543s
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,449 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,449 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): ... idle for 0.447s
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.990s
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:59,987 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-05-01 00:51:59,987 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.080s
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:59,988 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:00,991 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:52:00,991 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.083s
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.084s
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:01,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:02] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.086s
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:02,998 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:02,998 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:04,000 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.089s
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): ... idle for 0.474s
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.563s
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:04,550 INFO BGP-Thread-1 (job): ... idle for 0.072s
2026-05-01 00:52:04,550 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.636s
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:04,551 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:04,551 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:05,552 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:05,552 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.637s
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.637s
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:06,554 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:06,554 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:06] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:07,555 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:07,555 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.638s
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:08,557 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.640s
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:09,035 INFO BGP-Thread-1 (job): ... idle for 0.477s
2026-05-01 00:52:09,036 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.117s
2026-05-01 00:52:09,036 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:09,111 INFO BGP-Thread-1 (job): ... idle for 0.074s
2026-05-01 00:52:09,111 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.191s
2026-05-01 00:52:09,111 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.194s
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:10,116 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:10,116 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:11,117 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:11,118 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.195s
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:11] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:12,121 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:12,121 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.198s
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:13,124 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.200s
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:13,635 INFO BGP-Thread-1 (job): ... idle for 0.510s
2026-05-01 00:52:13,635 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.710s
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,637 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:13,704 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:52:13,704 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.777s
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:13,705 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:14,706 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.778s
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.780s
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:15] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.781s
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:16,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:16,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:17,713 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:17,713 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.783s
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): ... idle for 0.516s
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.298s
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:18,231 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:18,307 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:52:18,308 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.375s
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:18,308 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:18,309 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:18,309 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.376s
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.377s
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:20,313 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:20,313 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.378s
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:22,316 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.380s
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): ... idle for 0.439s
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.818s
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:22,835 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:52:22,835 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.896s
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:23,837 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.897s
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.898s
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.900s
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.901s
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): ... idle for 0.442s
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.343s
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:27,288 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:27,288 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:27,369 INFO BGP-Thread-1 (job): ... idle for 0.081s
2026-05-01 00:52:27,369 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.424s
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.424s
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.425s
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:29] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:30,373 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:30,373 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.425s
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:31,375 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:31,375 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.427s
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:31,819 INFO BGP-Thread-1 (job): ... idle for 0.443s
2026-05-01 00:52:31,819 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.870s
2026-05-01 00:52:31,820 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:31,820 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,821 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,821 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:31,931 INFO BGP-Thread-1 (job): ... idle for 0.111s
2026-05-01 00:52:31,932 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.981s
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:31,932 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,933 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,933 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.982s
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:32,935 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.983s
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.984s
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.985s
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:36,421 INFO BGP-Thread-1 (job): ... idle for 0.481s
2026-05-01 00:52:36,422 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.466s
2026-05-01 00:52:36,422 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): ... idle for 0.081s
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.547s
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:36,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:36,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 84.548s
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:38,507 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 85.548s
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:38] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:39,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:39,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 86.549s
2026-05-01 00:52:39,511 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:40,512 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 87.550s
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): ... idle for 0.471s
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.021s
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:41,074 INFO BGP-Thread-1 (job): ... idle for 0.089s
2026-05-01 00:52:41,074 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.109s
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:41,075 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:41,075 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 89.110s
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.111s
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:44,079 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 91.112s
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:45,081 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.113s
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): ... idle for 0.480s
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.593s
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,562 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,562 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.670s
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,642 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 93.671s
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): ... idle for 1.033s
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 94.705s
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 95.706s
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:49,680 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.707s
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): ... idle for 0.417s
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.123s
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:50,174 INFO BGP-Thread-1 (job): ... idle for 0.074s
2026-05-01 00:52:50,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.198s
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 98.199s
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 99.200s
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:52,179 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.201s
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:54,181 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.202s
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): ... idle for 0.497s
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.699s
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:54,766 INFO BGP-Thread-1 (job): ... idle for 0.086s
2026-05-01 00:52:54,766 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.785s
2026-05-01 00:52:54,766 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:55,768 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:55,768 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 102.785s
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:56,770 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:56,770 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 103.787s
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:57] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 104.788s
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:58,774 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.789s
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:59,776 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:59,776 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.790s
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:59,779 INFO BGP-Thread-1 (job): ... idle for 0.002s
2026-05-01 00:52:59,779 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.792s
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:59,866 INFO BGP-Thread-1 (job): ... idle for 0.086s
2026-05-01 00:52:59,866 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.878s
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:59,867 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:00] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 107.879s
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:00,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 108.880s
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:02] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:02,902 INFO BGP-Thread-1 (job): ... idle for 1.032s
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 109.912s
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:03,904 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.913s
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): ... idle for 0.433s
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.346s
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:04,339 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:04,339 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:04,414 INFO BGP-Thread-1 (job): ... idle for 0.075s
2026-05-01 00:53:04,414 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.421s
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:04,415 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:04,415 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): ... idle for 1.038s
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 112.459s
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:05,454 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:06,455 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:06,455 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 113.460s
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:06] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:07,457 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.461s
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:08,459 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.462s
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): ... idle for 0.410s
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.872s
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:08,871 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:08,871 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:08,943 INFO BGP-Thread-1 (job): ... idle for 0.072s
2026-05-01 00:53:08,943 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.943s
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:08,944 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 116.944s
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 117.946s
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:10,948 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:10,948 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:11] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 118.947s
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.948s
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.411s
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:13,492 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.487s
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:14,495 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:14,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 121.489s
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:15,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 122.490s
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:15] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:16,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.491s
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:17,501 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.492s
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): ... idle for 0.453s
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.945s
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:17,957 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:18,032 INFO BGP-Thread-1 (job): ... idle for 0.075s
2026-05-01 00:53:18,032 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 125.020s
2026-05-01 00:53:18,032 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:18,032 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:19,034 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 126.021s
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:20,036 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:20,036 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.023s
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 128.024s
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.025s
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,041 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:22,491 INFO BGP-Thread-1 (job): ... idle for 0.451s
2026-05-01 00:53:22,492 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.475s
2026-05-01 00:53:22,492 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:22,571 INFO BGP-Thread-1 (job): ... idle for 0.078s
2026-05-01 00:53:22,572 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.554s
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:22,572 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,573 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,573 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 130.555s
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:24,575 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 131.556s
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:24] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.557s
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 133.558s
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:26,580 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:26,580 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): ... idle for 0.464s
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.022s
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,044 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,044 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:27,128 INFO BGP-Thread-1 (job): ... idle for 0.083s
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.105s
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 135.106s
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:28,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.107s
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:29] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:30,134 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 137.109s
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:31,136 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.110s
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.572s
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005e' (94)
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:31,652 INFO BGP-Thread-1 (job): ... idle for 0.051s
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.624s
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0058' (88)
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 139.625s
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:33,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 140.626s
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:33] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:34,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:34,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 141.627s
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:35,660 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:35,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 142.628s
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:36,123 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.090s
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0066' (102)
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:36,125 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:36,125 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.157s
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0060' (96)
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:36,193 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:36,193 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 144.158s
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:37,195 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 145.160s
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:38] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 146.161s
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:40,199 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.162s
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:40,645 INFO BGP-Thread-1 (job): ... idle for 0.445s
2026-05-01 00:53:40,645 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.607s
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:40,766 INFO BGP-Thread-1 (job): ... idle for 0.119s
2026-05-01 00:53:40,766 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.726s
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:41,768 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:41,768 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 148.727s
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 149.728s
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:42,771 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:42,771 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 150.729s
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:43,773 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:43,773 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 151.730s
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): ... idle for 0.434s
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.165s
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:45,267 INFO BGP-Thread-1 (job): ... idle for 0.057s
2026-05-01 00:53:45,267 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.222s
2026-05-01 00:53:45,267 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:46,269 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 153.223s
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:47,271 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.224s
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 155.225s
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.226s
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,276 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,276 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:49,712 INFO BGP-Thread-1 (job): ... idle for 0.437s
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.663s
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:49,787 INFO BGP-Thread-1 (job): ... idle for 0.073s
2026-05-01 00:53:49,787 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.736s
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:49,788 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:49,788 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:50,789 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:50,789 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 157.737s
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:51,791 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:51,791 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.738s
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 159.739s
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:52,794 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:52,794 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 160.741s
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:53,796 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:53,796 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:54,300 INFO BGP-Thread-1 (job): ... idle for 0.504s
2026-05-01 00:53:54,300 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.245s
2026-05-01 00:53:54,301 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:54,301 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:54,302 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:54,302 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:54,372 INFO BGP-Thread-1 (job): ... idle for 0.071s
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.316s
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:55,374 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:55,374 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 162.317s
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:56,376 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 163.318s
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:56] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:57,378 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 164.319s
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:58,380 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.320s
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:58,871 INFO BGP-Thread-1 (job): ... idle for 0.490s
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.811s
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005c' (92)
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:58,941 INFO BGP-Thread-1 (job): ... idle for 0.068s
2026-05-01 00:53:58,941 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.878s
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:58,942 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 166.880s
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 167.881s
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:54:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 168.882s
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:54:02,948 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.883s
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:54:03] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.381479" elapsed="0.003269"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:54:03.368280" elapsed="0.016556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:54:03.385111" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-05-01T00:54:03.384936" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.384906" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.385479" elapsed="0.000033"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.385723" elapsed="0.000029"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:54:03.344807" elapsed="0.041027"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.396980" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:54:03.433182" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:03.433414" level="INFO">${output_log} = 2026-05-01 00:51:12,834 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:12,834 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:03.396835" elapsed="0.036678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.434487" level="INFO">2026-05-01 00:51:12,834 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:51:12,834 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:51:12,835 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:51:12,836 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400010080010400190046400200b44700
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:51:12,839 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:51:12,840 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,840 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400190046020641040000fbf0
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400190046020641040000fbf0'
2026-05-01 00:51:12,841 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400190046020641040000fbf0
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:12,843 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:12,856 INFO BGP-Thread-1 (job): ... idle for 0.012s
2026-05-01 00:51:12,856 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:51:12,856 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:12,857 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:12,857 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.013s
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:13,859 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:13,860 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.014s
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:14,861 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.015s
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:15,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.016s
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:16,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:17,866 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.017s
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:17,867 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:18,868 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.019s
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:18,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:18,947 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:51:18,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.096s
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:18,947 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:18,948 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:19,009 INFO BGP-Thread-1 (job): ... idle for 0.061s
2026-05-01 00:51:19,009 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.157s
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:19,009 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:19,010 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:19,010 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:20,011 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.158s
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:20,012 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:21,013 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.159s
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:21,014 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:21] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:22,015 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:22,015 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.161s
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:22,016 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:23,017 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.162s
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,018 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:23,458 INFO BGP-Thread-1 (job): ... idle for 0.440s
2026-05-01 00:51:23,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.602s
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:23,459 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,459 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:23,541 INFO BGP-Thread-1 (job): ... idle for 0.082s
2026-05-01 00:51:23,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.684s
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:23,542 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:23,542 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.685s
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:24,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.686s
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:25,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:26,569 INFO BGP-Thread-1 (job): ... idle for 1.023s
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.709s
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:26,570 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.710s
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:27,572 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:27,988 INFO BGP-Thread-1 (job): ... idle for 0.416s
2026-05-01 00:51:27,989 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.126s
2026-05-01 00:51:27,989 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:27,989 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:27,990 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:28,057 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:51:28,057 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.193s
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:28,057 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:28,058 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:28,058 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:29,059 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:29,059 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.195s
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:29,060 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:30,061 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:30,061 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.196s
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:30,062 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:30] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.197s
2026-05-01 00:51:31,063 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:31,064 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:32,065 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:32,065 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.198s
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,066 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:32,536 INFO BGP-Thread-1 (job): ... idle for 0.470s
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.669s
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:32,537 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:32,537 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,538 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,538 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:32,625 INFO BGP-Thread-1 (job): ... idle for 0.087s
2026-05-01 00:51:32,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.756s
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:32,625 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:32,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.757s
2026-05-01 00:51:33,627 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:33,628 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:34,629 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:34,629 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.758s
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:34,630 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:35,631 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:35,631 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.759s
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:35,632 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.760s
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:36,634 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.224s
2026-05-01 00:51:37,098 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:37,098 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:37,099 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:37,099 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:37,099 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:37,183 INFO BGP-Thread-1 (job): ... idle for 0.084s
2026-05-01 00:51:37,184 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.308s
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:37,184 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:37,185 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.309s
2026-05-01 00:51:38,186 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:38,187 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.310s
2026-05-01 00:51:39,188 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:39,189 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:39,189 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:39] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.311s
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:40,190 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:40,191 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:40,191 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.312s
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,192 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,193 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:41,659 INFO BGP-Thread-1 (job): ... idle for 0.467s
2026-05-01 00:51:41,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.779s
2026-05-01 00:51:41,660 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:41,660 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:41,661 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:41,737 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.855s
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:41,738 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:41,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.856s
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:42,740 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:42,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:42,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.857s
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:43,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:43,743 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.859s
2026-05-01 00:51:44,744 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:44,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.860s
2026-05-01 00:51:45,746 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:45,747 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:45,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.323s
2026-05-01 00:51:46,210 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:46,210 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:46,211 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:46,211 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:46,211 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:46,295 INFO BGP-Thread-1 (job): ... idle for 0.084s
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.407s
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:46,296 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:46,296 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:46,297 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.408s
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:47,298 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:47,299 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:47,299 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:48,300 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.409s
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:48,301 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:48] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:49,302 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:49,302 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.411s
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:49,303 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:50,304 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:50,304 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.412s
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,305 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): ... idle for 0.476s
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.888s
2026-05-01 00:51:50,781 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:50,781 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:50,782 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,782 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:50,862 INFO BGP-Thread-1 (job): ... idle for 0.079s
2026-05-01 00:51:50,862 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.967s
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:50,862 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:50,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:51] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.968s
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:51,864 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:51,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:51,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.969s
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:52,866 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:53,868 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.971s
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:53,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:54,884 INFO BGP-Thread-1 (job): ... idle for 1.015s
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.986s
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:54,885 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:55,339 INFO BGP-Thread-1 (job): ... idle for 0.454s
2026-05-01 00:51:55,340 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.440s
2026-05-01 00:51:55,340 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:55,340 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:55,341 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:55,420 INFO BGP-Thread-1 (job): ... idle for 0.079s
2026-05-01 00:51:55,420 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.519s
2026-05-01 00:51:55,420 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:55,420 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:55,421 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:55,421 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:56,426 INFO BGP-Thread-1 (job): ... idle for 1.005s
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.524s
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:56,427 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.531s
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:57,434 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:57,435 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:57] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:58,441 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.537s
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:58,442 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.543s
2026-05-01 00:51:59,448 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,449 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,449 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): ... idle for 0.447s
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.990s
2026-05-01 00:51:59,896 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:59,896 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:59,897 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:51:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:51:59,987 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-05-01 00:51:59,987 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.080s
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:51:59,987 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:51:59,988 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:51:59,988 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:00] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:00,991 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:52:00,991 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.083s
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:00,992 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.084s
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:01,994 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:01,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:02] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.086s
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:02,997 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:02,998 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:02,998 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:04,000 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.089s
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,001 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): ... idle for 0.474s
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.563s
2026-05-01 00:52:04,476 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:04,476 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:04,477 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,477 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:04,550 INFO BGP-Thread-1 (job): ... idle for 0.072s
2026-05-01 00:52:04,550 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.636s
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:04,550 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:04,551 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:04,551 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:04,551 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:05,552 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:05,552 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.637s
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:05,553 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.637s
2026-05-01 00:52:06,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:06,554 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:06,554 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:06] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:07,555 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:07,555 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.638s
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:07,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:08,557 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.640s
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:08,558 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:09,035 INFO BGP-Thread-1 (job): ... idle for 0.477s
2026-05-01 00:52:09,036 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.117s
2026-05-01 00:52:09,036 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:09,036 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:09,037 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:09,111 INFO BGP-Thread-1 (job): ... idle for 0.074s
2026-05-01 00:52:09,111 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.191s
2026-05-01 00:52:09,111 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:09,112 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:09,112 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.194s
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:10,115 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:10,116 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:10,116 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:11,117 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:11,118 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.195s
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:11,119 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:11] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:12,121 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:12,121 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.198s
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:12,122 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:13,124 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.200s
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,125 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:13,635 INFO BGP-Thread-1 (job): ... idle for 0.510s
2026-05-01 00:52:13,635 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.710s
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:13,636 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,636 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,637 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:13,704 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:52:13,704 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.777s
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:13,704 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:13,705 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:13,705 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:14,706 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.778s
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:14,707 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.780s
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:15,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:15] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.781s
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:16,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:16,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:16,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:17,713 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:17,713 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.783s
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:17,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): ... idle for 0.516s
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.298s
2026-05-01 00:52:18,230 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:52:18,230 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:18,231 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:18,231 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:18,307 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:52:18,308 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.375s
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:18,308 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:18,308 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:18,309 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:18,309 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.376s
2026-05-01 00:52:19,310 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:19,311 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.377s
2026-05-01 00:52:20,312 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:20,313 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:20,313 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.378s
2026-05-01 00:52:21,314 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:21,315 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:22,316 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.380s
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,317 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): ... idle for 0.439s
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.818s
2026-05-01 00:52:22,756 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:22,757 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,757 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:22,835 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:52:22,835 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.896s
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:22,835 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:22,836 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:22,836 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:23,837 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.897s
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:23,838 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.898s
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:24,840 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.900s
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:25,842 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.901s
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:26,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): ... idle for 0.442s
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.343s
2026-05-01 00:52:27,287 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:27,287 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:27,288 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:27,288 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:27,288 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:27,369 INFO BGP-Thread-1 (job): ... idle for 0.081s
2026-05-01 00:52:27,369 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.424s
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:27,369 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:27,370 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.424s
2026-05-01 00:52:28,370 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:28,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.425s
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:29,372 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:29] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:30,373 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:30,373 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.425s
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:30,374 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:31,375 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:31,375 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.427s
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,376 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:31,819 INFO BGP-Thread-1 (job): ... idle for 0.443s
2026-05-01 00:52:31,819 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.870s
2026-05-01 00:52:31,820 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:31,820 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:31,820 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,821 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,821 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:31,931 INFO BGP-Thread-1 (job): ... idle for 0.111s
2026-05-01 00:52:31,932 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.981s
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:31,932 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:31,932 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:31,933 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:31,933 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:32] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.982s
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:32,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:32,935 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.983s
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:33,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.984s
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:34,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.985s
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:35,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:36,421 INFO BGP-Thread-1 (job): ... idle for 0.481s
2026-05-01 00:52:36,422 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.466s
2026-05-01 00:52:36,422 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:36,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:36,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): ... idle for 0.081s
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.547s
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:36,504 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:36,504 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:36,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:36,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 84.548s
2026-05-01 00:52:37,506 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:37,507 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:38,507 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 85.548s
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:38,508 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:38] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:39,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:39,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 86.549s
2026-05-01 00:52:39,511 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:39,512 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:40,512 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 87.550s
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:40,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): ... idle for 0.471s
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.021s
2026-05-01 00:52:40,984 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:40,985 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:40,985 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:41,074 INFO BGP-Thread-1 (job): ... idle for 0.089s
2026-05-01 00:52:41,074 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.109s
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:41,074 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:41,075 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:41,075 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:41,075 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:41] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 89.110s
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:42,076 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.111s
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:43,078 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:44,079 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 91.112s
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:44,080 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:45,081 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.113s
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): ... idle for 0.480s
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.593s
2026-05-01 00:52:45,562 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,562 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,562 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:45,563 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,563 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): ... idle for 0.077s
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.670s
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:45,641 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:45,641 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:45,642 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 93.671s
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:46,643 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): ... idle for 1.033s
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 94.705s
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:47,677 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 95.706s
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:48,679 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:49,680 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.707s
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:49,681 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): ... idle for 0.417s
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.123s
2026-05-01 00:52:50,098 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:50,099 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:50,099 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:50,174 INFO BGP-Thread-1 (job): ... idle for 0.074s
2026-05-01 00:52:50,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.198s
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:50,174 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:50,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 98.199s
2026-05-01 00:52:51,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:51,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 99.200s
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:52,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:52,179 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.201s
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:53,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:54,181 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.202s
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,182 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): ... idle for 0.497s
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.699s
2026-05-01 00:52:54,679 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:54,680 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,680 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:54,766 INFO BGP-Thread-1 (job): ... idle for 0.086s
2026-05-01 00:52:54,766 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.785s
2026-05-01 00:52:54,766 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:54,767 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:54,767 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:55,768 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:55,768 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 102.785s
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:55,769 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:56,770 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:56,770 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 103.787s
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:56,771 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:57] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 104.788s
2026-05-01 00:52:57,772 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:57,773 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:58,774 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.789s
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:58,775 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:59,776 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:52:59,776 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.790s
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:52:59,779 INFO BGP-Thread-1 (job): ... idle for 0.002s
2026-05-01 00:52:59,779 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.792s
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:59,779 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,780 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:52:59,866 INFO BGP-Thread-1 (job): ... idle for 0.086s
2026-05-01 00:52:59,866 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.878s
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:52:59,866 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:52:59,867 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:52:59,867 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:52:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:00] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 107.879s
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:00,868 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:00,869 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 108.880s
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:01,870 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:02] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:02,902 INFO BGP-Thread-1 (job): ... idle for 1.032s
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 109.912s
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:02,903 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:03,904 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.913s
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:03,905 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): ... idle for 0.433s
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.346s
2026-05-01 00:53:04,338 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:04,338 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:04,339 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:04,339 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:04,339 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:04,414 INFO BGP-Thread-1 (job): ... idle for 0.075s
2026-05-01 00:53:04,414 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.421s
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:04,414 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:04,415 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:04,415 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:04,415 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): ... idle for 1.038s
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 112.459s
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:05,453 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:05,454 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:06,455 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:06,455 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 113.460s
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:06,456 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:06] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:07,457 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.461s
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:07,458 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:08,459 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.462s
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,460 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): ... idle for 0.410s
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.872s
2026-05-01 00:53:08,870 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:08,870 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:08,871 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:08,871 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,871 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:08,943 INFO BGP-Thread-1 (job): ... idle for 0.072s
2026-05-01 00:53:08,943 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.943s
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:08,943 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:08,944 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:08,944 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:09] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 116.944s
2026-05-01 00:53:09,945 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:09,946 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 117.946s
2026-05-01 00:53:10,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:10,948 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:10,948 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:11] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 118.947s
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:11,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.948s
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:12,951 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.411s
2026-05-01 00:53:13,415 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:13,415 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:13,416 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:13,492 INFO BGP-Thread-1 (job): ... idle for 0.076s
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.487s
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:13,493 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:13,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:14,495 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:14,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 121.489s
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:14,496 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:15,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 122.490s
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:15,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:15] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:16,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.491s
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:16,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:17,501 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.492s
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:17,502 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): ... idle for 0.453s
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.945s
2026-05-01 00:53:17,956 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:17,956 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:17,957 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:17,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:18,032 INFO BGP-Thread-1 (job): ... idle for 0.075s
2026-05-01 00:53:18,032 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 125.020s
2026-05-01 00:53:18,032 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:18,032 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:18,033 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:18,033 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:18] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:19,034 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 126.021s
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:19,035 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:20,036 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:20,036 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.023s
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:20,037 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 128.024s
2026-05-01 00:53:21,038 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:21,039 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.025s
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,040 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,041 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:22,491 INFO BGP-Thread-1 (job): ... idle for 0.451s
2026-05-01 00:53:22,492 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.475s
2026-05-01 00:53:22,492 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:22,492 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:22,571 INFO BGP-Thread-1 (job): ... idle for 0.078s
2026-05-01 00:53:22,572 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.554s
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:22,572 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:22,572 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:22,573 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:22,573 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 130.555s
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:23,574 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:24,575 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 131.556s
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:24,576 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:24] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.557s
2026-05-01 00:53:25,577 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:25,578 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 133.558s
2026-05-01 00:53:26,579 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:26,580 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:26,580 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): ... idle for 0.464s
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.022s
2026-05-01 00:53:27,044 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,044 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,044 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:27,045 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:27,045 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:27,128 INFO BGP-Thread-1 (job): ... idle for 0.083s
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.105s
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:27,129 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:27,129 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:27] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 135.106s
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:28,131 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:28,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.107s
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:29,133 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:29] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:30,134 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 137.109s
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:30,135 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:31,136 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.110s
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,137 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.572s
2026-05-01 00:53:31,600 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:31,600 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005e' (94)
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:31,601 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,601 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:31,652 INFO BGP-Thread-1 (job): ... idle for 0.051s
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.624s
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0058' (88)
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:31,653 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:31,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 139.625s
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:32,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:33,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 140.626s
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:33,657 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:33] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:34,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:34,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 141.627s
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:34,659 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:35,660 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:35,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 142.628s
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:35,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:36,123 INFO BGP-Thread-1 (job): ... idle for 0.463s
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.090s
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0066' (102)
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:36,124 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:36,124 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:36,125 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:36,125 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): ... idle for 0.067s
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.157s
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0060' (96)
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:36,192 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:36,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:36,193 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:36,193 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:36] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 144.158s
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:37,194 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:37,195 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 145.160s
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:38,196 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:38] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 146.161s
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:39,198 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:40,199 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.162s
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,200 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:40,645 INFO BGP-Thread-1 (job): ... idle for 0.445s
2026-05-01 00:53:40,645 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.607s
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:40,646 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,646 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:40,766 INFO BGP-Thread-1 (job): ... idle for 0.119s
2026-05-01 00:53:40,766 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.726s
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:40,766 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:40,767 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:40,767 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:41,768 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:41,768 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 148.727s
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:41,769 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 149.728s
2026-05-01 00:53:42,770 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:42,771 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:42,771 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 150.729s
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:43,772 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:43,773 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:43,773 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 151.730s
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:44,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): ... idle for 0.434s
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.165s
2026-05-01 00:53:45,209 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:45,209 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:45,210 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:45,267 INFO BGP-Thread-1 (job): ... idle for 0.057s
2026-05-01 00:53:45,267 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.222s
2026-05-01 00:53:45,267 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:45,268 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:45,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:45] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:46,269 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 153.223s
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:46,270 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:47,271 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.224s
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:47,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 155.225s
2026-05-01 00:53:48,273 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:48,274 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.226s
2026-05-01 00:53:49,275 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,276 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,276 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:49,712 INFO BGP-Thread-1 (job): ... idle for 0.437s
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.663s
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:49,713 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:49,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:49,787 INFO BGP-Thread-1 (job): ... idle for 0.073s
2026-05-01 00:53:49,787 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.736s
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:49,787 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-05-01 00:53:49,788 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:49,788 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:49,788 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:50,789 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:50,789 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 157.737s
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:50,790 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:51,791 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:51,791 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.738s
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:51,792 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 159.739s
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:52,793 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:52,794 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:52,794 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 160.741s
2026-05-01 00:53:53,795 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:53,796 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:53,796 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:54,300 INFO BGP-Thread-1 (job): ... idle for 0.504s
2026-05-01 00:53:54,300 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.245s
2026-05-01 00:53:54,301 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:54,301 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:54,301 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:54,302 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:54,302 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:54,372 INFO BGP-Thread-1 (job): ... idle for 0.071s
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.316s
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:54,373 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:54,373 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:54] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:55,374 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:55,374 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 162.317s
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:55,375 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:56,376 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 163.318s
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:56,377 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:56] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:57,378 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 164.319s
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:57,379 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:53:58,380 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.320s
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,381 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:58,871 INFO BGP-Thread-1 (job): ... idle for 0.490s
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.811s
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005c' (92)
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:58,872 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:58,872 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:58,941 INFO BGP-Thread-1 (job): ... idle for 0.068s
2026-05-01 00:53:58,941 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.878s
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-05-01 00:53:58,941 DEBUG BGP-Thread-1 (job): Evpn True
2026-05-01 00:53:58,942 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:58,942 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:53:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:53:59] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 166.880s
2026-05-01 00:53:59,943 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:53:59,944 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 167.881s
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:00,945 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:54:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 168.882s
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:01,947 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:54:02,948 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.883s
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:54:02,949 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:54:03] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.433880" elapsed="0.004969"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:03.440398" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/evpn_play.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/evpn_play.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:54:03.439272" elapsed="0.001270"/>
</kw>
<arg>play.py.out</arg>
<arg>evpn_play.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.396494" elapsed="0.044111"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-05-01T00:54:03.259597" elapsed="0.181123"/>
</test>
<test id="s1-s13-t77" name="Delete_Bgp_Peer_Configuration" line="258">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:03.444156" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:03.443861" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.445553" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.445408" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.445388" elapsed="0.000240"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.450950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.450839" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.450821" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.452088" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.451660" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.452623" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.452281" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:03.452696" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:54:03.452860" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.451255" elapsed="0.001631"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.458520" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.458386" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.458367" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.460041" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.459895" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.459874" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:03.460670" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.460294" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.461137" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.460892" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.493181" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:03.461790" elapsed="0.031516"/>
</kw>
<msg time="2026-05-01T00:54:03.493521" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:03.493577" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.461362" elapsed="0.032253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.522792" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:03.494170" elapsed="0.028756"/>
</kw>
<msg time="2026-05-01T00:54:03.523100" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:03.523149" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.493805" elapsed="0.029382"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.523711" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.523283" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.523256" elapsed="0.000547"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.524312" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.523954" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.524704" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.524475" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.524438" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:03.524822" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.528763" elapsed="0.000171"/>
</kw>
<msg time="2026-05-01T00:54:03.529010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.526410" elapsed="0.002739"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.529432" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.529799" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:03.525765" elapsed="0.004225"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:03.525155" elapsed="0.004904"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:03.459549" elapsed="0.070612"/>
</kw>
<msg time="2026-05-01T00:54:03.530258" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.530304" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.458808" elapsed="0.071535"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:03.530791" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:54:03.530422" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.530403" elapsed="0.000485"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.531311" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.531695" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.531771" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:03.458050" elapsed="0.073833"/>
</kw>
<msg time="2026-05-01T00:54:03.531978" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.532022" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.453268" elapsed="0.078790"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.532419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.532134" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.532117" elapsed="0.000412"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:03.453121" elapsed="0.079432"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:03.452941" elapsed="0.079645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:03.450470" elapsed="0.082174"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:03.445108" elapsed="0.087596"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.444646" elapsed="0.088103"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:03.441630" elapsed="0.091173"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.533546" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.533034" elapsed="0.000541"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.577289" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.576900" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:03.578111" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:03.577850" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:03.578290" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:03.577508" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.578894" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.578502" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:03.579231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:03.579417" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:03.579089" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.579876" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.579626" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.580949" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.580689" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.581425" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.581157" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.582145" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.581844" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:03.583138" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.582704" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:03.583218" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:03.583379" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:03.582363" elapsed="0.001041"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.583587" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:54:03.581702" elapsed="0.002174"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.584481" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.584133" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:03.585238" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.585026" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:03.585315" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:03.585484" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:03.584703" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.585667" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:03.583993" elapsed="0.001937"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:03.581523" elapsed="0.004490"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:03.586060" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:54:03.586219" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:03.580314" elapsed="0.005931"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.579996" elapsed="0.006281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.586473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.586303" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.579974" elapsed="0.006578"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.587298" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.586703" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:03.587377" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.576227" elapsed="0.011295"/>
</kw>
<msg time="2026-05-01T00:54:03.587578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.563199" elapsed="0.024426"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.600325" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.612971" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.625633" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.625833" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.626013" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.626399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.626237" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:03.626222" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.626644" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.626817" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.627163" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:03.626193" elapsed="0.001031"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.626090" elapsed="0.001160"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.627446" elapsed="0.000043"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.627553" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:54:03.627681" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:03.558829" elapsed="0.068879"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.628851" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.628572" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.637489" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.637546" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.637662" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.631037" elapsed="0.006651"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.628967" elapsed="0.008763"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.637920" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.637758" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.628948" elapsed="0.009056"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.642056" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.639039" elapsed="0.003081"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.638815" elapsed="0.003357"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.638797" elapsed="0.003411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.646131" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.642634" elapsed="0.003563"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.642288" elapsed="0.003961"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.642265" elapsed="0.004021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.647152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.646581" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.647664" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.647293" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.648447" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.648018" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.647783" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.647266" elapsed="0.001325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.649412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.648888" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.649803" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.649559" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.650350" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.650052" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.649886" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.649540" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.650690" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:03.651544" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.651217" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.651730" elapsed="0.002415"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:03.638378" elapsed="0.015837"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:03.654269" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:54:03.656651" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:54:03.627979" elapsed="0.028700"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:03.656787" elapsed="0.000029"/>
</return>
<arg>${BGP_DIR}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:54:03.533808" elapsed="0.123113"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:54:03.441021" elapsed="0.216027"/>
</test>
<test id="s1-s13-t78" name="Deconfigure_App_Peer" line="264">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:03.660524" elapsed="0.000276"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:03.660231" elapsed="0.000627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.661954" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.661831" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.661809" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.667201" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.667089" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.667070" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.668328" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.667925" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.668880" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.668546" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:03.668954" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:54:03.669118" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.667532" elapsed="0.001611"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.675086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.674974" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.674955" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.676390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.676281" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.676263" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:03.677033" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.676656" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.677469" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.677228" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.706544" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:03.677998" elapsed="0.028704"/>
</kw>
<msg time="2026-05-01T00:54:03.706973" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:03.707023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.677660" elapsed="0.029401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.732784" level="INFO">". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:03.707705" elapsed="0.025183"/>
</kw>
<msg time="2026-05-01T00:54:03.733082" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:03.733129" level="INFO">${message_wait} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.707268" elapsed="0.025898"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.733531" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.733258" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.733231" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.734071" level="INFO"> ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.733764" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.734430" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.734210" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.734191" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:03.734568" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:03.737173" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:54:03.737387" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.736108" elapsed="0.001445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.737837" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.738181" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:03.735467" elapsed="0.002902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:03.734894" elapsed="0.003540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:03.675975" elapsed="0.062581"/>
</kw>
<msg time="2026-05-01T00:54:03.738651" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.738695" level="INFO">${message} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.675323" elapsed="0.063412"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:03.738923" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:54:03.738813" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.738794" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.739423" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.739812" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.739890" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:03.674626" elapsed="0.065377"/>
</kw>
<msg time="2026-05-01T00:54:03.740119" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.740165" level="INFO">${output} =  ". "t "x "t ". "0 "3 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "E "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.669560" elapsed="0.070645"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.740663" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.740349" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.740329" elapsed="0.000415"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:03.669388" elapsed="0.071380"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:03.669203" elapsed="0.071600"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:03.666716" elapsed="0.074148"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:03.661515" elapsed="0.079407"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.661022" elapsed="0.079947"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:03.658007" elapsed="0.083049"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.741721" level="INFO">&amp;{mapping} = { IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.741237" elapsed="0.000512"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.787327" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.786924" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:03.788187" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:03.787916" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:03.788366" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:03.787569" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.788976" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.788585" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:03.789367" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:03.789578" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:03.789171" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.790019" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.789770" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.791084" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.790824" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.791580" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.791291" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.792286" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.791987" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:03.793068" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.792845" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:03.793148" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:54:03.793364" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:03.792522" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.793578" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:03.791846" elapsed="0.002092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.794522" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:03.794200" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:03.795276" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.795063" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:03.795352" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:03.795522" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:03.794741" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.795701" elapsed="0.000397"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:03.794061" elapsed="0.002081"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:03.791663" elapsed="0.004515"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:03.796225" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:03.796385" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:03.790495" elapsed="0.005916"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.790149" elapsed="0.006295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.796645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.796489" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.790123" elapsed="0.006600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.797531" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.796873" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:03.797615" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.786261" elapsed="0.011479"/>
</kw>
<msg time="2026-05-01T00:54:03.797795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.772774" elapsed="0.025068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.810686" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.823295" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.835934" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.836137" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.836319" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.836809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.836657" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:03.836641" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.837034" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.837205" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.837419" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:03.836610" elapsed="0.000883"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.836499" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.837674" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.837751" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:54:03.837884" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:03.768085" elapsed="0.069827"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.839054" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.838793" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.848485" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0380a4phsiwa1ih5euj8jg7b522.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.848582" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:03.848721" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:03.841249" elapsed="0.007508"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.839168" elapsed="0.009657"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.849083" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.848864" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.839150" elapsed="0.010048"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.854414" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.850672" elapsed="0.003830"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.850331" elapsed="0.004227"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.850305" elapsed="0.004289"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.858315" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.854989" elapsed="0.003391"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.854671" elapsed="0.003758"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.854648" elapsed="0.003837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.859279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.858740" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.859773" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.859413" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.860624" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.860177" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.859937" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.859389" elapsed="0.001354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.861539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.860972" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.862011" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.861677" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.862719" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.862352" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:03.862125" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.861652" elapsed="0.001151"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.862963" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:03.863784" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:03.863492" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.863967" elapsed="0.002353"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:03.849764" elapsed="0.016620"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:03.866431" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:54:03.868750" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:54:03.838185" elapsed="0.030592"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:03.868832" elapsed="0.000028"/>
</return>
<arg>${BGP_DIR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:54:03.741977" elapsed="0.126981"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:54:03.657423" elapsed="0.211662"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:54:03.869966" elapsed="0.000446"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.870683" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:54:03.870606" elapsed="0.000157"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:54:03.869745" elapsed="0.001105"/>
</kw>
<doc>Functional test for bgp - evpn

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising and receiveing routes with evpn content.
It uses play.py and odl as bgp peers. Routes advertized from odl
are configured via application peer. Routes advertised from play.py are
stored in *.hex files. These files are used also as expected data which
is recevied from odl.</doc>
<status status="PASS" start="2026-05-01T00:51:10.422363" elapsed="173.448526"/>
</suite>
<suite id="s1-s14" name="040 Bgp Functional Route Ref" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.956734" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:03.952440" elapsed="0.004348"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:54:03.952210" elapsed="0.004651"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.961638" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:54:03.957999" elapsed="0.003666"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:03.961899" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.961756" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.961730" elapsed="0.000244"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.962500" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:03.962131" elapsed="0.000418"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.963018" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:54:03.962711" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:54:03.963643" elapsed="0.000304"/>
</kw>
<msg time="2026-05-01T00:54:03.964046" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:03.964093" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:03.963279" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.964678" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.964284" elapsed="0.000420"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.965698" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.965411" elapsed="0.000314"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.966161" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.965904" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.966655" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.966344" elapsed="0.000338"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.971471" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.972186" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.971852" elapsed="0.000361"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.972365" elapsed="0.000247"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.973400" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.973106" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:54:03.973490" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:54:03.973663" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:54:03.972813" elapsed="0.000875"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:03.974321" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18afc810&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:54:03.973842" elapsed="0.000634"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.974640" elapsed="0.000189"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:54:03.970871" elapsed="0.004018"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:03.970659" elapsed="0.004274"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:54:03.966739" elapsed="0.008227"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.975553" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:03.975130" elapsed="0.000466"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.976155" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:03.975757" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.976760" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:03.976358" elapsed="0.000444"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:54:03.964962" elapsed="0.011897"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:54:03.957624" elapsed="0.019291"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:03.977104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:03.976987" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.976966" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.980277" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:03.979897" elapsed="0.000463"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.980841" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:03.980542" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:03.980912" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:03.981068" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:03.979568" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:03.982133" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.981836" elapsed="0.000324"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.982935" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:03.983036" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:03.982759" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:03.986638" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:03.986045" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:03.986025" elapsed="0.000739"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.987398" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:03.987647" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:03.986962" elapsed="0.000738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.988647" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:03.987965" elapsed="0.000787"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.989973" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:03.989024" elapsed="0.001004"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:54:03.991764" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:54:03.991938" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:54:03.991391" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.992317" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:54:03.993938" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:54:04.558593" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:54:04 UTC 2026

  System load:  0.06               Processes:             120
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:51:11 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:54:03.993615" elapsed="0.565186"/>
</kw>
<msg time="2026-05-01T00:54:04.558910" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.993142" elapsed="0.565974"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:54:03.990505" elapsed="0.568802"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.560603" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:54:04.573661" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:54:04.574097" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:54:04.574368" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:04.559944" elapsed="0.014604"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.575344" elapsed="0.001359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.579636" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:04.578195" elapsed="0.001862"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.581037" elapsed="0.000099"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.580594" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.580546" elapsed="0.000808"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:04.581947" elapsed="0.000116"/>
</return>
<status status="PASS" start="2026-05-01T00:54:04.581538" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.581504" elapsed="0.000751"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.582343" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.587695" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.588820" elapsed="0.000334"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.589420" elapsed="0.000247"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:04.583106" elapsed="0.006635"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:54:03.985038" elapsed="0.604883"/>
</kw>
<msg time="2026-05-01T00:54:04.589981" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.984210" elapsed="0.605829"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:54:03.983737" elapsed="0.606387"/>
</kw>
<msg time="2026-05-01T00:54:04.590174" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.983217" elapsed="0.607007"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.593068" elapsed="0.000317"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.593580" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.593884" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:04.590632" elapsed="0.003400"/>
</kw>
<msg time="2026-05-01T00:54:04.594128" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:54:03.982378" elapsed="0.611782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.594639" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:04.594361" elapsed="0.000320"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:54:04.594724" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:54:03.981476" elapsed="0.613377"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:03.981280" elapsed="0.613611"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:03.981148" elapsed="0.613779"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:54:03.977394" elapsed="0.617591"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:54:04.595144" elapsed="0.000218"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.609601" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.609478" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.609442" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.609973" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:04.610078" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.609831" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.610559" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:04.610271" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.611010" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:04.610762" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:04.611830" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:54:04.611602" elapsed="0.000339">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:54:04.612094" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:04.612145" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.611218" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.612493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:04.612250" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.612229" elapsed="0.000371"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:04.613353" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.613083" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:54:04.613429" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:54:04.613603" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:54:04.612807" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.613785" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.614513" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:04.614616" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.614378" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.614794" elapsed="0.002534"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.617785" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:54:04.805675" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.617515" elapsed="0.188322"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.809367" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.809971" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.810294" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:04.807041" elapsed="0.003505"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:04.806287" elapsed="0.004307"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.609173" elapsed="0.201475"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:54:04.596291" elapsed="0.214407"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.595802" elapsed="0.214949"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:04.595657" elapsed="0.215136"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:54:04.595421" elapsed="0.215412"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:54:03.957162" elapsed="0.853731"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.813598" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.813476" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.813439" elapsed="0.000236"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.818475" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.818354" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.818336" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.819506" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:04.819104" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.819991" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:04.819694" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:04.820061" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:54:04.820224" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:04.818776" elapsed="0.001473"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.825892" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.825782" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.825764" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.827178" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:04.827050" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.827032" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:04.827750" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.827399" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.828163" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:04.827938" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.861034" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:04.828907" elapsed="0.032316"/>
</kw>
<msg time="2026-05-01T00:54:04.861397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:04.861446" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.828349" elapsed="0.033150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.933050" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "4 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "o "u "t "e "_ "r "e "f ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:04.862318" elapsed="0.071005"/>
</kw>
<msg time="2026-05-01T00:54:04.933598" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:04.933646" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.861740" elapsed="0.071944"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.934095" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:04.933787" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.933759" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.934968" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "4 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "o "u "t "e "_ "r "e "f ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:04.934429" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.935364" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:04.935127" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.935108" elapsed="0.000453"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:04.935601" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.937685" elapsed="0.000458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.938534" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:04.939176" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:04.936849" elapsed="0.002861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:04.935920" elapsed="0.003926"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:04.826760" elapsed="0.113190"/>
</kw>
<msg time="2026-05-01T00:54:04.940046" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:04.940092" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.826116" elapsed="0.114014"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:04.940317" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:54:04.940208" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.940189" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.940834" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.941216" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:04.941290" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:04.825489" elapsed="0.115913"/>
</kw>
<msg time="2026-05-01T00:54:04.941513" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:04.941558" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.820642" elapsed="0.120956"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:04.941928" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:04.941676" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:04.941659" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:04.820499" elapsed="0.121530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:04.820305" elapsed="0.121758"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:04.818065" elapsed="0.124058"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:54:04.811514" elapsed="0.130704"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:04.811052" elapsed="0.131212"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:54:03.951895" elapsed="0.990422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.942893" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:04.942536" elapsed="0.000383"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.943405" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:04.943085" elapsed="0.000362"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:54:04.945175" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:54:04.945254" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:54:04.944875" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.945437" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:54:04.947010" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:54:05.533635" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:54:05 UTC 2026

  System load:  0.02               Processes:             106
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:51:11 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:54:04.946685" elapsed="0.587108"/>
</kw>
<msg time="2026-05-01T00:54:05.533878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.946179" elapsed="0.587780"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:54:04.944413" elapsed="0.589659"/>
</kw>
<msg time="2026-05-01T00:54:05.534125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:04.944024" elapsed="0.590149"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:54:04.943664" elapsed="0.590587"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.540235" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:05.539897" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:05.541730" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:54:05.808336" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:05.808847" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 123ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:54:05.808988" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:05.809106" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:05.541544" elapsed="0.267630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.811911" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:05.811074" elapsed="0.000959"/>
</kw>
<msg time="2026-05-01T00:54:05.812273" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:05.812384" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:05.809885" elapsed="0.002560"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.813396" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:05.812775" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.815426" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 123ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:05.815066" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.816103" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:05.815742" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.816776" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:05.816376" elapsed="0.000462"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:05.814110" elapsed="0.002808"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:05.813585" elapsed="0.003384"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:05.813549" elapsed="0.003460"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:05.817238" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:05.817090" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:05.817066" elapsed="0.000274"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:05.817564" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-05-01T00:54:05.817414" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:05.817392" elapsed="0.000307"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:05.817906" elapsed="0.000030"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:05.540975" elapsed="0.277098"/>
</kw>
<msg time="2026-05-01T00:54:05.818152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.540423" elapsed="0.277798"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:05.539264" elapsed="0.279108"/>
</kw>
<msg time="2026-05-01T00:54:05.818447" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.535380" elapsed="0.283154"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:05.534997" elapsed="0.283682"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:05.825919" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:05.825589" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:05.827919" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:54:07.976021" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:07.976422" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attem...</msg>
<msg time="2026-05-01T00:54:07.976591" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:07.976714" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:05.827520" elapsed="2.149255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:07.980244" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:07.979568" elapsed="0.000841"/>
</kw>
<msg time="2026-05-01T00:54:07.980654" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:07.980770" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:07.977388" elapsed="0.003442"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:07.982857" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:07.981220" elapsed="0.001699"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:07.986680" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:07.986104" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:07.987920" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:07.987353" elapsed="0.000715"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:07.989143" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:07.988605" elapsed="0.000679"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:07.984661" elapsed="0.004976"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:07.983273" elapsed="0.006532"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:07.983234" elapsed="0.006621"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:07.990200" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:07.989948" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:07.989922" elapsed="0.000494"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:07.990769" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-05-01T00:54:07.990525" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:07.990497" elapsed="0.000523"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:07.991253" elapsed="0.000045"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:05.826849" elapsed="2.164722"/>
</kw>
<msg time="2026-05-01T00:54:07.991663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.826107" elapsed="2.165640"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:05.824972" elapsed="2.166895"/>
</kw>
<msg time="2026-05-01T00:54:07.991947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.821165" elapsed="2.170849"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:05.820616" elapsed="2.171945"/>
</kw>
<msg time="2026-05-01T00:54:07.992639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.820053" elapsed="2.172654"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:05.819542" elapsed="2.173282"/>
</kw>
<msg time="2026-05-01T00:54:07.992890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:05.818900" elapsed="2.174054"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:05.534591" elapsed="2.458479"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.003830" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:08.003320" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:08.006509" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:54:08.822367" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:08.822894" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setupt...</msg>
<msg time="2026-05-01T00:54:08.823157" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:08.823261" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:08.005989" elapsed="0.817329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.828210" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:08.826926" elapsed="0.001587"/>
</kw>
<msg time="2026-05-01T00:54:08.828852" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:08.828957" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:08.824025" elapsed="0.004986"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.831565" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:08.829542" elapsed="0.002089"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.833941" level="INFO">Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:08.833603" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.834658" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:08.834319" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.835369" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:08.835030" elapsed="0.000436"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:08.832694" elapsed="0.002851"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:08.831868" elapsed="0.003772"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:08.831838" elapsed="0.003833"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:08.835878" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:08.835732" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:08.835714" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:08.836192" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:54:08.836058" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:08.836040" elapsed="0.000296"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:08.836576" elapsed="0.000025"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:08.005044" elapsed="0.831677"/>
</kw>
<msg time="2026-05-01T00:54:08.836779" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:08.004111" elapsed="0.832722"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:08.002414" elapsed="0.834519"/>
</kw>
<msg time="2026-05-01T00:54:08.836990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:07.996505" elapsed="0.840532"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:07.995668" elapsed="0.841460"/>
</kw>
<msg time="2026-05-01T00:54:08.837179" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:07.995069" elapsed="0.842155"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:07.994524" elapsed="0.842788"/>
</kw>
<msg time="2026-05-01T00:54:08.837357" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:07.993952" elapsed="0.843448"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:07.993416" elapsed="0.844120"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:08.844880" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:08.844543" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:08.846681" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-05-01T00:54:10.368838" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:10.369442" level="INFO">${stdout} = Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to b...</msg>
<msg time="2026-05-01T00:54:10.369614" level="INFO">${stderr} =   error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        ...</msg>
<msg time="2026-05-01T00:54:10.369724" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:08.846311" elapsed="1.523467"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.374770" level="INFO">Length is 1821.</msg>
<msg time="2026-05-01T00:54:10.375806" level="FAIL">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:54:10.373500" elapsed="0.002804">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-05-01T00:54:10.376722" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:54:10.376834" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:10.370557" elapsed="0.006338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.379103" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:10.377393" elapsed="0.001738"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.381325" level="INFO">Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:10.380998" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.382130" level="INFO">  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-dkb_d7od/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:10.381781" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.382952" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:10.382626" elapsed="0.000395"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:10.380086" elapsed="0.003008"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:10.379279" elapsed="0.003909"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:10.379251" elapsed="0.003966"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:10.383422" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:10.383276" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:10.383259" elapsed="0.000305"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:10.383751" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:54:10.383619" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:10.383603" elapsed="0.000289"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:10.384042" elapsed="0.000022"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:08.845699" elapsed="1.538484"/>
</kw>
<msg time="2026-05-01T00:54:10.384239" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:08.845070" elapsed="1.539218"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:08.843862" elapsed="1.540521"/>
</kw>
<msg time="2026-05-01T00:54:10.384438" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:08.840009" elapsed="1.544491"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:08.839436" elapsed="1.545155"/>
</kw>
<msg time="2026-05-01T00:54:10.384641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:08.839019" elapsed="1.545667"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:08.838643" elapsed="1.546130"/>
</kw>
<msg time="2026-05-01T00:54:10.384817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:08.838247" elapsed="1.546613"/>
</kw>
<arg>exabgp==3.4.16</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:08.837747" elapsed="1.547195"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:10.385396" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19f5e510&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:54:10.385108" elapsed="0.000742"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.418389" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:54:10.425964" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/exa.cfg' -&gt; '/home/jenkins//exa.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${BGP_CFG_NAME}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:54:10.386338" elapsed="0.039807"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.434002" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/exabgp_files/exarpc.py' -&gt; '/home/jenkins//exarpc.py'</msg>
<arg>${EXARPCSCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:54:10.426552" elapsed="0.007571"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.443567" level="INFO">6 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
bgp-l3vpn-ipv4.cfg
exa-md5.cfg
exa.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:54:10.443723" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | bgp-l3vpn-ipv4.cfg | exa-md5.cfg | exa.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:54:10.434350" elapsed="0.009408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.444522" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:10.456972" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.444268" elapsed="0.012837"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.457896" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:10.505142" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.457510" elapsed="0.047760"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.505987" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:10.553310" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.505677" elapsed="0.047810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.554237" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:10.602010" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.553894" elapsed="0.048255"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.602951" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:10.653241" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:10.653497" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.602632" elapsed="0.050927"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.654680" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:10.653999" elapsed="0.000794"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:54:10.444071" elapsed="0.210801"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.655862" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:10.701846" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.655490" elapsed="0.046525"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.702961" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:10.753491" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.702440" elapsed="0.051189"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.754364" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:10.809014" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.754005" elapsed="0.055096"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.809580" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:10.856805" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.809344" elapsed="0.047543"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.857323" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:10.904862" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:10.905079" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.857127" elapsed="0.048108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:10.906147" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:10.905669" elapsed="0.000552"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:54:10.655145" elapsed="0.251125"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.906942" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:10.952786" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.906682" elapsed="0.046225"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:10.953598" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:11.000805" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:10.953229" elapsed="0.047699"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.001565" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:11.053215" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.001250" elapsed="0.052106"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.054111" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:11.109185" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.053782" elapsed="0.055545"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.110092" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:11.156926" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:11.157157" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.109760" elapsed="0.047459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.158262" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.254;
      rd 1.2.3.4:1;
      label 24005;
    }
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:11.157675" elapsed="0.000694"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:54:10.906479" elapsed="0.251967"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.159488" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:11.205067" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.159054" elapsed="0.046154"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.206027" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:11.256753" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.205641" elapsed="0.051250"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.257646" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:11.304835" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.257264" elapsed="0.047708"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.305750" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:11.352615" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.305338" elapsed="0.047453"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.353539" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:11.404750" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:11.404966" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.353170" elapsed="0.051853"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.406071" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:11.405421" elapsed="0.000755"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:54:11.158738" elapsed="0.247513"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.407214" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:11.475697" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.406854" elapsed="0.069089"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.476759" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:11.524427" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.476324" elapsed="0.048293"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.525326" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:11.572789" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.525002" elapsed="0.047930"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.573736" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:11.621194" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.573308" elapsed="0.048030"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.622088" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-05-01T00:54:11.673168" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:11.673396" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh enable;
    add-path disable;
  }

  family {
    ipv4 un...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.621764" elapsed="0.051735"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.674528" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh enable;
    add-path disable;
  }

  family {
    ipv4 unicast;
    ipv4 mpls-vpn;
  }

  process exarpcserver {
    run exarpc.py --host 10.30.170.157;
    encoder json;
    receive-routes;
    neighbor-changes;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:11.673916" elapsed="0.000724"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-05-01T00:54:11.406536" elapsed="0.268179"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.675694" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:11.720859" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.675293" elapsed="0.045709"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.721819" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:11.769085" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.721384" elapsed="0.047841"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.769966" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:11.817790" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.769644" elapsed="0.048291"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.818689" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:11.869184" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.818318" elapsed="0.051013"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.870086" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:11.921122" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:11.921386" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:11.869760" elapsed="0.051730"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.922659" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:11.921967" elapsed="0.000811"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:54:11.674977" elapsed="0.247890"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:54:10.443841" elapsed="1.479106"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:54:10.386115" elapsed="1.536978"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:03.951577" elapsed="7.971641"/>
</kw>
<test id="s1-s14-t1" name="Configure_App_Peer" line="51">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:11.931509" elapsed="0.000481"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:11.930893" elapsed="0.001220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:11.933662" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:11.933521" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:11.933497" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:11.938906" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:11.938740" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:11.938722" elapsed="0.000257"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.940008" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:11.939608" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:11.940536" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:11.940196" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:11.940609" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:54:11.940782" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:11.939214" elapsed="0.001593"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:11.946204" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:11.946095" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:11.946076" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:11.947533" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:11.947397" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:11.947378" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:11.948084" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:11.947752" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.948543" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:11.948281" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:11.978490" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:11.949069" elapsed="0.029527"/>
</kw>
<msg time="2026-05-01T00:54:11.978761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:11.978811" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:11.948734" elapsed="0.030115"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.005692" level="INFO">". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:11.979362" elapsed="0.026436"/>
</kw>
<msg time="2026-05-01T00:54:12.006006" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:12.006053" level="INFO">${message_wait} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "C "o "n "f "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:11.979022" elapsed="0.027068"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.006394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.006170" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.006150" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.006948" level="INFO"> ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.006647" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.007297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.007084" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.007067" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:12.007408" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:12.010092" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:54:12.010322" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.008954" elapsed="0.001539"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.010831" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.011206" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:12.008232" elapsed="0.003170"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:12.007697" elapsed="0.003801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:11.947049" elapsed="0.064553"/>
</kw>
<msg time="2026-05-01T00:54:12.011694" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:12.011738" level="INFO">${message} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "C "o "n "f "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:11.946423" elapsed="0.065353"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:12.013803" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.011853" elapsed="0.002025"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.011834" elapsed="0.002070"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.014315" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.014671" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.014745" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:11.945757" elapsed="0.069098"/>
</kw>
<msg time="2026-05-01T00:54:12.014947" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:12.014990" level="INFO">${output} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "C "o "n "f "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:11.941180" elapsed="0.073848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.015355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.015103" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.015086" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:11.941038" elapsed="0.074434"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:11.940862" elapsed="0.074642"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:11.938364" elapsed="0.077195"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:11.933197" elapsed="0.082416"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:11.932535" elapsed="0.083122"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:11.925667" elapsed="0.090041"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.016599" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>APP_PEER_ID=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.015884" elapsed="0.000744"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.050233" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.049856" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.051045" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.050786" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.051265" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.050431" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.051866" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.051475" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.052198" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.052361" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.052059" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.052852" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.052564" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.053869" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.053600" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.054342" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.054081" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.055046" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.054750" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.056013" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.055784" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.056091" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.056245" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.055439" elapsed="0.000831"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.056424" elapsed="0.000300"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:54:12.054614" elapsed="0.002153"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.057334" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.057023" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.058112" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.057901" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.058188" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.058340" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.057584" elapsed="0.000781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.058532" elapsed="0.000231"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:54:12.056888" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.059346" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.059049" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.060111" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.059901" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.060186" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.060338" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.059577" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.060530" elapsed="0.000259"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:12.058917" elapsed="0.001913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.061415" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.061116" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.062172" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.061963" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.062248" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.062399" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.061647" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.062593" elapsed="0.000222"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:12.060980" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.063400" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.063102" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.064154" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.063946" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.064230" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.064381" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.063631" elapsed="0.000775"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.064573" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:12.062970" elapsed="0.001883"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.065483" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.065135" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.066243" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.066033" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.066320" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.066489" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.065706" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.066667" elapsed="0.000415"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:12.064968" elapsed="0.002155"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.054418" elapsed="0.012741"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.067203" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:12.067365" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:12.053264" elapsed="0.014128"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.052968" elapsed="0.014457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.067619" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.067466" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.052949" elapsed="0.014748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.068523" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.067840" elapsed="0.000712"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.068602" elapsed="0.000060"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.049183" elapsed="0.019581"/>
</kw>
<msg time="2026-05-01T00:54:12.068818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.036545" elapsed="0.032321"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.081326" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.093647" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.105938" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.106131" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.106305" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.106686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.106543" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.106528" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.106906" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.107071" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.107234" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.106498" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.106380" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.107471" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.107549" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.107672" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.032289" elapsed="0.075410"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.134065" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.133693" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.134806" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.134596" elapsed="0.000273">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.134960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.134253" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.135579" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.135181" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.135899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.136025" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.135766" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.136466" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.136211" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:54:12.136902" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.136584" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.137428" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.137133" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.136987" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.136565" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.138302" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.137676" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.138382" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.133063" elapsed="0.005464"/>
</kw>
<msg time="2026-05-01T00:54:12.138580" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.120343" elapsed="0.018284"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.151230" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.163608" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.175883" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.176077" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.176287" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.176670" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.176526" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.176511" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.176903" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.177072" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.177235" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.176480" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.176362" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.177480" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.177558" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.177678" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.117731" elapsed="0.059976"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.178949" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.178717" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.179102" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.178361" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.179440" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.179197" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.179999" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.179707" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.179537" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.179179" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.182578" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.180231" elapsed="0.002382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:54:12.182679" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:12.182843" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:54:12.178040" elapsed="0.004831"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.184295" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.184008" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.184816" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.184518" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.185289" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.185038" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.185758" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.185498" elapsed="0.000344"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:12.186713" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:54:12.186513" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:54:12.187091" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:54:12.186916" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.187265" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.187880" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.187634" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:54:12.187971" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:54:12.188159" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:54:12.186076" elapsed="0.002110"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:12.203328" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:54:12.203410" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:54:12 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:12.203592" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:12.190558" elapsed="0.013072"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.188258" elapsed="0.015437"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.203950" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.203732" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.188240" elapsed="0.015836"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.211033" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.205486" elapsed="0.005651"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.205156" elapsed="0.006065"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.205130" elapsed="0.006153"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.215553" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.211976" elapsed="0.003625"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.211415" elapsed="0.004221"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.211376" elapsed="0.004285"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.216223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.215836" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.216577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.216322" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.217144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.216822" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.216659" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.216303" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.217768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.217389" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.218103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.217869" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.218713" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.218398" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.218233" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.217849" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.218952" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:12.219775" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.219483" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.219956" elapsed="0.002302"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:12.204606" elapsed="0.017716"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:12.222514" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.222389" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.222370" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.222761" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.222829" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.225090" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:54:12.183208" elapsed="0.041910"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.225183" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:12.225342" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:54:12.021350" elapsed="0.204017"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.225725" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.225482" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.225464" elapsed="0.000352"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.225850" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:54:12.016906" elapsed="0.209071"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-05-01T00:54:11.923351" elapsed="0.302749"/>
</test>
<test id="s1-s14-t2" name="Reconfigure_ODL_To_Accept_Connection" line="65">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:12.229487" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:12.229185" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.230756" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:12.230646" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.230628" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.236116" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:12.236007" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.235988" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.237237" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.236816" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.237729" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:12.237422" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:12.237798" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.237952" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.236421" elapsed="0.001602"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.243427" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:12.243320" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.243302" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.244703" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:12.244596" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.244578" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:12.245247" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.244943" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.245668" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:12.245431" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.276552" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:12.246185" elapsed="0.030472"/>
</kw>
<msg time="2026-05-01T00:54:12.276821" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:12.276868" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.245854" elapsed="0.031050"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.310827" level="INFO">". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:12.277447" elapsed="0.033506"/>
</kw>
<msg time="2026-05-01T00:54:12.311145" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:12.311194" level="INFO">${message_wait} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "R "e "c "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.277106" elapsed="0.034127"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.311606" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.311330" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.311299" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.312225" level="INFO"> ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.311841" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.312728" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.312423" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.312399" elapsed="0.000433"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:12.312882" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:12.316151" elapsed="0.000155"/>
</kw>
<msg time="2026-05-01T00:54:12.316378" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.314904" elapsed="0.001668"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.316924" elapsed="0.000116"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.317329" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:12.314062" elapsed="0.003505"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:12.313323" elapsed="0.004314"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:12.244265" elapsed="0.073472"/>
</kw>
<msg time="2026-05-01T00:54:12.317882" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:12.317928" level="INFO">${message} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "R "e "c "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.243665" elapsed="0.074300"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:12.318166" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.318046" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.318025" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.318725" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.319086" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.319176" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:12.242984" elapsed="0.076312"/>
</kw>
<msg time="2026-05-01T00:54:12.319396" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:12.319471" level="INFO">${output} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "R "e "c "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.238407" elapsed="0.081106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.319871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.319594" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.319574" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:12.238262" elapsed="0.081712"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:12.238083" elapsed="0.081925"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:12.235600" elapsed="0.084467"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:12.230338" elapsed="0.089786"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.229910" elapsed="0.090260"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:12.226889" elapsed="0.093334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.321299" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | BGP_RIB_OPENCONFIG=example-bgp-ri...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.320399" elapsed="0.000937"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.360915" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.360429" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.361821" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.361543" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.362000" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.361170" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.362680" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.362206" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.363058" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.363319" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.362896" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.363923" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.363587" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.365391" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.365011" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.366055" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.365699" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.367104" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.366641" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.368167" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.367866" elapsed="0.000336"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.368278" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:54:12.368544" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.367405" elapsed="0.001178"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.368806" elapsed="0.000395"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:54:12.366419" elapsed="0.002843"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.370101" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.369658" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.371220" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.370909" elapsed="0.000351"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.371332" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:54:12.371581" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.370415" elapsed="0.001206"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.371849" elapsed="0.000328"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:54:12.369434" elapsed="0.002802"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.373073" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.372617" elapsed="0.000486"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.374151" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.373923" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.374230" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:54:12.374386" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.373540" elapsed="0.000870"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.374584" elapsed="0.000231"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:54:12.372399" elapsed="0.002470"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.375544" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.375155" elapsed="0.000421"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.376426" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.376208" elapsed="0.000272"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.376553" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:54:12.376758" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.375811" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.377078" elapsed="0.000259"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:54:12.375005" elapsed="0.002375"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.377960" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.377649" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.378740" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.378529" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.378817" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.378970" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.378190" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.379147" elapsed="0.000237"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:54:12.377513" elapsed="0.001912"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.380003" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.379702" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.380764" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.380552" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.380839" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:54:12.380991" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.380216" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.381227" elapsed="0.000287"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:54:12.379567" elapsed="0.002001"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.382143" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.381827" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.383010" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.382793" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.383089" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:54:12.383243" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.382410" elapsed="0.000859"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.383435" elapsed="0.000245"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:12.381691" elapsed="0.002030"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.384271" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.383970" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.385281" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.384845" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.385361" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:12.385539" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.384500" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.385717" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:12.383836" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.386556" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.386239" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.387294" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.387084" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.387370" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.387539" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.386769" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.387757" elapsed="0.000229"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:54:12.386095" elapsed="0.001932"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.366163" elapsed="0.021900"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.388108" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:12.388270" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:12.364579" elapsed="0.023718"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.364100" elapsed="0.024229"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.388526" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.388357" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.364063" elapsed="0.024542"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.389667" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.388754" elapsed="0.000943"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.389748" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.359639" elapsed="0.030238"/>
</kw>
<msg time="2026-05-01T00:54:12.389933" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.343376" elapsed="0.046607"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.403872" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.417810" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.430357" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.430585" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.430796" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.431230" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.431051" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.431035" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.431480" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.431649" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.431874" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.430997" elapsed="0.000934"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.430882" elapsed="0.001077"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.432109" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.432189" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:54:12.432329" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.337601" elapsed="0.094756"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.459988" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.459599" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.460813" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.460533" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.460987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.460181" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.461643" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.461213" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.461978" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.462157" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.461836" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.462618" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.462347" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:54:12.463046" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.462747" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.463591" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.463275" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.463129" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.462728" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.464655" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.463821" elapsed="0.000898"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.464772" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.458958" elapsed="0.005947"/>
</kw>
<msg time="2026-05-01T00:54:12.464965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.445911" elapsed="0.019101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.477552" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.490007" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.502386" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.502597" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.502772" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.503138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.502994" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.502980" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.503359" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.503542" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.503711" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.502951" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.502848" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.503936" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.504012" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.504146" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.442923" elapsed="0.061252"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.505534" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.505282" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.505692" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.504920" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.506034" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.505788" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.506601" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.506295" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.506114" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.505770" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.509130" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.506837" elapsed="0.002319"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:54:12.509209" elapsed="0.000089"/>
</return>
<msg time="2026-05-01T00:54:12.509467" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:54:12.504585" elapsed="0.004911"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.510885" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.510639" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.511319" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.511084" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.511790" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.511545" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.512223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.511986" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:12.513083" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:54:12.512888" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:54:12.513483" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:54:12.513293" elapsed="0.000217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.513660" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.514266" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.514023" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:54:12.514351" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.514530" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:54:12.512486" elapsed="0.002069"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:12.525871" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '1090', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:54:12.525980" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:12.526075" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:12.516696" elapsed="0.009405"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.514627" elapsed="0.011519"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.526326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.526172" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.514610" elapsed="0.011803"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.531163" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.527366" elapsed="0.003841"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.527148" elapsed="0.004094"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.527130" elapsed="0.004138"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.533851" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.531560" elapsed="0.002337"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.531324" elapsed="0.002607"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.531308" elapsed="0.002648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.534521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.534124" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.534859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.534620" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.535409" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.535112" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.534941" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.534602" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.536035" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.535670" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.536362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.536131" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.536918" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.536622" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.536443" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.536113" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.537150" elapsed="0.000398"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:12.537997" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.537714" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.538176" elapsed="0.002296"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:12.526797" elapsed="0.013738"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:12.540711" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.540601" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.540584" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.540946" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.541013" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.543274" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:54:12.509837" elapsed="0.033464"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.543406" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.543583" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:54:12.326357" elapsed="0.217251"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.543941" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.543706" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.543689" elapsed="0.000344"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.544066" elapsed="0.000026"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:54:12.321652" elapsed="0.222535"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:54:12.226339" elapsed="0.317967"/>
</test>
<test id="s1-s14-t3" name="Exa_To_Send_Route_Refresh" line="82">
<kw name="Configure_Routes_And_Start_ExaBgp" type="SETUP">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.545728" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.545414" elapsed="0.000341"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.546619" level="INFO">&amp;{mapping} = { PREFIX=1.1.1.1/32 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>PREFIX=${prefix}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.546167" elapsed="0.000479"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.580296" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.579925" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.581085" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.580839" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.581244" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.580502" elapsed="0.000766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.581849" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.581466" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.582170" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.582325" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.582035" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.582766" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.582521" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.583759" level="INFO">mapping: {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.583505" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.584218" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.583959" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.585150" level="INFO">${value} = 1.1.1.1/32</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.584608" elapsed="0.000568"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.586343" level="INFO">${encoded} = 1.1.1.1/32</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.585876" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.586556" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:54:12.586782" level="INFO">${encoded_value} = 1.1.1.1/32</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.585389" elapsed="0.001418"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.586966" elapsed="0.000504"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">1.1.1.1/32</var>
<status status="PASS" start="2026-05-01T00:54:12.584474" elapsed="0.003039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.588266" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.587761" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.589418" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.588939" elapsed="0.000548"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.589609" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:12.589830" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.588496" elapsed="0.001359"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.590012" elapsed="0.000512"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:12.587627" elapsed="0.002940"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.584291" elapsed="0.006311"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.590644" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:12.590801" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:12.583170" elapsed="0.007656"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.582878" elapsed="0.007980"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.591032" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.590883" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.582859" elapsed="0.008250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.591996" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.591250" elapsed="0.000775"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.592075" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.579287" elapsed="0.012913"/>
</kw>
<msg time="2026-05-01T00:54:12.592254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.566691" elapsed="0.025612"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.604809" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.617164" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.629558" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.629786" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.629963" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.630329" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.630186" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.630171" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.630562" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.630731" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.630899" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.630142" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.630038" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.631124" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.631200" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:12.631319" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.562482" elapsed="0.068863"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.656172" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.655780" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.656933" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.656712" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.657091" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.656362" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.657713" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.657279" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.658036" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.658166" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;$PREFIX&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;$PREFIX&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;glob...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.657902" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.658620" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;$PREFIX&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;$PREFIX&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.658351" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:54:12.659032" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.658743" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.659625" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.659316" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.659167" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.658724" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.660481" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.659854" elapsed="0.000658"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.660562" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.655009" elapsed="0.005688"/>
</kw>
<msg time="2026-05-01T00:54:12.660752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.642213" elapsed="0.018586"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.673296" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.685666" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.697970" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.698165" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.698341" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.698720" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.698576" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.698562" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.698940" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.699108" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.699272" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.698532" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.698415" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.699509" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.699621" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:54:12.699747" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.641311" elapsed="0.058465"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.701055" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.700804" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.701211" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.700440" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.701583" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.701306" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.702123" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.701833" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.701666" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.701288" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.704540" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.702358" elapsed="0.002210"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:54:12.704620" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:12.704775" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:54:12.700114" elapsed="0.004686"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.706351" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.706103" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.706803" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.706564" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.707250" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.707009" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.707707" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.707443" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:12.708555" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:54:12.708351" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:54:12.708905" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:54:12.708735" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.709079" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.709716" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.709428" elapsed="0.000331"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:54:12.709801" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:54:12.709996" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:54:12.707950" elapsed="0.002072"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:12.722373" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:54:12.722537" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:12.722706" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:12.712388" elapsed="0.010354"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.710099" elapsed="0.012711"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.723091" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.722851" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.710081" elapsed="0.013136"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.729111" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.724883" elapsed="0.004303"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.724546" elapsed="0.004710"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.724508" elapsed="0.004800"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.732516" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.729959" elapsed="0.002605"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.729424" elapsed="0.003176"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.729391" elapsed="0.003234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.733218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.732807" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.733617" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.733337" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.734193" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.733868" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.733702" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.733316" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.734864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.734475" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.735215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.734969" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.735824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.735494" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.735298" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.734950" elapsed="0.000961"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.736065" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:12.736978" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.736632" elapsed="0.000373"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.737249" elapsed="0.002504"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:12.723819" elapsed="0.016034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:12.740051" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.739935" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.739915" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.740320" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.740415" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:54:12.742987" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:54:12.705132" elapsed="0.037883"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.743102" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:54:12.743295" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:54:12.551369" elapsed="0.191954"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.743725" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.743430" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.743412" elapsed="0.000410"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.743857" elapsed="0.000027"/>
</return>
<arg>${BGP_RR_VAR_FOLDER}/route</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:54:12.546909" elapsed="0.197085"/>
</kw>
<var name="${prefix}">1.1.1.1/32</var>
<status status="PASS" start="2026-05-01T00:54:12.545919" elapsed="0.198131"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.744901" level="INFO">&amp;{mapping} = { PREFIX=2.2.2.2/32 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>PREFIX=${prefix}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.744384" elapsed="0.000546"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.779812" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.779401" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.780642" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.780369" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.780823" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.780019" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.781404" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.781014" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.781800" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.781969" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.781654" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.782498" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.782212" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.783536" level="INFO">mapping: {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.783255" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.784015" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.783744" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.784982" level="INFO">${value} = 2.2.2.2/32</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.784415" elapsed="0.000593"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.786221" level="INFO">${encoded} = 2.2.2.2/32</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.785731" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.786385" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:54:12.786636" level="INFO">${encoded_value} = 2.2.2.2/32</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.785203" elapsed="0.001459"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.786820" elapsed="0.000504"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">2.2.2.2/32</var>
<status status="PASS" start="2026-05-01T00:54:12.784277" elapsed="0.003090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.788162" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:12.787640" elapsed="0.000550"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:12.789511" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.789006" elapsed="0.000548"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:12.789696" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:12.789925" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:12.788381" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.790107" elapsed="0.000526"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:12.787501" elapsed="0.003174"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.784098" elapsed="0.006613"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:12.790755" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:12.790913" level="INFO">${mapping_to_use} = {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:12.782927" elapsed="0.008013"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.782618" elapsed="0.008354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.791148" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.790998" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.782597" elapsed="0.008629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.791973" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.791371" elapsed="0.000631"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.792052" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.778774" elapsed="0.013406"/>
</kw>
<msg time="2026-05-01T00:54:12.792234" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.766119" elapsed="0.026165"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.804770" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.817196" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.829554" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.829792" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.829986" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.830369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.830221" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.830206" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.830610" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.830780" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.830947" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.830174" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.830066" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.831175" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.831252" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:54:12.831382" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.761854" elapsed="0.069555"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.856923" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.856468" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.857830" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.857507" elapsed="0.000416">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.858036" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.857141" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.858686" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.858239" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.859057" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:12.859333" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;$PREFIX&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;$PREFIX&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;glob...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:12.858900" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.859840" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;$PREFIX&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;$PREFIX&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.859553" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:54:12.860398" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.860003" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.860976" level="INFO">${mapping_to_use} = {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.860662" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.860512" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.859971" elapsed="0.001092"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.862231" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;2.2.2.2/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;2.2.2.2/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.861216" elapsed="0.001047"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.862319" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:12.855644" elapsed="0.006840"/>
</kw>
<msg time="2026-05-01T00:54:12.862545" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.842734" elapsed="0.019862"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.875224" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.887809" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.900391" elapsed="0.000088"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.900750" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.900947" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.901522" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.901260" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:12.901240" elapsed="0.000372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.901792" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.901973" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.902140" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:12.901195" elapsed="0.000999"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.901038" elapsed="0.001186"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.902374" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.902472" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:54:12.902660" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;2.2.2.2/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;2.2.2.2/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:12.841769" elapsed="0.060925"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:12.904199" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.903896" elapsed="0.000381">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:12.904384" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:12.903482" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.904881" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.904534" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.905500" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.905171" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.904972" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.904507" elapsed="0.001084"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.908119" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.905750" elapsed="0.002398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:54:12.908208" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:54:12.908388" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:54:12.903092" elapsed="0.005322"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.910174" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.909899" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.910632" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;2.2.2.2/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;2.2.2.2/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.910376" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.911087" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.910840" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.911632" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.911367" elapsed="0.000311"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:12.912604" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:54:12.912348" elapsed="0.000283"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:54:12.913003" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:54:12.912807" elapsed="0.000222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.913182" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.913873" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.913571" elapsed="0.000349"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:54:12.913969" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:54:12.914171" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:54:12.911898" elapsed="0.002300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:12.929350" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;2.2.2.2/32&lt;/prefix&gt;
   &lt;path-id&gt;0&lt;/path-id&gt;
   &lt;route-key&gt;2.2.2.2/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;199.20.160.41&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:54:12.929524" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=2.2.2.2%2F32,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:12.929721" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:12.916857" elapsed="0.012911"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.914282" elapsed="0.015637"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.930286" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.929972" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.914259" elapsed="0.016159"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.939125" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.933010" elapsed="0.006165"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.932407" elapsed="0.006806"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.932358" elapsed="0.006881"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.941998" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.939610" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.939300" elapsed="0.002779"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.939282" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.942732" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.942300" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.943077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.942832" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.943652" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.943327" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.943158" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.942813" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.944267" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.943899" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.944699" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.944440" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.945248" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.944947" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.944782" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.944420" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.945500" elapsed="0.000397"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:12.946374" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:12.946067" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:12.946587" elapsed="0.002290"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:12.931215" elapsed="0.017731"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:12.949136" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:54:12.949023" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.949004" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.949393" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:54:12.949478" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:54:12.951868" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:54:12.908823" elapsed="0.043074"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.951986" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:54:12.952156" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:54:12.750003" elapsed="0.202179"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:12.952564" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:12.952288" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.952271" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:12.952693" elapsed="0.000026"/>
</return>
<arg>${BGP_RR_VAR_FOLDER}/route</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:54:12.745198" elapsed="0.207623"/>
</kw>
<var name="${prefix}">2.2.2.2/32</var>
<status status="PASS" start="2026-05-01T00:54:12.744184" elapsed="0.208680"/>
</iter>
<var>${prefix}</var>
<value>1.1.1.1/32</value>
<value>2.2.2.2/32</value>
<status status="PASS" start="2026-05-01T00:54:12.545808" elapsed="0.407094"/>
</for>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.956294" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.955930" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.956794" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.956531" elapsed="0.000310"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.960621" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:12.957485" elapsed="0.003196"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.964518" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:12.964612" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:12.960850" elapsed="0.003846"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.965525" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.965033" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:12.964772" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:12.964752" elapsed="0.000884"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:12.957086" elapsed="0.008598"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:12.967775" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:12.967887" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:12.965839" elapsed="0.002082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.968378" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.968098" elapsed="0.000327"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:12.955601" elapsed="0.012903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.970652" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:12.970272" elapsed="0.000410"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.972788" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:12.970853" elapsed="0.001964"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:12.977004" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:12.977146" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:12.977242" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:12.972989" elapsed="0.004279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.980303" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:12.977439" elapsed="0.002932"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:12.984093" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.980615" elapsed="0.003580">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:12.969692" elapsed="0.014663">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:15.987505" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:15.986602" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:15.992398" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:15.987962" elapsed="0.004521"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:15.998790" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:15.998968" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:15.999099" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:15.992858" elapsed="0.006278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:16.002854" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:15.999375" elapsed="0.003550"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:16.006927" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:16.003147" elapsed="0.003877">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:15.985246" elapsed="0.021931">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.010630" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:19.009659" elapsed="0.001044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.015689" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:19.011118" elapsed="0.004633"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:19.021902" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:19.022043" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:19.022144" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:19.016257" elapsed="0.005914"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.024862" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.022356" elapsed="0.002555"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.028763" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:19.025072" elapsed="0.003793">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:19.008334" elapsed="0.020696">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:19.029188" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.969158" elapsed="6.060170">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:19.029518" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:19.029582" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:12.968712" elapsed="6.060903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.030768" level="INFO">[?2004l00:54:13 | 3160   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:13 | 3160   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:13 | 3160   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:13 | 3160   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:13 | 3160   | [01;34minstallation [0m | [1m        [0m
00:54:13 | 3160   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:13 | 3160   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:13 | 3160   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:13 | 3160   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:13 | 3160   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:13 | 3160   | configuration[0m | . local-as         | '64496'[0m
00:54:13 | 3160   | configuration[0m | . peer-as          | '64496'[0m
00:54:13 | 3160   | configuration[0m | &gt; capability       | [0m
00:54:13 | 3160   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:13 | 3160   | configuration[0m | . add-path         | 'disable'[0m
00:54:13 | 3160   | configuration[0m | &lt; capability       | [0m
00:54:13 | 3160   | configuration[0m | &gt; family           | [0m
00:54:13 | 3160   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:13 | 3160   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:13 | 3160   | configuration[0m | &lt; family           | [0m
00:54:13 | 3160   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1m        [0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1m        [0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:19.031066" level="INFO">${output} = [?2004l00:54:13 | 3160   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:13 | 3160   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:13 | 3160   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:19.030589" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.031715" level="INFO">[?2004l00:54:13 | 3160   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:13 | 3160   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:13 | 3160   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:13 | 3160   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:13 | 3160   | [01;34minstallation [0m | [1m        [0m
00:54:13 | 3160   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:13 | 3160   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:13 | 3160   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:13 | 3160   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:13 | 3160   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:13 | 3160   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:13 | 3160   | configuration[0m | . local-as         | '64496'[0m
00:54:13 | 3160   | configuration[0m | . peer-as          | '64496'[0m
00:54:13 | 3160   | configuration[0m | &gt; capability       | [0m
00:54:13 | 3160   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:13 | 3160   | configuration[0m | . add-path         | 'disable'[0m
00:54:13 | 3160   | configuration[0m | &lt; capability       | [0m
00:54:13 | 3160   | configuration[0m | &gt; family           | [0m
00:54:13 | 3160   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:13 | 3160   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:13 | 3160   | configuration[0m | &lt; family           | [0m
00:54:13 | 3160   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1m        [0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1m        [0m
00:54:13 | 3160   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.031327" elapsed="0.000539"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.033063" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:19.032627" elapsed="0.000475"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:19.033273" elapsed="0.000306"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:19.032220" elapsed="0.001432"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.035962" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:19.036055" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:19.033805" elapsed="0.002280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.036505" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.036245" elapsed="0.000309"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.038684" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:19.037218" elapsed="0.001522"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.039565" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:19.039647" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:19.038901" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.040277" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.040023" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:19.039744" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:19.039723" elapsed="0.000661"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:19.036815" elapsed="0.003616"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:19.030176" elapsed="0.010323"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:19.029756" elapsed="0.010771"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:19.029722" elapsed="0.010828"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:19.040729" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:19.040613" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:19.040596" elapsed="0.000209"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:54:12.955403" elapsed="6.085479"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.041928" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:19.041605" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.042350" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.042111" elapsed="0.000284"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.045956" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:19.043240" elapsed="0.002776"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.050091" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:19.050187" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:19.046182" elapsed="0.004031"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.050846" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.050575" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:19.050287" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:19.050267" elapsed="0.000683"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:19.042874" elapsed="0.008126"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:19.052889" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:19.052978" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:19.051152" elapsed="0.001851"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.053415" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.053165" elapsed="0.000322"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:19.041262" elapsed="0.012283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.055475" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:19.055112" elapsed="0.000391"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.057828" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:19.055667" elapsed="0.002190"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:19.062675" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:19.062814" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:19.062930" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:19.058024" elapsed="0.004933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.066007" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:19.063143" elapsed="0.002935"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:19.070122" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:19.066313" elapsed="0.003923">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:19.054637" elapsed="0.015769">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:22.073508" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:22.072608" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:22.078414" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:22.073967" elapsed="0.004536"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:22.084726" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:22.084903" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:22.085037" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:22.078876" elapsed="0.006198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:22.090692" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:22.085317" elapsed="0.005447"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:22.094510" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:22.090995" elapsed="0.003615">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:22.071282" elapsed="0.023487">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.098208" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:25.097277" elapsed="0.001002"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.102146" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:25.098711" elapsed="0.003476"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:25.108161" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:25.108347" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:25.108509" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:25.102426" elapsed="0.006123"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.112320" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.108800" elapsed="0.003591"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.116276" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:25.112642" elapsed="0.003722">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:25.095860" elapsed="0.020638">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:25.116595" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:19.054105" elapsed="6.062583">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:25.116805" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:25.116850" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:19.053712" elapsed="6.063162"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.117769" level="INFO">[?2004l00:54:19 | 3164   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:19 | 3164   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:19 | 3164   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:19 | 3164   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:19 | 3164   | [01;34minstallation [0m | [1m        [0m
00:54:19 | 3164   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:19 | 3164   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:19 | 3164   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:19 | 3164   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:19 | 3164   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:19 | 3164   | configuration[0m | . local-as         | '64496'[0m
00:54:19 | 3164   | configuration[0m | . peer-as          | '64496'[0m
00:54:19 | 3164   | configuration[0m | &gt; capability       | [0m
00:54:19 | 3164   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:19 | 3164   | configuration[0m | . add-path         | 'disable'[0m
00:54:19 | 3164   | configuration[0m | &lt; capability       | [0m
00:54:19 | 3164   | configuration[0m | &gt; family           | [0m
00:54:19 | 3164   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:19 | 3164   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:19 | 3164   | configuration[0m | &lt; family           | [0m
00:54:19 | 3164   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1m        [0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1m        [0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:25.117991" level="INFO">${output} = [?2004l00:54:19 | 3164   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:19 | 3164   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:19 | 3164   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:25.117595" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.118436" level="INFO">[?2004l00:54:19 | 3164   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:19 | 3164   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:19 | 3164   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:19 | 3164   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:19 | 3164   | [01;34minstallation [0m | [1m        [0m
00:54:19 | 3164   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:19 | 3164   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:19 | 3164   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:19 | 3164   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:19 | 3164   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:19 | 3164   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:19 | 3164   | configuration[0m | . local-as         | '64496'[0m
00:54:19 | 3164   | configuration[0m | . peer-as          | '64496'[0m
00:54:19 | 3164   | configuration[0m | &gt; capability       | [0m
00:54:19 | 3164   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:19 | 3164   | configuration[0m | . add-path         | 'disable'[0m
00:54:19 | 3164   | configuration[0m | &lt; capability       | [0m
00:54:19 | 3164   | configuration[0m | &gt; family           | [0m
00:54:19 | 3164   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:19 | 3164   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:19 | 3164   | configuration[0m | &lt; family           | [0m
00:54:19 | 3164   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1m        [0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1m        [0m
00:54:19 | 3164   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.118180" elapsed="0.000384"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.119373" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:25.119052" elapsed="0.000349"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:25.119576" elapsed="0.000266"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:25.118771" elapsed="0.001143"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.121899" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:25.121994" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:25.120082" elapsed="0.001940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.122465" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.122183" elapsed="0.000353"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.124569" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:25.123189" elapsed="0.001438"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.125508" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:25.125599" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:25.124789" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.126196" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.125946" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:25.125693" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:25.125675" elapsed="0.000629"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:25.122819" elapsed="0.003531"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:25.117277" elapsed="0.009124"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:25.116977" elapsed="0.009450"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:25.116952" elapsed="0.009513"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:25.126643" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:25.126525" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:25.126508" elapsed="0.000204"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-05-01T00:54:19.041069" elapsed="6.085699"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.127926" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:25.127556" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.128356" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.128112" elapsed="0.000289"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.131357" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:25.129245" elapsed="0.002170"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.135739" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:25.135857" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:25.131598" elapsed="0.004287"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.136484" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.136209" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:25.135956" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:25.135937" elapsed="0.000657"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:25.128873" elapsed="0.007769"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:25.138328" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:25.138417" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:25.136796" elapsed="0.001647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.138873" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.138624" elapsed="0.000294"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:25.127149" elapsed="0.011825"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.140911" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:25.140556" elapsed="0.000382"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.143045" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:25.141100" elapsed="0.001972"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:25.147445" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:25.147585" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:25.147692" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:25.143231" elapsed="0.004488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.151107" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:25.147937" elapsed="0.003239"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:25.155088" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:25.151425" elapsed="0.003755">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:25.140077" elapsed="0.015256">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:28.158576" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:28.157620" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:28.163238" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:28.159034" elapsed="0.004247"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:28.169820" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:28.170009" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:28.170151" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:28.163552" elapsed="0.006639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:28.174347" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:28.170444" elapsed="0.003977"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:28.178480" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:28.174714" elapsed="0.003842">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:28.156151" elapsed="0.022523">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.181715" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.180814" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.185131" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:31.182166" elapsed="0.003004"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:31.191133" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:31.191312" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:31.191445" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:31.185400" elapsed="0.006115"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.195357" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.191763" elapsed="0.003714"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.200123" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.195785" elapsed="0.004423">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:31.179564" elapsed="0.020823">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:31.200549" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:25.139538" elapsed="6.061144">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:31.200857" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:31.200920" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:25.139135" elapsed="6.061820"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.202233" level="INFO">[?2004l00:54:25 | 3168   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:25 | 3168   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:25 | 3168   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:25 | 3168   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:25 | 3168   | [01;34minstallation [0m | [1m        [0m
00:54:25 | 3168   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:25 | 3168   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:25 | 3168   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:25 | 3168   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:25 | 3168   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:25 | 3168   | configuration[0m | . local-as         | '64496'[0m
00:54:25 | 3168   | configuration[0m | . peer-as          | '64496'[0m
00:54:25 | 3168   | configuration[0m | &gt; capability       | [0m
00:54:25 | 3168   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:25 | 3168   | configuration[0m | . add-path         | 'disable'[0m
00:54:25 | 3168   | configuration[0m | &lt; capability       | [0m
00:54:25 | 3168   | configuration[0m | &gt; family           | [0m
00:54:25 | 3168   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:25 | 3168   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:25 | 3168   | configuration[0m | &lt; family           | [0m
00:54:25 | 3168   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1m        [0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1m        [0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.202585" level="INFO">${output} = [?2004l00:54:25 | 3168   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:25 | 3168   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:25 | 3168   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:31.202043" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.203146" level="INFO">[?2004l00:54:25 | 3168   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:25 | 3168   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:25 | 3168   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:25 | 3168   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:25 | 3168   | [01;34minstallation [0m | [1m        [0m
00:54:25 | 3168   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:25 | 3168   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:25 | 3168   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:25 | 3168   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:25 | 3168   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:25 | 3168   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:25 | 3168   | configuration[0m | . local-as         | '64496'[0m
00:54:25 | 3168   | configuration[0m | . peer-as          | '64496'[0m
00:54:25 | 3168   | configuration[0m | &gt; capability       | [0m
00:54:25 | 3168   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:25 | 3168   | configuration[0m | . add-path         | 'disable'[0m
00:54:25 | 3168   | configuration[0m | &lt; capability       | [0m
00:54:25 | 3168   | configuration[0m | &gt; family           | [0m
00:54:25 | 3168   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:25 | 3168   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:25 | 3168   | configuration[0m | &lt; family           | [0m
00:54:25 | 3168   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1m        [0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1m        [0m
00:54:25 | 3168   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.202826" elapsed="0.000435"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.204120" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.203781" elapsed="0.000367"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.204304" elapsed="0.000330"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:31.203490" elapsed="0.001223"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.206808" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.206902" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:31.204883" elapsed="0.002047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.207371" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.207110" elapsed="0.000312"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.209545" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.208088" elapsed="0.001518"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.210653" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.210746" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:31.209803" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.211361" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.211106" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.210848" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.210826" elapsed="0.000683"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:31.207714" elapsed="0.003845"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:31.201607" elapsed="0.010005"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.201114" elapsed="0.010526"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.201073" elapsed="0.010590"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:31.211839" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:31.211720" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.211703" elapsed="0.000207"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-05-01T00:54:25.126960" elapsed="6.085016"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:54:12.955174" elapsed="18.256843"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.212496" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.212182" elapsed="0.000413">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${cfg_file}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:54:12.953236" elapsed="18.259477">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>From neon onwards there are extra BGP End-Of-RIB message per address family</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.212940" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${update_count}</var>
<arg>4</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.213118" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgp_Received_Updates</arg>
<arg>${update_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.213295" elapsed="0.000021"/>
</kw>
<arg>${BGP_CFG_NAME}</arg>
<doc>Setup keyword for exa to odl test case</doc>
<status status="FAIL" start="2026-05-01T00:54:12.545038" elapsed="18.668373">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Deconfigure_Routes_And_Stop_ExaBgp" type="TEARDOWN">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.214950" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:31.214785" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.215376" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.215128" elapsed="0.000292"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.216256" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.215945" elapsed="0.000339"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.216435" elapsed="0.000419"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:31.215645" elapsed="0.001278"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.218235" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.218323" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:31.217073" elapsed="0.001277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.218816" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.218521" elapsed="0.000342"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.220765" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.219518" elapsed="0.001301"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.353515" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.353617" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:31.220974" elapsed="0.132670"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.354243" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.353985" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.353720" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.353698" elapsed="0.000650"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:31.219112" elapsed="0.135283"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:31.214372" elapsed="0.140073"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.354943" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.354653" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.355598" level="INFO">&amp;{mapping} = { PREFIX=http://10.30.170.185:8080 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>PREFIX=${prefix}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.355131" elapsed="0.000494"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.398538" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.398144" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:31.399338" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.399069" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:31.399578" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:31.398736" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.400162" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:31.399772" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:31.400523" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/route_refresh/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:31.400677" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:31.400353" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.401109" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.400861" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.402148" level="INFO">mapping: {'PREFIX': 'http://10.30.170.185:8080', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.401890" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.402635" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.402351" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.403322" level="INFO">${value} = http://10.30.170.185:8080</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:31.403024" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:31.404118" level="INFO">${encoded} = http%3A//10.30.170.185%3A8080</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.403897" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:31.404197" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:54:31.404356" level="INFO">${encoded_value} = http%3A//10.30.170.185%3A8080</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:31.403553" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.404583" elapsed="0.000242"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">http://10.30.170.185:8080</var>
<status status="PASS" start="2026-05-01T00:54:31.402887" elapsed="0.001978"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.405411" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:31.405114" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:31.406199" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.405987" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:31.406275" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:31.406428" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:31.405640" elapsed="0.000829"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.406624" elapsed="0.000224"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:31.404981" elapsed="0.001907"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:31.402712" elapsed="0.004211"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:31.406967" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:31.407125" level="INFO">${mapping_to_use} = {'PREFIX': 'http%3A//10.30.170.185%3A8080', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:31.401537" elapsed="0.005614"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.401221" elapsed="0.005963"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.407360" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:31.407209" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.401203" elapsed="0.006234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.408172" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.407599" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:31.408249" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:31.397498" elapsed="0.010876"/>
</kw>
<msg time="2026-05-01T00:54:31.408498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:31.384479" elapsed="0.024083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.421296" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.433716" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.446137" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.446332" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.446524" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.446895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:31.446749" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:31.446735" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.447114" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.447281" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.447446" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:31.446705" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:31.446602" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.447687" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:31.447762" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:54:31.447881" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:31.380115" elapsed="0.067792"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.449056" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.448776" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:31.459327" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:31.459375" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:31.459503" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:31.451232" elapsed="0.008299"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.449213" elapsed="0.010363"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.459755" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:31.459603" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.449195" elapsed="0.010645"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.463272" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.460876" elapsed="0.002440"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.460655" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.460638" elapsed="0.002739"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.465969" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.463676" elapsed="0.002339"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.463433" elapsed="0.002616"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.463417" elapsed="0.002657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.466633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.466240" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.466969" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:31.466732" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.467533" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.467216" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.467055" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.466715" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.468141" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.467778" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:31.468489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:31.468238" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.469039" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.468740" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.468572" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.468220" elapsed="0.000939"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:31.469310" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:31.470119" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:31.469841" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:31.470301" elapsed="0.002451"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:31.460198" elapsed="0.012617"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:31.472861" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:54:31.475132" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:54:31.448167" elapsed="0.026992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:31.475249" elapsed="0.000030"/>
</return>
<arg>${BGP_RR_VAR_FOLDER}/route</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:54:31.355858" elapsed="0.119521"/>
</kw>
<doc>Teardown keyword for exa to odl test case</doc>
<status status="PASS" start="2026-05-01T00:54:31.213729" elapsed="0.261710"/>
</kw>
<doc>Exabgp sends route refresh and count received updates</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:54:12.544546" elapsed="18.930957">Setup failed:
Unable to connect ExaBgp to ODL</status>
</test>
<test id="s1-s14-t4" name="Odl_To_Send_Route_Refresh" line="102">
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib" type="SETUP">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.479616" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.479205" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.480073" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.479822" elapsed="0.000296"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.482537" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.480779" elapsed="0.001820"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.487565" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:31.487671" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:31.482912" elapsed="0.004786"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.488335" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.488055" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:31.487781" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:31.487756" elapsed="0.000689"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:31.480373" elapsed="0.008145"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:31.490089" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:31.490184" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:31.488691" elapsed="0.001518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.490630" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.490368" elapsed="0.000306"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:31.478840" elapsed="0.011891"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.492711" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:31.492342" elapsed="0.000397"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.495097" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:31.492902" elapsed="0.002223"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:31.499914" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:31.500064" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:31.500163" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:31.495289" elapsed="0.004899"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.502894" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:31.500357" elapsed="0.002604"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:31.506676" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.503178" elapsed="0.003596">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:31.491859" elapsed="0.015069">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:34.510002" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:34.509092" elapsed="0.001237"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:34.515145" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:34.510772" elapsed="0.004436"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:34.523351" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:34.523516" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:34.523614" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:34.515611" elapsed="0.008029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:34.526180" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:34.523816" elapsed="0.002413"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:34.529878" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:34.526423" elapsed="0.003556">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:34.507851" elapsed="0.022281">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.534053" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:37.532707" elapsed="0.001440"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.539183" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:37.534636" elapsed="0.004590"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:37.545210" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:37.545350" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:37.545481" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:37.539492" elapsed="0.006032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.548530" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.545706" elapsed="0.002876"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.552672" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:37.548744" elapsed="0.004034">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:37.531009" elapsed="0.021940">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:37.553084" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.491297" elapsed="6.061921">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:37.553390" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:37.553476" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:31.490898" elapsed="6.062618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.554915" level="INFO">[?2004l00:54:31 | 3180   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:31 | 3180   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:31 | 3180   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:31 | 3180   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:31 | 3180   | [01;34minstallation [0m | [1m        [0m
00:54:31 | 3180   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:31 | 3180   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:31 | 3180   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:31 | 3180   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:31 | 3180   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:31 | 3180   | configuration[0m | . local-as         | '64496'[0m
00:54:31 | 3180   | configuration[0m | . peer-as          | '64496'[0m
00:54:31 | 3180   | configuration[0m | &gt; capability       | [0m
00:54:31 | 3180   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:31 | 3180   | configuration[0m | . add-path         | 'disable'[0m
00:54:31 | 3180   | configuration[0m | &lt; capability       | [0m
00:54:31 | 3180   | configuration[0m | &gt; family           | [0m
00:54:31 | 3180   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:31 | 3180   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:31 | 3180   | configuration[0m | &lt; family           | [0m
00:54:31 | 3180   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1m        [0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1m        [0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:37.555138" level="INFO">${output} = [?2004l00:54:31 | 3180   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:31 | 3180   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:31 | 3180   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:37.554710" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.555870" level="INFO">[?2004l00:54:31 | 3180   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:31 | 3180   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:31 | 3180   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:31 | 3180   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:31 | 3180   | [01;34minstallation [0m | [1m        [0m
00:54:31 | 3180   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:31 | 3180   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:31 | 3180   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:31 | 3180   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:31 | 3180   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:31 | 3180   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:31 | 3180   | configuration[0m | . local-as         | '64496'[0m
00:54:31 | 3180   | configuration[0m | . peer-as          | '64496'[0m
00:54:31 | 3180   | configuration[0m | &gt; capability       | [0m
00:54:31 | 3180   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:31 | 3180   | configuration[0m | . add-path         | 'disable'[0m
00:54:31 | 3180   | configuration[0m | &lt; capability       | [0m
00:54:31 | 3180   | configuration[0m | &gt; family           | [0m
00:54:31 | 3180   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:31 | 3180   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:31 | 3180   | configuration[0m | &lt; family           | [0m
00:54:31 | 3180   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1m        [0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1m        [0m
00:54:31 | 3180   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.555409" elapsed="0.000627"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.557122" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:37.556766" elapsed="0.000450"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:37.557374" elapsed="0.000307"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:37.556340" elapsed="0.001403"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.559774" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:37.559871" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:37.557907" elapsed="0.001992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.560317" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.560058" elapsed="0.000307"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.562394" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:37.561043" elapsed="0.001422"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.563267" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:37.563347" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:37.562633" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.564040" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.563726" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:37.563465" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:37.563426" elapsed="0.000726"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:37.560657" elapsed="0.003544"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:37.554108" elapsed="0.010145"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:37.553667" elapsed="0.010613"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:37.553632" elapsed="0.010671"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:37.564500" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:37.564360" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:37.564343" elapsed="0.000230"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:54:31.478633" elapsed="6.085965"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.565708" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:37.565355" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.566131" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.565891" elapsed="0.000284"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.568898" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:37.566842" elapsed="0.002115"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.572852" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:37.572950" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:37.569120" elapsed="0.003856"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.573602" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.573311" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:37.573050" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:37.573028" elapsed="0.000684"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:37.566471" elapsed="0.007288"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:37.575375" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:37.575482" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:37.573911" elapsed="0.001599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.575997" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.575676" elapsed="0.000368"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:37.565016" elapsed="0.011085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.578402" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:37.578049" elapsed="0.000381"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.580643" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:37.578615" elapsed="0.002107"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:37.585084" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:37.585224" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:37.585321" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:37.580889" elapsed="0.004458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.588007" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:37.585552" elapsed="0.002504"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:37.591503" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:37.588213" elapsed="0.003389">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:37.577276" elapsed="0.014479">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:40.594421" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:40.593782" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:40.597986" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:40.594783" elapsed="0.003246"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:40.604290" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:40.604506" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:40.604685" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:40.598282" elapsed="0.006456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:40.608442" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:40.605024" elapsed="0.003508"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:40.612364" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:40.608777" elapsed="0.003707">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:40.592652" elapsed="0.020025">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.615756" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:43.614814" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.620494" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:43.616243" elapsed="0.004299"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:43.627626" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:43.627833" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:43.628102" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:43.620870" elapsed="0.007273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.631011" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.628426" elapsed="0.002669"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.633786" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:43.631256" elapsed="0.002604">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:43.613541" elapsed="0.020438">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:43.634070" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:37.576744" elapsed="6.057416">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:43.634275" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:43.634319" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:37.576294" elapsed="6.058049"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.635193" level="INFO">[?2004l00:54:37 | 3185   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:37 | 3185   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:37 | 3185   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:37 | 3185   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:37 | 3185   | [01;34minstallation [0m | [1m        [0m
00:54:37 | 3185   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:37 | 3185   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:37 | 3185   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:37 | 3185   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:37 | 3185   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:37 | 3185   | configuration[0m | . local-as         | '64496'[0m
00:54:37 | 3185   | configuration[0m | . peer-as          | '64496'[0m
00:54:37 | 3185   | configuration[0m | &gt; capability       | [0m
00:54:37 | 3185   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:37 | 3185   | configuration[0m | . add-path         | 'disable'[0m
00:54:37 | 3185   | configuration[0m | &lt; capability       | [0m
00:54:37 | 3185   | configuration[0m | &gt; family           | [0m
00:54:37 | 3185   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:37 | 3185   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:37 | 3185   | configuration[0m | &lt; family           | [0m
00:54:37 | 3185   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1m        [0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1m        [0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:43.635340" level="INFO">${output} = [?2004l00:54:37 | 3185   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:37 | 3185   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:37 | 3185   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:43.635065" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.635788" level="INFO">[?2004l00:54:37 | 3185   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:37 | 3185   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:37 | 3185   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:37 | 3185   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:37 | 3185   | [01;34minstallation [0m | [1m        [0m
00:54:37 | 3185   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:37 | 3185   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:37 | 3185   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:37 | 3185   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:37 | 3185   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:37 | 3185   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:37 | 3185   | configuration[0m | . local-as         | '64496'[0m
00:54:37 | 3185   | configuration[0m | . peer-as          | '64496'[0m
00:54:37 | 3185   | configuration[0m | &gt; capability       | [0m
00:54:37 | 3185   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:37 | 3185   | configuration[0m | . add-path         | 'disable'[0m
00:54:37 | 3185   | configuration[0m | &lt; capability       | [0m
00:54:37 | 3185   | configuration[0m | &gt; family           | [0m
00:54:37 | 3185   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:37 | 3185   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:37 | 3185   | configuration[0m | &lt; family           | [0m
00:54:37 | 3185   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1m        [0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1m        [0m
00:54:37 | 3185   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.635537" elapsed="0.000410"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.636809" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:43.636436" elapsed="0.000400"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:43.636988" elapsed="0.000441"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:43.636167" elapsed="0.001343"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.639645" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:43.639736" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:43.637662" elapsed="0.002101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.640167" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.639917" elapsed="0.000297"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.642772" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:43.640870" elapsed="0.001958"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.643648" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:43.643731" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:43.642987" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.644319" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.644073" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:43.643823" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:43.643805" elapsed="0.000620"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:43.640505" elapsed="0.004008"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:43.634773" elapsed="0.009797"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:43.634446" elapsed="0.010151"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:43.634421" elapsed="0.010199"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:43.644791" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:43.644676" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:43.644659" elapsed="0.000199"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-05-01T00:54:37.564790" elapsed="6.080092"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.645904" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:43.645582" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.646333" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.646091" elapsed="0.000286"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.649325" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:43.646993" elapsed="0.002389"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.651766" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:43.651856" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:43.649561" elapsed="0.002321"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.652445" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.652201" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:43.651951" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:43.651933" elapsed="0.000659"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:54:43.646636" elapsed="0.006001"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:43.654407" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:54:43.654510" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:43.652787" elapsed="0.001750"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.654932" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.654692" elapsed="0.000286"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:43.645244" elapsed="0.009792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.657178" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:43.656825" elapsed="0.000380"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.659324" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:43.657410" elapsed="0.001942"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:43.664417" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:43.664597" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:43.664703" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:43.659533" elapsed="0.005198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.667346" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:43.664903" elapsed="0.002492"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:43.670640" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:43.667572" elapsed="0.003164">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:43.656280" elapsed="0.014612">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:46.673834" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:46.672951" elapsed="0.000952"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:46.677612" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:46.674283" elapsed="0.003373"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:46.684518" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:46.684794" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:46.685027" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:46.677904" elapsed="0.007172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:46.689768" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:46.685526" elapsed="0.004325"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:46.694369" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:46.690147" elapsed="0.004383">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:46.671739" elapsed="0.022987">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.697844" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:49.696931" elapsed="0.000984"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.705176" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:49.698299" elapsed="0.006919"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:49.851118" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:49.851407" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:54:49.851839" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:49.705470" elapsed="0.146433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.858028" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:49.852303" elapsed="0.005835"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.861968" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:54:49.858519" elapsed="0.003526">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:54:49.695658" elapsed="0.166505">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:49.862257" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:54:43.655595" elapsed="6.206753">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:54:49.862481" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:49.862527" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:43.655197" elapsed="6.207354"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:49.863387" level="INFO">[?2004l00:54:43 | 3189   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:43 | 3189   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:43 | 3189   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:43 | 3189   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:43 | 3189   | [01;34minstallation [0m | [1m        [0m
00:54:43 | 3189   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:43 | 3189   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:43 | 3189   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:43 | 3189   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:43 | 3189   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:43 | 3189   | configuration[0m | . local-as         | '64496'[0m
00:54:43 | 3189   | configuration[0m | . peer-as          | '64496'[0m
00:54:43 | 3189   | configuration[0m | &gt; capability       | [0m
00:54:43 | 3189   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:43 | 3189   | configuration[0m | . add-path         | 'disable'[0m
00:54:43 | 3189   | configuration[0m | &lt; capability       | [0m
00:54:43 | 3189   | configuration[0m | &gt; family           | [0m
00:54:43 | 3189   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:43 | 3189   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:43 | 3189   | configuration[0m | &lt; family           | [0m
00:54:43 | 3189   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1m        [0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1m        [0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:49.863551" level="INFO">${output} = [?2004l00:54:43 | 3189   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:43 | 3189   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:43 | 3189   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:49.863254" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.863994" level="INFO">[?2004l00:54:43 | 3189   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:54:43 | 3189   | [01;34mversion      [0m | [1m4.2.17  [0m
00:54:43 | 3189   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:54:43 | 3189   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:54:43 | 3189   | [01;34minstallation [0m | [1m        [0m
00:54:43 | 3189   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:54:43 | 3189   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:54:43 | 3189   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:54:43 | 3189   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:54:43 | 3189   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:54:43 | 3189   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:54:43 | 3189   | configuration[0m | . local-as         | '64496'[0m
00:54:43 | 3189   | configuration[0m | . peer-as          | '64496'[0m
00:54:43 | 3189   | configuration[0m | &gt; capability       | [0m
00:54:43 | 3189   | configuration[0m | . route-refresh    | 'enable'[0m
00:54:43 | 3189   | configuration[0m | . add-path         | 'disable'[0m
00:54:43 | 3189   | configuration[0m | &lt; capability       | [0m
00:54:43 | 3189   | configuration[0m | &gt; family           | [0m
00:54:43 | 3189   | configuration[0m | . ipv4             | 'unicast'[0m
00:54:43 | 3189   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:54:43 | 3189   | configuration[0m | &lt; family           | [0m
00:54:43 | 3189   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1m        [0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1m        [0m
00:54:43 | 3189   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:49.863745" elapsed="0.000392"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:49.864952" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:49.864634" elapsed="0.000345"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:49.865130" elapsed="0.000253"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:49.864347" elapsed="0.001116"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:50.172914" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:50.173223" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:49.865615" elapsed="0.307647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:50.173997" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:50.173614" elapsed="0.000435"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.384535" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:50.174789" elapsed="1.209881"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.385745" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:51.385861" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:51.384936" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.386621" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.386282" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:51.385977" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.385950" elapsed="0.000786"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:50.174359" elapsed="1.212440"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:49.862966" elapsed="1.523889"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:49.862657" elapsed="1.524227"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:49.862630" elapsed="1.524278"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:51.387089" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:51.386967" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.386949" elapsed="0.000209"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-05-01T00:54:43.645060" elapsed="7.742122"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:54:31.478380" elapsed="19.908838"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.387729" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:54:51.387386" elapsed="0.000418">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${BGP_CFG_NAME}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:54:31.476451" elapsed="19.911463">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.388779" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:54:51.388623" elapsed="0.000183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.389212" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.388962" elapsed="0.000294"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.390142" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:51.389812" elapsed="0.000358"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:51.390331" elapsed="0.000236"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:54:51.389477" elapsed="0.001159"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.702804" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:51.703011" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:51.390787" elapsed="0.312256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.703874" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.703296" elapsed="0.000630"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.705993" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:51.704693" elapsed="0.001391"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.789339" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:54:51.789489" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:54:51.706253" elapsed="0.083266"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.790806" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.790072" elapsed="0.000890"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:51.789741" elapsed="0.001326"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.789711" elapsed="0.001428"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:54:51.704229" elapsed="0.087049"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:54:51.388278" elapsed="0.403085"/>
</kw>
<doc>Sends route refresh request and checks if exabgp receives it</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:54:31.475737" elapsed="20.315690">Setup failed:
Unable to connect ExaBgp to ODL</status>
</test>
<test id="s1-s14-t5" name="Delete_Bgp_Peer_Configuration" line="124">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:51.796473" elapsed="0.000313"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:51.796067" elapsed="0.000798"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.798481" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:51.798279" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.798252" elapsed="0.000365"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.803946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:51.803837" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.803818" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.805061" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:51.804664" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.805568" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:51.805252" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:51.805639" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:54:51.805806" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:51.804263" elapsed="0.001567"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.811746" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:51.811634" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.811614" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.813047" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:51.812939" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.812921" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:51.813653" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.813267" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.814069" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:51.813847" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.843107" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:51.814675" elapsed="0.028585"/>
</kw>
<msg time="2026-05-01T00:54:51.843527" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:51.843595" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:51.814311" elapsed="0.029335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:51.874068" level="INFO">". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:51.844386" elapsed="0.029793"/>
</kw>
<msg time="2026-05-01T00:54:51.874374" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:51.874420" level="INFO">${message_wait} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "l "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:51.843891" elapsed="0.030591"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.874839" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:51.874609" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.874588" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.875367" level="INFO"> ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.875063" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.875748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:51.875527" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.875508" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:51.875860" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:51.878488" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:54:51.878699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:51.877351" elapsed="0.001483"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.879110" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.879474" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:51.876724" elapsed="0.002939"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:51.876159" elapsed="0.003568"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:51.812634" elapsed="0.067193"/>
</kw>
<msg time="2026-05-01T00:54:51.879919" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:51.879964" level="INFO">${message} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "l "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:51.811987" elapsed="0.068014"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:51.880188" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:54:51.880079" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.880060" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.880703" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.881054" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.881126" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:51.811276" elapsed="0.069961"/>
</kw>
<msg time="2026-05-01T00:54:51.881337" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:51.881381" level="INFO">${output} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "l "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:51.806268" elapsed="0.075150"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.881764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:51.881510" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.881492" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:51.806073" elapsed="0.075794"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:51.805887" elapsed="0.076011"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:51.803465" elapsed="0.078491"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:51.797792" elapsed="0.084221"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:51.797116" elapsed="0.084943"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:51.792742" elapsed="0.089418"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.882958" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.882363" elapsed="0.000623"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.925654" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:51.925258" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:51.926493" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:51.926187" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:51.926670" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:51.925850" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.927248" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:51.926865" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:51.927631" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:51.927805" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:51.927489" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.928238" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.927993" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.929249" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.928992" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.929734" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.929468" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.930796" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:51.930124" elapsed="0.000735"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:51.932562" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.932053" elapsed="0.000568"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:51.932735" elapsed="0.000067"/>
</return>
<msg time="2026-05-01T00:54:51.933108" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:51.931296" elapsed="0.001872"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.933553" elapsed="0.000543"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:54:51.929986" elapsed="0.004203"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.935663" level="INFO">${value} = example-bgp-peer</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:51.934957" elapsed="0.000764"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:51.937497" level="INFO">${encoded} = example-bgp-peer</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.936998" elapsed="0.000559"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:51.937671" elapsed="0.000066"/>
</return>
<msg time="2026-05-01T00:54:51.938005" level="INFO">${encoded_value} = example-bgp-peer</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:51.936240" elapsed="0.001819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.938550" elapsed="0.000884"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-05-01T00:54:51.934643" elapsed="0.004917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.940842" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:51.940127" elapsed="0.000773"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:51.942622" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.942075" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:51.942795" elapsed="0.000068"/>
</return>
<msg time="2026-05-01T00:54:51.943139" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:51.941327" elapsed="0.001868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.943573" elapsed="0.000502"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:54:51.939822" elapsed="0.004346"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.945426" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:51.944758" elapsed="0.000764"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:51.947229" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.946753" elapsed="0.000535"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:51.947360" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:51.947528" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:51.945940" elapsed="0.001613"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:51.947706" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:51.944424" elapsed="0.003543"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:51.929810" elapsed="0.018194"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:51.948048" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:54:51.948209" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:51.928668" elapsed="0.019567"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:51.928354" elapsed="0.019914"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.948465" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:51.948296" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.928334" elapsed="0.020210"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.949342" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:51.948692" elapsed="0.000679"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:51.949421" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:51.924641" elapsed="0.024926"/>
</kw>
<msg time="2026-05-01T00:54:51.949624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:51.911975" elapsed="0.037699"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.962612" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.975659" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.988273" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.988528" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.988723" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.989177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:51.989002" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:51.988983" elapsed="0.000280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.989411" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.989597" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.989764" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:51.988938" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.988809" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:51.989994" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:51.990076" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:54:51.990249" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:51.907705" elapsed="0.082573"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:51.991729" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:51.991234" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:52.001500" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:52.001569" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:52.001695" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:51.994289" elapsed="0.007441"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:51.991850" elapsed="0.009936"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.002036" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.001823" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:51.991831" elapsed="0.010380"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.007009" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.003693" elapsed="0.003376"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.003358" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.003333" elapsed="0.003820"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.010780" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.007560" elapsed="0.003284"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.007231" elapsed="0.003662"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.007208" elapsed="0.003719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.011749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.011176" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.012223" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.011887" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.013012" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.012591" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.012337" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.011862" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.013888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.013357" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.014394" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.014025" elapsed="0.000472"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.015176" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.014763" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.014531" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.014000" elapsed="0.001292"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.015469" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:52.016276" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.015986" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.016474" elapsed="0.002305"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:52.002785" elapsed="0.016058"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:52.018891" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:54:52.021138" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:54:51.990602" elapsed="0.030563"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:52.021220" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:54:51.883220" elapsed="0.138131"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:54:51.791781" elapsed="0.229708"/>
</test>
<test id="s1-s14-t6" name="Deconfigure_App_Peer" line="133">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:54:52.024798" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:54:52.024531" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.026058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.025949" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.025930" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.031265" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.031158" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.031140" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.032377" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.031995" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.032881" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:52.032584" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:52.032952" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:52.033108" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:52.031579" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.038616" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.038506" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.038487" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.039868" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.039760" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.039742" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:52.040391" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.040085" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.040822" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:52.040603" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.071079" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:52.041342" elapsed="0.029850"/>
</kw>
<msg time="2026-05-01T00:54:52.071374" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:52.071432" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.041007" elapsed="0.030486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.098608" level="INFO">". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:52.072032" elapsed="0.026699"/>
</kw>
<msg time="2026-05-01T00:54:52.098901" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:52.098947" level="INFO">${message_wait} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "c "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.071677" elapsed="0.027305"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.099334" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.099078" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.099050" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.099923" level="INFO"> ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.099603" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.100278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.100061" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.100043" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:52.100398" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:52.103293" elapsed="0.000521"/>
</kw>
<msg time="2026-05-01T00:54:52.103879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.101955" elapsed="0.002060"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.104300" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.104710" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.101293" elapsed="0.003605"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:52.100733" elapsed="0.004230"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:52.039432" elapsed="0.065629"/>
</kw>
<msg time="2026-05-01T00:54:52.105152" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:52.105197" level="INFO">${message} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "c "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.038838" elapsed="0.066397"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:52.105420" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-05-01T00:54:52.105312" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.105293" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.105927" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.106268" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.106342" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:52.038117" elapsed="0.068378"/>
</kw>
<msg time="2026-05-01T00:54:52.106594" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:52.106637" level="INFO">${output} =  ". "t "x "t ". "0 "4 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "o "u "t "e "[C "R "e "f ". "D "e "c "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.033523" elapsed="0.073151"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.107000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.106749" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.106732" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:52.033363" elapsed="0.073737"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:52.033187" elapsed="0.073946"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:52.030795" elapsed="0.076393"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:54:52.025660" elapsed="0.081585"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.025215" elapsed="0.082076"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:54:52.022400" elapsed="0.084946"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.108111" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.107538" elapsed="0.000602"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.150081" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.149705" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:54:52.150890" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:54:52.150646" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:54:52.151061" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:54:52.150273" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.151650" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.151250" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:54:52.152024" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:54:52.152205" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:54:52.151885" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.152652" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.152388" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.153661" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.153384" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.154128" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.153866" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.154861" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:52.154560" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:52.155830" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.155607" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:52.155909" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:54:52.156066" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:52.155074" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.156247" elapsed="0.000256"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:54:52.154381" elapsed="0.002164"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.157098" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:52.156796" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:52.157859" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.157646" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:52.157936" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:52.158088" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:52.157311" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.158267" elapsed="0.000239"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:54:52.156660" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.159114" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:52.158814" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:52.159870" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.159659" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:52.159946" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:52.160097" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:52.159326" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.160274" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:54:52.158678" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.161101" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:54:52.160804" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:54:52.161858" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.161648" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:54:52.161971" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:54:52.162127" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:54:52.161316" elapsed="0.000836"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.162305" elapsed="0.000273"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:54:52.160670" elapsed="0.001952"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:54:52.154205" elapsed="0.008453"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:54:52.162702" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:54:52.162863" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:54:52.153063" elapsed="0.009827"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.152765" elapsed="0.010158"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.163098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.162948" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.152746" elapsed="0.010429"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.163949" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.163319" elapsed="0.000659"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:54:52.164028" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:52.149075" elapsed="0.015078"/>
</kw>
<msg time="2026-05-01T00:54:52.164207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.136545" elapsed="0.027709"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.176746" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.189081" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.201329" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.201541" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.201791" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.202175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.202026" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:54:52.202011" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.202471" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.202676" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.202846" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:54:52.201981" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.201874" elapsed="0.001053"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.203074" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.203149" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:54:52.203277" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:52.132316" elapsed="0.070988"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.204428" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.204169" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:52.214084" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node09rd6f27r9cj0eaoq0r78outi23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:52.214156" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:54:52.214287" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:54:52.206858" elapsed="0.007473"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.204709" elapsed="0.009682"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.214703" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.214427" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.204691" elapsed="0.010130"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.219517" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.216212" elapsed="0.003366"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.215905" elapsed="0.003721"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.215881" elapsed="0.003780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.223250" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.220044" elapsed="0.003271"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.219738" elapsed="0.003630"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.219716" elapsed="0.003686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.224190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.223662" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.224685" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.224328" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.225443" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.225028" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.224800" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.224301" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.226362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.225852" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.226871" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.226520" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.227651" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.227211" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.226984" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.226494" elapsed="0.001275"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.227980" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:54:52.229105" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:54:52.228713" elapsed="0.000429"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.229358" elapsed="0.003035"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:54:52.215316" elapsed="0.017154"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:54:52.232518" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:54:52.234760" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:54:52.203587" elapsed="0.031201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:54:52.234841" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:54:52.108380" elapsed="0.126585"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:54:52.021817" elapsed="0.213267"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.241153" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.240830" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.242636" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:54:52.275726" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:52.275974" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:54:52.276073" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:52.276163" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:52.242422" elapsed="0.033792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.278026" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:52.277410" elapsed="0.000715"/>
</kw>
<msg time="2026-05-01T00:54:52.278332" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:52.278427" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.276655" elapsed="0.001852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.279688" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.278941" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.281151" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.280811" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.281772" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.281419" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.282365" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.282039" elapsed="0.000385"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:52.280303" elapsed="0.002217"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:52.279833" elapsed="0.002738"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.279805" elapsed="0.002800"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.282840" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.282701" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.282659" elapsed="0.000329"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:52.283191" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:54:52.283064" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.283042" elapsed="0.000268"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.283536" elapsed="0.000032"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:52.241879" elapsed="0.041823"/>
</kw>
<msg time="2026-05-01T00:54:52.283774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.241341" elapsed="0.042516"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:52.240215" elapsed="0.043747"/>
</kw>
<msg time="2026-05-01T00:54:52.284028" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.236480" elapsed="0.047622"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:52.236112" elapsed="0.048093"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:54:52.235884" elapsed="0.048389"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:54:52.284500" elapsed="0.000481"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:52.285298" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:54:52.285197" elapsed="0.000212"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:54:52.235624" elapsed="0.049889"/>
</kw>
<doc>Functional test for bgp - route refresh

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests sending and receiveing route refresh message.
It uses odl and exabgp as bgp peers.
Sending route refresh message from odl is initiated via restconf.
If route refresh is received by odl, correct advertising of routes
is verified. Receiving of route refresh by odl is verified by
checking appropriate message counter via odl-bgpcep-bgp-cli and
restconf using BGP neighbor operational state</doc>
<status status="FAIL" start="2026-05-01T00:54:03.871734" elapsed="48.413822"/>
</suite>
<suite id="s1-s15" name="020 Bgp Functional Multipath" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.376868" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:52.372405" elapsed="0.004512"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:54:52.372186" elapsed="0.004797"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.381826" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:54:52.378075" elapsed="0.003778"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:54:52.382039" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.381933" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.381911" elapsed="0.000198"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.382631" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:52.382264" elapsed="0.000409"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.383187" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:54:52.382874" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:54:52.383733" elapsed="0.000291"/>
</kw>
<msg time="2026-05-01T00:54:52.384120" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:52.384166" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.383379" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.384745" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.384357" elapsed="0.000413"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.385801" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:52.385539" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.386231" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:52.385977" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.386714" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.386414" elapsed="0.000327"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.390096" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.390837" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.390469" elapsed="0.000400"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.391024" elapsed="0.000227"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.392049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.391756" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:54:52.392122" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:54:52.392279" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.391446" elapsed="0.000857"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:52.392898" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a154990&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:54:52.392473" elapsed="0.000552"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.393188" elapsed="0.000187"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:54:52.389541" elapsed="0.003893"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:52.389324" elapsed="0.004169"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:54:52.386815" elapsed="0.006711"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.394090" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:52.393690" elapsed="0.000444"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.394713" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:52.394296" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.395319" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:52.394934" elapsed="0.000429"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:54:52.385069" elapsed="0.010351"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:54:52.377735" elapsed="0.017757"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.395718" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.395559" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.395541" elapsed="0.000247"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.398952" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.398534" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.399440" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:52.399142" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:52.399528" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:52.399686" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:52.398187" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:52.400762" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.400487" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.401534" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:52.401635" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.401366" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.405207" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.404638" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.404618" elapsed="0.000715"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.405999" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:52.406230" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.405555" elapsed="0.000728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.407302" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.406571" elapsed="0.000837"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.408609" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.407698" elapsed="0.000963"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.410400" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:54:52.410600" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:54:52.410049" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.411014" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.412658" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:54:52.732484" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:54:04 UTC 2026

  System load:  0.06               Processes:             120
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:54:04 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:54:52.412313" elapsed="0.320328"/>
</kw>
<msg time="2026-05-01T00:54:52.732730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.411867" elapsed="0.321027"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:54:52.409115" elapsed="0.323932"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.733977" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:54:52.746716" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:54:52.747085" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:54:52.747342" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:52.733443" elapsed="0.014052"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.748176" elapsed="0.001120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.751978" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.750662" elapsed="0.001658"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.752974" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.752618" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.752581" elapsed="0.000631"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:52.753664" elapsed="0.000090"/>
</return>
<status status="PASS" start="2026-05-01T00:54:52.753327" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.753302" elapsed="0.000622"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.754009" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.758879" elapsed="0.000699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.759975" elapsed="0.000398"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.760744" elapsed="0.000226"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.754698" elapsed="0.006341"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:54:52.403674" elapsed="0.357541"/>
</kw>
<msg time="2026-05-01T00:54:52.761271" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.402840" elapsed="0.358485"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:54:52.402323" elapsed="0.359084"/>
</kw>
<msg time="2026-05-01T00:54:52.761462" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.401818" elapsed="0.359692"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.764205" elapsed="0.000368"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.764739" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.765036" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.761805" elapsed="0.003380"/>
</kw>
<msg time="2026-05-01T00:54:52.765277" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:54:52.401009" elapsed="0.364293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.765755" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.765505" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:54:52.765840" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:54:52.400110" elapsed="0.365855"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:52.399929" elapsed="0.366073"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:52.399798" elapsed="0.366240"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:54:52.396012" elapsed="0.370082"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:54:52.766251" elapsed="0.000225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.780718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.780608" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.780588" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.781077" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:52.781181" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.780943" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.781636" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.781361" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.782124" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:52.781879" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:52.782929" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:54:52.782707" elapsed="0.000328">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:54:52.783142" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:54:52.783187" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.782328" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:52.783566" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:52.783326" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.783302" elapsed="0.000364"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:52.784411" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.784142" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:54:52.784503" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:54:52.784657" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.783870" elapsed="0.000819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.784842" elapsed="0.000402"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.785536" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:54:52.785635" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.785412" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.785808" elapsed="0.002444"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.788695" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:54:52.950163" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.788417" elapsed="0.161910"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.953834" elapsed="0.000367"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.954366" elapsed="0.000191"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.954709" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:52.951486" elapsed="0.003379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:52.950761" elapsed="0.004151"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:54:52.780316" elapsed="0.174649"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:54:52.767218" elapsed="0.187796"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.766822" elapsed="0.188246"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:52.766682" elapsed="0.188498"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:54:52.766533" elapsed="0.188687"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:54:52.377275" elapsed="0.578006"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.958035" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.957917" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.957895" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.963033" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.962927" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.962909" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.964096" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:52.963711" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:54:52.964593" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:54:52.964283" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:54:52.964662" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:54:52.964826" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:54:52.963332" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.970602" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.970491" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.970471" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:54:52.971980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:52.971851" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:52.971833" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:54:52.972540" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:54:52.972196" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:52.972955" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:54:52.972727" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.004089" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:54:52.973660" elapsed="0.030634"/>
</kw>
<msg time="2026-05-01T00:54:53.004496" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:54:53.004546" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.973141" elapsed="0.031444"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.067791" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "2 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "m "u "l "t "i "p "a "t "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:54:53.005513" elapsed="0.062448"/>
</kw>
<msg time="2026-05-01T00:54:53.068094" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:54:53.068140" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:53.004862" elapsed="0.063315"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.068597" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:53.068274" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.068245" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.069303" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "2 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "m "u "l "t "i "p "a "t "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:53.068936" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.069893" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:53.069650" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.069631" elapsed="0.000439"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:54:53.070109" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.072168" elapsed="0.000475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:53.072993" elapsed="0.000305"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:54:53.073676" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:54:53.071338" elapsed="0.002673"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:54:53.070427" elapsed="0.003722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:54:52.971561" elapsed="0.102692"/>
</kw>
<msg time="2026-05-01T00:54:53.074350" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:53.074396" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.970825" elapsed="0.103608"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:54:53.074808" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:54:53.074698" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.074679" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.075307" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.075700" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:54:53.075774" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:54:52.970180" elapsed="0.105706"/>
</kw>
<msg time="2026-05-01T00:54:53.075981" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:54:53.076026" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.965223" elapsed="0.110840"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.076407" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:54:53.076140" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.076123" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:54:52.965081" elapsed="0.111461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:54:52.964905" elapsed="0.111669"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:54:52.962639" elapsed="0.113992"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:54:52.955945" elapsed="0.120747"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:52.955500" elapsed="0.121237"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:54:52.371876" elapsed="0.704915"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.077294" level="INFO">${tools_system_conn_id} = 7</msg>
<var>${tools_system_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:54:53.076944" elapsed="0.000376"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.077967" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:54:53.077639" elapsed="0.000370"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.079715" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:54:53.079793" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:54:53.079408" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.080016" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.081424" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:54:53.420928" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:54:05 UTC 2026

  System load:  0.02               Processes:             106
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:54:05 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:54:53.081105" elapsed="0.339924"/>
</kw>
<msg time="2026-05-01T00:54:53.421097" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.080746" elapsed="0.340415"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:54:53.078975" elapsed="0.342279"/>
</kw>
<msg time="2026-05-01T00:54:53.421303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.078588" elapsed="0.342759"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:54:53.078207" elapsed="0.343219"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.427224" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:53.426888" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.428795" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:54:53.704387" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:53.704822" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 125ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:54:53.704930" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:53.705020" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:53.428610" elapsed="0.276462"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.707161" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:53.706544" elapsed="0.000721"/>
</kw>
<msg time="2026-05-01T00:54:53.707510" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:53.707613" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:53.705634" elapsed="0.002030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.709098" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:53.708049" elapsed="0.001110"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.711081" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 125ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:53.710731" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.711767" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:53.711376" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.712419" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:53.712039" elapsed="0.000466"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:53.709893" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:53.709346" elapsed="0.003291"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.709297" elapsed="0.003378"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:53.712902" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:53.712754" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.712731" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:53.713294" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:54:53.713163" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:53.713141" elapsed="0.000285"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:53.713656" elapsed="0.000031"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:53.428036" elapsed="0.285786"/>
</kw>
<msg time="2026-05-01T00:54:53.713902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.427411" elapsed="0.286559"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:53.426267" elapsed="0.287854"/>
</kw>
<msg time="2026-05-01T00:54:53.714198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.422362" elapsed="0.291896"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:53.422003" elapsed="0.292400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:53.723261" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:53.722934" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:53.725153" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-05-01T00:54:55.854677" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:55.855163" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attem...</msg>
<msg time="2026-05-01T00:54:55.855343" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:55.855548" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:53.724796" elapsed="2.130845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.861560" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:55.860485" elapsed="0.001344"/>
</kw>
<msg time="2026-05-01T00:54:55.862183" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:55.862425" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:55.856439" elapsed="0.006058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.863858" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:55.862768" elapsed="0.001130"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.866342" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.2
    Uninstalling pip-22.0.2:
      Successfully uninstalled pip-22.0.2
Successfully installed pip-26.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:55.865946" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.867203" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:55.866837" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.868130" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:55.867765" elapsed="0.000463"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:55.865018" elapsed="0.003304"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:55.864085" elapsed="0.004341"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:55.864056" elapsed="0.004416"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:55.868782" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:55.868532" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:55.868515" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:55.869149" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:54:55.868986" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:55.868970" elapsed="0.000349"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:55.869489" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:53.724095" elapsed="2.145582"/>
</kw>
<msg time="2026-05-01T00:54:55.869735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.723447" elapsed="2.146342"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:53.722323" elapsed="2.147547"/>
</kw>
<msg time="2026-05-01T00:54:55.869922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.717085" elapsed="2.152881"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:53.716297" elapsed="2.154042"/>
</kw>
<msg time="2026-05-01T00:54:55.870393" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.715745" elapsed="2.154693"/>
</kw>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:53.715256" elapsed="2.155274"/>
</kw>
<msg time="2026-05-01T00:54:55.870580" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:53.714643" elapsed="2.155978"/>
</kw>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:53.421698" elapsed="2.448995"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:55.878054" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:55.877592" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:55.879936" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-05-01T00:54:56.759197" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:56.759771" level="INFO">${stdout} = Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setupt...</msg>
<msg time="2026-05-01T00:54:56.759878" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:54:56.759970" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:55.879568" elapsed="0.880456"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.764875" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:54:56.763658" elapsed="0.001460"/>
</kw>
<msg time="2026-05-01T00:54:56.765442" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:54:56.765575" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:56.760730" elapsed="0.004895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.767787" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:56.766114" elapsed="0.001701"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.770245" level="INFO">Collecting setuptools==44.0.0
  Using cached setuptools-44.0.0-py2.py3-none-any.whl.metadata (3.7 kB)
Using cached setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 59.6.0
    Uninstalling setuptools-59.6.0:
      Successfully uninstalled setuptools-59.6.0
Successfully installed setuptools-44.0.0</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:56.769891" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.771120" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:56.770698" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.772039" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:56.771628" elapsed="0.000502"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:56.768966" elapsed="0.003263"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:56.768050" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:56.768020" elapsed="0.004377"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:56.772807" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:56.772614" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:56.772587" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:56.773218" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-05-01T00:54:56.773046" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:56.773024" elapsed="0.000392"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:56.773629" elapsed="0.000031"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:55.878939" elapsed="0.894880"/>
</kw>
<msg time="2026-05-01T00:54:56.773896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:55.878239" elapsed="0.895729"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:55.876971" elapsed="0.897125"/>
</kw>
<msg time="2026-05-01T00:54:56.774170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:55.872945" elapsed="0.901287"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:55.872380" elapsed="0.901973"/>
</kw>
<msg time="2026-05-01T00:54:56.774420" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:55.872000" elapsed="0.902499"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:55.871627" elapsed="0.902994"/>
</kw>
<msg time="2026-05-01T00:54:56.774680" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:55.871149" elapsed="0.903589"/>
</kw>
<arg>setuptools==44.0.0</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:55.870893" elapsed="0.903954"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:54:56.784793" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:54:56.784312" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:56.787097" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-05-01T00:54:58.359033" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:58.359733" level="INFO">${stdout} = Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to b...</msg>
<msg time="2026-05-01T00:54:58.360059" level="INFO">${stderr} =   error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        ...</msg>
<msg time="2026-05-01T00:54:58.360180" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:56.786686" elapsed="1.573552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.365822" level="INFO">Length is 1821.</msg>
<msg time="2026-05-01T00:54:58.367021" level="FAIL">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:54:58.364507" elapsed="0.003098">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-05-01T00:54:58.368032" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:54:58.368148" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:54:58.361198" elapsed="0.007014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.369975" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:54:58.368862" elapsed="0.001141"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.372602" level="INFO">Collecting exabgp==3.4.16
  Using cached exabgp-3.4.16.tar.gz (240 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:58.372125" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.373321" level="INFO">  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-ms51rgzg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:58.372986" elapsed="0.001965"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.377123" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:58.375973" elapsed="0.001315"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:54:58.371141" elapsed="0.006370"/>
</kw>
<status status="PASS" start="2026-05-01T00:54:58.370188" elapsed="0.007555"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:58.370144" elapsed="0.007876"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:54:58.378928" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:54:58.378198" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:58.378149" elapsed="0.001073"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:54:58.379686" elapsed="0.000089"/>
</return>
<status status="PASS" start="2026-05-01T00:54:58.379348" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-05-01T00:54:58.379311" elapsed="0.000717"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:54:58.380440" elapsed="0.000085"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:54:56.785894" elapsed="1.594927"/>
</kw>
<msg time="2026-05-01T00:54:58.380961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:56.785048" elapsed="1.596051"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:54:56.783542" elapsed="1.597777"/>
</kw>
<msg time="2026-05-01T00:54:58.381442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:56.778217" elapsed="1.603377"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:54:56.777504" elapsed="1.604259"/>
</kw>
<msg time="2026-05-01T00:54:58.381838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:56.776981" elapsed="1.604923"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:56.776337" elapsed="1.605696"/>
</kw>
<msg time="2026-05-01T00:54:58.382098" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:56.775845" elapsed="1.606317"/>
</kw>
<arg>exabgp==3.4.16</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:54:56.775139" elapsed="1.607141"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:54:58.383066" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19419490&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:54:58.382591" elapsed="0.001250"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.405763" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:54:58.412296" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/exa.cfg' -&gt; '/home/jenkins//exa.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${DEFAUTL_RPC_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:54:58.384702" elapsed="0.027807"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.418881" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/exabgp_files/exarpc.py' -&gt; '/home/jenkins//exarpc.py'</msg>
<arg>${EXARPCSCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:54:58.412933" elapsed="0.006032"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.426850" level="INFO">6 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
bgp-l3vpn-ipv4.cfg
exa-md5.cfg
exa.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:54:58.427034" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | bgp-l3vpn-ipv4.cfg | exa-md5.cfg | exa.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:54:58.419201" elapsed="0.007870"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.428028" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:58.440026" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.427780" elapsed="0.012336"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.440678" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:58.488228" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.440356" elapsed="0.048162"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.489533" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:58.536048" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.489060" elapsed="0.047163"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.537227" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:58.584660" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.536779" elapsed="0.047989"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.585313" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:54:58.632675" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:58.632923" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.585070" elapsed="0.047940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.634266" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:58.633542" elapsed="0.000845"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:54:58.427562" elapsed="0.206942"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.635612" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:58.680941" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.635178" elapsed="0.045905"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.681945" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:58.732700" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.681532" elapsed="0.051376"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.733844" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:58.785068" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.733389" elapsed="0.051886"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.786163" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:58.836792" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.785775" elapsed="0.051257"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.838043" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:54:58.884509" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:58.884872" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.837619" elapsed="0.047318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:58.886347" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:58.885516" elapsed="0.000983"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:54:58.634830" elapsed="0.251754"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.887639" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:58.932386" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.887225" elapsed="0.045338"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.933556" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:58.984372" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.932988" elapsed="0.051554"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:58.985266" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:59.036189" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:58.984954" elapsed="0.051448"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.037431" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:59.084250" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.036972" elapsed="0.047467"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.085265" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:54:59.132250" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:59.132524" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.084964" elapsed="0.047643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:59.133855" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.254;
      rd 1.2.3.4:1;
      label 24005;
    }
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:59.133126" elapsed="0.000842"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:54:58.886882" elapsed="0.247170"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.135146" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:59.180055" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.134741" elapsed="0.045447"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.181059" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:59.228194" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.180614" elapsed="0.047714"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.229149" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:59.276263" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.228762" elapsed="0.047642"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.277515" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:59.327526" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.276860" elapsed="0.050760"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.328089" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:54:59.376260" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:59.376532" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.327882" elapsed="0.048715"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:59.377692" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:59.376999" elapsed="0.000798"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:54:59.134362" elapsed="0.243511"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.378852" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:59.424572" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.378446" elapsed="0.046259"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.425517" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:59.472366" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.425071" elapsed="0.047462"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.473259" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:59.520318" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.472908" elapsed="0.047540"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.521218" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:54:59.572646" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.520851" elapsed="0.051972"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.573672" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-05-01T00:54:59.620801" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:59.621030" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 u...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.573230" elapsed="0.047861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:59.622323" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
    ipv4 mpls-vpn;
  }

  process exarpcserver {
    run exarpc.py --host 10.30.170.157;
    encoder json;
    receive-routes;
    neighbor-changes;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:59.621694" elapsed="0.000738"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-05-01T00:54:59.378129" elapsed="0.244413"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.623609" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:59.696237" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.623180" elapsed="0.073198"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.697195" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:59.744631" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.696802" elapsed="0.047972"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.745562" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:59.796736" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.745151" elapsed="0.051736"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.797767" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:59.848683" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.797287" elapsed="0.051530"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:54:59.849575" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:54:59.900795" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:54:59.901026" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:54:59.849193" elapsed="0.051893"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:54:59.902195" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:54:59.901577" elapsed="0.000730"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:54:59.622838" elapsed="0.279546"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:54:58.427257" elapsed="1.475230"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:54:58.384230" elapsed="1.518406"/>
</kw>
<kw name="Store_Rib_Configuration">
<kw name="Get_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.001078" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.000685" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.001970" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.001668" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.002141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.001294" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.002737" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.002332" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.003069" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.003256" level="INFO">${template} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.002928" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.003765" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.003511" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.004743" level="INFO">mapping: {'ODLIP': '10.30.170.185', 'EXAIP': '10.30.170.157', 'NPATHS': '2'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.004483" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.005216" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.004948" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.006102" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.005646" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.007124" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.006698" elapsed="0.000540"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.007539" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:55:00.007733" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.006318" elapsed="0.001441"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.007911" elapsed="0.000447"/>
</kw>
<var name="${key}">ODLIP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:00.005483" elapsed="0.002917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.009090" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.008668" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.010084" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.009675" elapsed="0.000520"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.010490" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.010673" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.009300" elapsed="0.001399"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.010851" elapsed="0.000582"/>
</kw>
<var name="${key}">EXAIP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:00.008533" elapsed="0.002968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.012177" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.011753" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.013166" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.012753" elapsed="0.000525"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.013572" elapsed="0.000060"/>
</return>
<msg time="2026-05-01T00:55:00.013781" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.012391" elapsed="0.001416"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.013961" elapsed="0.000445"/>
</kw>
<var name="${key}">NPATHS</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:55:00.011618" elapsed="0.002844"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.005291" elapsed="0.009209"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.014543" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.014705" level="INFO">${mapping_to_use} = {'ODLIP': '10.30.170.185', 'EXAIP': '10.30.170.157', 'NPATHS': '2'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:00.004193" elapsed="0.010538"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.003886" elapsed="0.010877"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.014937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.014788" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.003864" elapsed="0.011149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.015657" level="INFO">${final_text} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.015156" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.015735" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:54:59.999980" elapsed="0.015880"/>
</kw>
<msg time="2026-05-01T00:55:00.015951" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:59.986803" elapsed="0.029197"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.028816" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.041394" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.054002" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.054196" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.054371" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.054756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.054607" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.054593" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.054976" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.055143" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.055307" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.054563" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.054445" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.055548" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.055625" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.055747" level="INFO">${uri} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:54:59.937229" elapsed="0.118544"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.057000" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.056757" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.057156" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.056364" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.057511" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.057250" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.058077" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.057786" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.057593" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.057231" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.060661" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.058311" elapsed="0.002378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:00.060742" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.060898" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:00.056093" elapsed="0.004830"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.062122" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.061886" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_config/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.062278" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.061516" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:00.062524" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.062372" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.062354" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.062756" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.062925" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.062989" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.064918" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:00.061227" elapsed="0.003717"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.066291" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.066044" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.066748" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.066506" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:00.089080" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:00.093341" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib?content=config 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:55:00 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked'} 
 body=&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;&lt;peer-groups&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;internal-neighbor&lt;/peer-group-name&gt;&lt;route-reflector&gt;&lt;config&gt;&lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;&lt;/config&gt;&lt;/route-reflector&gt;&lt;timers&gt;&lt;config&gt;&lt;hold-time&gt;180.0&lt;/hold-time&gt;&lt;connect-retry&gt;10.0&lt;/connect-retry&gt;&lt;/config&gt;&lt;/timers&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;64496&lt;/peer-as&gt;&lt;/config&gt;&lt;/peer-group&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;external-neighbor&lt;/peer-group-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;65000&lt;/peer-as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/peer-group&gt;&lt;/peer-groups&gt;&lt;global&gt;&lt;apply-policy&gt;&lt;config&gt;&lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;&lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;&lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;&lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;&lt;/config&gt;&lt;/apply-policy&gt;&lt;config&gt;&lt;router-id&gt;192.0.2.2&lt;/router-id&gt;&lt;as&gt;64496&lt;/as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/global&gt;&lt;neighbors&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.1&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.5&lt;/neighbor-address&gt;&lt;config&gt;&lt;local-as&gt;65001&lt;/local-as&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.6&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;application-peers&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;/neighbors&gt;&lt;/bgp&gt;&lt;/protocol&gt; 
 </msg>
<msg time="2026-05-01T00:55:00.094193" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:00.068937" elapsed="0.025321"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.066858" elapsed="0.027496"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.094791" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.094414" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.066840" elapsed="0.028083"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.100405" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;&lt;peer-groups&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;internal-neighbor&lt;/peer-group-name&gt;&lt;route-reflector&gt;&lt;config&gt;&lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;&lt;/config&gt;&lt;/route-reflector&gt;&lt;timers&gt;&lt;config&gt;&lt;hold-time&gt;180.0&lt;/hold-time&gt;&lt;connect-retry&gt;10.0&lt;/connect-retry&gt;&lt;/config&gt;&lt;/timers&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;64496&lt;/peer-as&gt;&lt;/config&gt;&lt;/peer-group&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;external-neighbor&lt;/peer-group-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;65000&lt;/peer-as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/peer-group&gt;&lt;/peer-groups&gt;&lt;global&gt;&lt;apply-policy&gt;&lt;config&gt;&lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;&lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;&lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;&lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;&lt;/config&gt;&lt;/apply-policy&gt;&lt;config&gt;&lt;router-id&gt;192.0.2.2&lt;/router-id&gt;&lt;as&gt;64496&lt;/as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/global&gt;&lt;neighbors&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.1&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.5&lt;/neighbor-address&gt;&lt;config&gt;&lt;local-as&gt;65001&lt;/local-as&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.6&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;application-peers&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;/neighbors&gt;&lt;/bgp&gt;&lt;/protocol&gt;</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.096290" elapsed="0.004457"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.095982" elapsed="0.004819"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.095957" elapsed="0.004882"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.104013" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.101239" elapsed="0.002821"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.100920" elapsed="0.003176"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.100896" elapsed="0.003225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.104695" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.104293" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.105029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.104794" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.105584" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.105272" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.105111" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.104776" elapsed="0.001160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.106560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.106151" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.106897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.106656" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.107434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.107141" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.106979" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.106639" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.107685" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:00.108488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.108193" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.108669" elapsed="0.002350"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:00.095424" elapsed="0.015658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:00.111257" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.111152" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.111134" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.111511" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.111583" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:00.114264" level="INFO">${response_text} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:p...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:00.065253" elapsed="0.049042"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.114359" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:00.114532" level="INFO">${response_text} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:p...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:54:59.912492" elapsed="0.202068"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.114888" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.114642" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.114625" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.115063" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:00.115221" level="INFO">${rib_old} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:p...</msg>
<var>${rib_old}</var>
<arg>${MULT_VAR_FOLDER}/rib_config</arg>
<arg>mapping=${DEFAULT_MAPPING}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Get_Templated response text.
Optionally, verification against XML data (may be iterated) is called.</doc>
<status status="PASS" start="2026-05-01T00:54:59.903782" elapsed="0.211468"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.115764" level="INFO">${rib_old} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:p...</msg>
<arg>${rib_old}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:00.115421" elapsed="0.000388"/>
</kw>
<doc>Stores rib configuration</doc>
<status status="PASS" start="2026-05-01T00:54:59.902991" elapsed="0.212875"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:54:52.371586" elapsed="7.744328"/>
</kw>
<test id="s1-s15-t1" name="Reconfigure_ODL_To_Accept_Connection" line="58">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:00.119166" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:00.118890" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.120426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.120317" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.120298" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.125789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.125652" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.125634" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.126867" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.126483" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.127357" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:00.127058" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:00.127431" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:55:00.127605" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.126088" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.133217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.133109" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.133091" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.134511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.134382" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.134364" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:00.135027" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.134731" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.135428" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:00.135212" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.164949" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:00.135967" elapsed="0.029079"/>
</kw>
<msg time="2026-05-01T00:55:00.165206" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:00.165253" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.135631" elapsed="0.029657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.194837" level="INFO">". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:00.165857" elapsed="0.029156"/>
</kw>
<msg time="2026-05-01T00:55:00.195182" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:00.195228" level="INFO">${message_wait} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "R "e "c "o "n...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.165474" elapsed="0.029790"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.195617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.195352" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.195329" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.196157" level="INFO"> ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.195843" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.196530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.196297" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.196279" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:00.196647" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:00.199255" elapsed="0.000325"/>
</kw>
<msg time="2026-05-01T00:55:00.199645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.198164" elapsed="0.001618"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.200058" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.200399" elapsed="0.000095"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:00.197503" elapsed="0.003105"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:00.196942" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:00.134079" elapsed="0.066689"/>
</kw>
<msg time="2026-05-01T00:55:00.200860" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:00.200905" level="INFO">${message} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "R "e "c "o "n...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.133439" elapsed="0.067503"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:00.201126" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.201019" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.201000" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.201633" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.201988" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.202059" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:00.132772" elapsed="0.069395"/>
</kw>
<msg time="2026-05-01T00:55:00.202261" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:00.202306" level="INFO">${output} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "R "e "c "o "n...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.128003" elapsed="0.074341"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.202688" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.202419" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.202402" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:00.127859" elapsed="0.074931"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:00.127685" elapsed="0.075136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:00.125276" elapsed="0.077600"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:00.120028" elapsed="0.082950"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.119599" elapsed="0.083425"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:00.116664" elapsed="0.086414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.204020" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | BGP_RIB_OPENCONFIG=example-bgp-ri...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.203250" elapsed="0.000800"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:55:00.115980" elapsed="0.088200"/>
</test>
<test id="s1-s15-t2" name="Odl Allpaths Exa SendReceived" line="71">
<kw name="Configure_Path_Selection_And_App_Peer_And_Connect_Peer" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:00.208040" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:00.207777" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.209284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.209175" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.209157" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.214661" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.214549" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.214531" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.215742" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.215332" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.216229" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:00.215938" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:00.216300" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:00.216479" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.214959" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.222334" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.222225" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.222207" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.223706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:00.223557" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.223539" elapsed="0.000309"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:00.224399" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.223996" elapsed="0.000430"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.224876" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:00.224643" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.262517" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:00.226343" elapsed="0.036320"/>
</kw>
<msg time="2026-05-01T00:55:00.262811" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:00.262856" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.225093" elapsed="0.037798"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:00.330489" level="INFO">". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "A "l "l "p "a "t "h "s "[C "E "x "a "[C "S "e "n "d "R "e "c "e "i "v "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:00.264402" elapsed="0.066310"/>
</kw>
<msg time="2026-05-01T00:55:00.330876" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:00.330924" level="INFO">${message_wait} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.263112" elapsed="0.067847"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.331404" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.331096" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.331075" elapsed="0.000537"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.332315" level="INFO"> ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "A "l "l "p "a "t "h "s "[C "E "x "a "[C "S "e "n "d "R "e "c "e "i "v "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.331758" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.332814" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.332526" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.332506" elapsed="0.000497"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:00.333038" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:00.335499" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:55:00.335687" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.334987" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.335971" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.336187" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:00.334147" elapsed="0.002188"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:00.333302" elapsed="0.003126"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:00.223182" elapsed="0.113360"/>
</kw>
<msg time="2026-05-01T00:55:00.336636" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:00.336682" level="INFO">${message} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.222573" elapsed="0.114145"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:00.336902" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.336794" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.336776" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.337395" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.337788" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.337890" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:00.221886" elapsed="0.116114"/>
</kw>
<msg time="2026-05-01T00:55:00.338093" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:00.338137" level="INFO">${output} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.216873" elapsed="0.121299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.338577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.338248" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.338230" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:00.216730" elapsed="0.121952"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:00.216558" elapsed="0.122155"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:00.214141" elapsed="0.124626"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:00.208889" elapsed="0.129970"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:00.208465" elapsed="0.130440"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:00.205435" elapsed="0.133524"/>
</kw>
<kw name="Configure_Odl_Peer_With_Path_Selection_Mode">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.339813" level="INFO">${npaths} = 0</msg>
<var>${npaths}</var>
<arg>"${psm}"=="${ALLPATHS_SELM}"</arg>
<arg>0</arg>
<arg>${N_PATHS_VALUE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.339429" elapsed="0.000411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.340636" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | MULTIPATH=0 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>MULTIPATH=${npaths}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.340006" elapsed="0.000659"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.375216" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.374828" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.376049" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.375770" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.376216" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.375415" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.376812" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.376406" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.377140" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.377318" level="INFO">${template} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.377002" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.377767" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.377520" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.378830" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.378571" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.379296" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.379032" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.380224" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.379705" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.381575" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.381062" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.381734" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:00.381989" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.380436" elapsed="0.001580"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.382172" elapsed="0.000514"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:00.379566" elapsed="0.003162"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.383612" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.382977" elapsed="0.000703"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.385186" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.384492" elapsed="0.000739"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.385349" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.385620" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.383873" elapsed="0.001779"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.385823" elapsed="0.000523"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:55:00.382844" elapsed="0.003545"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.387194" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.386654" elapsed="0.000567"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.388347" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.387867" elapsed="0.000520"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.388524" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.388754" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.387410" elapsed="0.001369"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.388932" elapsed="0.000481"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:55:00.386520" elapsed="0.003019"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.390314" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.389792" elapsed="0.000549"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.391498" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.390983" elapsed="0.000569"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.391690" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:00.391927" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.390543" elapsed="0.001409"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.392105" elapsed="0.000495"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:55:00.389658" elapsed="0.002984"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.393397" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.392892" elapsed="0.000532"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.394659" level="INFO">${encoded} = 0</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.394165" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.394815" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.395042" level="INFO">${encoded_value} = 0</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.393687" elapsed="0.001380"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.395217" elapsed="0.000493"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">0</var>
<status status="PASS" start="2026-05-01T00:55:00.392758" elapsed="0.002994"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.396517" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.395998" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.397742" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.397172" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.397918" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.398147" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.396731" elapsed="0.001442"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.398326" elapsed="0.000490"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:00.395866" elapsed="0.002992"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.379372" elapsed="0.019523"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.398939" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:00.399136" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:00.378236" elapsed="0.020927"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.377921" elapsed="0.021273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.399370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.399220" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.377897" elapsed="0.021565"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.400103" level="INFO">${final_text} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.399610" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.400180" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.374156" elapsed="0.026149"/>
</kw>
<msg time="2026-05-01T00:55:00.400360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.361051" elapsed="0.039359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.413776" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.426583" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.439514" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.439727" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.439902" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.440269" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.440120" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.440106" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.440504" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.440671" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.440836" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.440077" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.439976" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.441103" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.441182" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.441302" level="INFO">${uri} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.356698" elapsed="0.084631"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.468256" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.467886" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.469027" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.468801" elapsed="0.000290">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.469186" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.468445" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.469773" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.469376" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.470130" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.470266" level="INFO">${template} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.469996" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.470706" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;$MULTIPATH&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.470464" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:00.471139" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.470844" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.471732" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.471415" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.471249" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.470825" elapsed="0.000992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.472690" level="INFO">${final_text} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.471963" elapsed="0.000757"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.472771" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.467256" elapsed="0.005676"/>
</kw>
<msg time="2026-05-01T00:55:00.472993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.454231" elapsed="0.018810"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.486129" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.499152" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.512023" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.512221" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.512394" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.512770" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.512627" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.512613" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.512989" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.513156" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.513319" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.512585" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.512482" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.513556" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.513646" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:00.513785" level="INFO">${data} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.451549" elapsed="0.062265"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.515138" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.514888" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.515293" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.514552" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.515655" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.515388" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.516202" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.515912" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.515737" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.515370" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.518706" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.516439" elapsed="0.002294"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:00.518785" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.518941" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:00.514209" elapsed="0.004756"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.520443" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.520142" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.520903" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;0&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.520664" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.521354" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.521113" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.521805" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.521564" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:00.522687" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:00.522492" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:00.523050" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:00.522873" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.523224" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.523842" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.523594" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:00.523928" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.524084" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:00.522075" elapsed="0.002034"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:00.539262" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '1165', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;0&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt; 
 </msg>
<msg time="2026-05-01T00:55:00.539362" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:00.539476" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:00.526503" elapsed="0.013001"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.524181" elapsed="0.015369"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.539864" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.539576" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.524163" elapsed="0.015900"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.547800" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.542257" elapsed="0.005641"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.541715" elapsed="0.006261"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.541675" elapsed="0.006360"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.552302" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.548684" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.548162" elapsed="0.004223"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.548124" elapsed="0.004286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.552971" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.552591" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.553309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.553070" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.553876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.553572" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.553392" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.553052" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.554517" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.554139" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.554851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.554615" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.555388" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.555094" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.554933" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.554597" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.555637" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:00.556424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.556147" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.556622" elapsed="0.002376"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:00.540888" elapsed="0.018173"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:00.559236" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.559130" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.559111" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.559488" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.559558" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.561897" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:00.519318" elapsed="0.042606"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.562015" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:00.562223" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:00.345598" elapsed="0.216651"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.562603" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.562350" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.562333" elapsed="0.000365"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.562732" elapsed="0.000027"/>
</return>
<arg>${MULT_VAR_FOLDER}/rib_policies</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:00.340932" elapsed="0.221926"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.598264" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.597852" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.599089" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.598812" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.599255" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.598477" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.599841" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.599445" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.600165" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.600326" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.600028" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.600764" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.600523" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.601768" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.601513" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.602267" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.601974" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.603225" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.602679" elapsed="0.000572"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.604422" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.603918" elapsed="0.000562"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.604600" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:00.604837" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.603441" elapsed="0.001421"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.605014" elapsed="0.000510"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:00.602541" elapsed="0.003025"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.606421" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.605816" elapsed="0.000647"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.607769" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.607256" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.607930" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.608160" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.606657" elapsed="0.001529"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.608341" elapsed="0.000510"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:55:00.605681" elapsed="0.003213"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.609667" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.609143" elapsed="0.000551"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.610857" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.610349" elapsed="0.000551"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.611018" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.611247" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.609883" elapsed="0.001390"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.611426" elapsed="0.000508"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:55:00.609009" elapsed="0.002966"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.612806" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.612224" elapsed="0.000609"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.613964" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.613479" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.614156" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.614387" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.613019" elapsed="0.001393"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.614657" elapsed="0.000477"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:55:00.612090" elapsed="0.003085"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.615946" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.615427" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.617101" level="INFO">${encoded} = 0</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.616615" elapsed="0.000527"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.617261" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:00.617506" level="INFO">${encoded_value} = 0</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.616158" elapsed="0.001374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.617686" elapsed="0.000644"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">0</var>
<status status="PASS" start="2026-05-01T00:55:00.615293" elapsed="0.003080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.619209" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.618707" elapsed="0.000529"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.620370" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.619883" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.620558" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.620795" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.619423" elapsed="0.001399"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.620976" elapsed="0.000496"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:00.618570" elapsed="0.002944"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.602342" elapsed="0.019210"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.621636" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.621802" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:00.601177" elapsed="0.020652"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.600882" elapsed="0.020980"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.622064" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.621888" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.600860" elapsed="0.021290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.623011" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.622296" elapsed="0.000744"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.623089" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.597216" elapsed="0.026000"/>
</kw>
<msg time="2026-05-01T00:55:00.623272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.584079" elapsed="0.039243"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.636704" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.649666" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.662479" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.662673" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.662846" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.663211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.663066" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.663052" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.663434" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.663619" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.663784" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.663023" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.662921" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.664054" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.664132" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:00.664254" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.579711" elapsed="0.084570"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.691189" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.690817" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.691945" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.691731" elapsed="0.000279">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.692103" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.691379" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.692689" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.692290" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.693013" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.693155" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.692880" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.693597" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;$MULTIPATH&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.693339" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:00.694017" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.693727" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.694602" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '0', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.694288" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.694132" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.693708" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.695535" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.694835" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.695616" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.690191" elapsed="0.005552"/>
</kw>
<msg time="2026-05-01T00:55:00.695832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.677119" elapsed="0.018763"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.708898" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.721754" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.734723" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.734918" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.735093" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.735470" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.735313" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.735298" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.735692" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.735858" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.736022" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.735270" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.735168" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.736244" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.736319" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.736461" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.674463" elapsed="0.062029"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.737745" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.737501" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.737902" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.737150" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.738317" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.738033" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.738884" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.738591" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.738399" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.738015" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.741329" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.739120" elapsed="0.002236"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:00.741409" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.741580" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:00.736825" elapsed="0.004780"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.743006" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.742754" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.743438" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;0&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.743205" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.743904" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.743661" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.744331" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.744095" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:00.745214" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:00.745023" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:00.745670" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:00.745489" elapsed="0.000207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.745845" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.746492" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.746229" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:00.746579" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.746734" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:00.744617" elapsed="0.002142"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:00.759263" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '871', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;0&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:00.759395" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:00.759570" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:00.749109" elapsed="0.010504"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.746829" elapsed="0.012850"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.759936" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.759719" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.746811" elapsed="0.013248"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.764920" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.761398" elapsed="0.003584"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.761091" elapsed="0.003941"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.761058" elapsed="0.004010"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.768765" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.765476" elapsed="0.003353"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.765149" elapsed="0.003729"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.765125" elapsed="0.003787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.769685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.769142" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.770177" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.769823" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.770963" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.770549" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.770299" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.769799" elapsed="0.001283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.771844" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.771312" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.772302" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.771980" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.773076" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.772672" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.772415" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.771955" elapsed="0.001236"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.773422" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:00.774637" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.774204" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.774838" elapsed="0.002349"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:00.760585" elapsed="0.016664"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:00.777437" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.777316" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.777297" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.777704" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.777776" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.780133" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:00.741934" elapsed="0.038227"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.780260" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:00.780418" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:00.568673" elapsed="0.211771"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.780799" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.780558" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.780541" elapsed="0.000350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.780924" elapsed="0.000026"/>
</return>
<arg>${MULT_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:00.563119" elapsed="0.217929"/>
</kw>
<arg>${odl_path_sel_mode}</arg>
<doc>Configures odl peer with path selection mode</doc>
<status status="PASS" start="2026-05-01T00:55:00.339099" elapsed="0.442010"/>
</kw>
<kw name="Configure_App_Peer_With_Routes">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.781869" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.781579" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.782766" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.185 | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>APP_PEER_ID=${ODL_SYSTEM_IP}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.782055" elapsed="0.000747"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.817501" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.817101" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.818319" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.818035" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.818510" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.817700" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.819092" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.818706" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.819422" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.819597" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.819284" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.820032" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.819791" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.821063" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.820799" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.821550" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.821269" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.822533" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.821945" elapsed="0.000615"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.823826" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.823285" elapsed="0.000584"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.823988" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:00.824226" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.822831" elapsed="0.001422"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.824416" elapsed="0.000517"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:55:00.821809" elapsed="0.003167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.825784" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.825225" elapsed="0.000586"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.827328" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.826653" elapsed="0.000718"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.827521" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.827755" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.826146" elapsed="0.001636"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.827937" elapsed="0.000483"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:55:00.825091" elapsed="0.003387"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.829240" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.828733" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.830429" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.829916" elapsed="0.000569"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.830614" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:00.830852" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.829472" elapsed="0.001408"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.831056" elapsed="0.000536"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:00.828595" elapsed="0.003040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.832611" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.832053" elapsed="0.000585"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.833863" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.833282" elapsed="0.000622"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.834018" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.834296" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.832837" elapsed="0.001485"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.834489" elapsed="0.000484"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:00.831750" elapsed="0.003264"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.835784" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.835264" elapsed="0.000547"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.836934" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.836436" elapsed="0.000539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.837089" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:00.837318" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.835996" elapsed="0.001348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.837673" elapsed="0.000491"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:00.835130" elapsed="0.003095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.839005" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:00.838498" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:00.840218" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.839728" elapsed="0.000532"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:00.840379" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:00.840639" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:00.839260" elapsed="0.001405"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.840819" elapsed="0.000486"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:00.838347" elapsed="0.003001"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.821627" elapsed="0.019757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:00.841429" elapsed="0.000059"/>
</return>
<msg time="2026-05-01T00:55:00.841627" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:00.820468" elapsed="0.021185"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.820151" elapsed="0.021537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.841866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.841716" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.820130" elapsed="0.021813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.842784" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.842086" elapsed="0.000727"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.842863" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.816466" elapsed="0.026524"/>
</kw>
<msg time="2026-05-01T00:55:00.843045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.803180" elapsed="0.039914"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.856483" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.869344" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.882200" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.882424" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.882617" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.883023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.882842" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.882828" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.883249" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.883420" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.883607" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.882797" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.882693" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.883837" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.883914" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:00.884046" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.798773" elapsed="0.085301"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.911149" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.910774" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.911903" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.911693" elapsed="0.000275">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.912062" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.911341" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.912650" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.912250" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.912973" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:00.913099" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:00.912840" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.913538" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.913283" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:00.913942" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.913653" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.914516" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.914172" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.914025" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.913635" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.915367" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.914746" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:00.915497" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:00.910124" elapsed="0.005504"/>
</kw>
<msg time="2026-05-01T00:55:00.915682" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.897058" elapsed="0.018672"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.928746" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.941532" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.954416" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.954622" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.954795" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.955156" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.955013" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:00.954999" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.955376" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.955558" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.955725" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:00.954970" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.954868" elapsed="0.000936"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.955949" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.956025" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:00.956245" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:00.894367" elapsed="0.061909"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:00.957611" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.957352" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:00.957782" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:00.957011" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.958123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.957878" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.958728" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.958399" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.958203" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.957860" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.961194" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:00.958973" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:00.961272" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:00.961427" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:00.956669" elapsed="0.004797"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.962880" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.962633" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.963315" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.963079" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.963775" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.963531" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.964207" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.963969" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:00.965058" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:00.964869" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:00.965410" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:00.965238" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.965600" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.966199" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.965955" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:00.966943" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:00.967107" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:00.964464" elapsed="0.002668"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:00.979097" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:00.979228" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:00.979571" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:00.969499" elapsed="0.010138"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.967204" elapsed="0.012538"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.980164" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.979805" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.967186" elapsed="0.013181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.986058" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.982652" elapsed="0.003467"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.982069" elapsed="0.004100"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.982028" elapsed="0.004177"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.989923" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:00.986635" elapsed="0.003354"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.986284" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.986262" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.990853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.990348" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.991192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.990953" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.991799" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.991439" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.991275" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.990935" elapsed="0.000960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.992441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.992067" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.992805" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:00.992559" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:00.993355" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:00.993056" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:00.992891" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.992541" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:00.993609" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:00.994477" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:00.994138" elapsed="0.000369"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:00.994669" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:00.981230" elapsed="0.015896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:00.997304" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:55:00.997194" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:00.997176" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:00.997624" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:00.997716" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:01.000149" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:00.961794" elapsed="0.038383"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.000245" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:01.000407" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:00.787591" elapsed="0.212841"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.000863" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.000599" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.000580" elapsed="0.000377"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.000991" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:00.783072" elapsed="0.218045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.002085" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.1 | LOCALPREF=100 | PATHID=1 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.001487" elapsed="0.000626"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.036934" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.036559" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.037826" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.037468" elapsed="0.000433">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.037996" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.037123" elapsed="0.000897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.038699" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.038185" elapsed="0.000542"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.039034" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.039186" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.038892" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.039641" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.039371" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.040865" level="INFO">mapping: {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.040378" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.041465" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.041070" elapsed="0.000422"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.042603" level="INFO">${value} = 100.100.100.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.041875" elapsed="0.000772"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.044400" level="INFO">${encoded} = 100.100.100.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.043966" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.044535" elapsed="0.000079"/>
</return>
<msg time="2026-05-01T00:55:01.044887" level="INFO">${encoded_value} = 100.100.100.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.043130" elapsed="0.001798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.045158" elapsed="0.000535"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.1</var>
<status status="PASS" start="2026-05-01T00:55:01.041708" elapsed="0.004090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.047004" level="INFO">${value} = 100</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.046147" elapsed="0.000916"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.049922" level="INFO">${encoded} = 100</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.049292" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.050087" elapsed="0.000107"/>
</return>
<msg time="2026-05-01T00:55:01.050698" level="INFO">${encoded_value} = 100</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.048126" elapsed="0.002647"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.051095" elapsed="0.000661"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">100</var>
<status status="PASS" start="2026-05-01T00:55:01.045973" elapsed="0.005889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.052840" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.052157" elapsed="0.000728"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.054684" level="INFO">${encoded} = 1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.054188" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.054825" elapsed="0.000078"/>
</return>
<msg time="2026-05-01T00:55:01.055175" level="INFO">${encoded_value} = 1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.053367" elapsed="0.001850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.055554" elapsed="0.000518"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-05-01T00:55:01.051986" elapsed="0.004187"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.057166" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.056500" elapsed="0.000709"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.058987" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.058556" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.059106" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T00:55:01.059542" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.057709" elapsed="0.001879"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.059821" elapsed="0.000513"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:01.056310" elapsed="0.004125"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.041538" elapsed="0.018952"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.060536" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:01.060699" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:01.040056" elapsed="0.020669"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.039759" elapsed="0.021001"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.060938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.060786" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.039740" elapsed="0.021278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.061836" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.061162" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.061917" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.035933" elapsed="0.026111"/>
</kw>
<msg time="2026-05-01T00:55:01.062099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.022649" elapsed="0.039501"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.075347" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.091068" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.105000" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.105197" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.105372" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.105758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.105612" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.105597" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.105981" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.106149" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.106317" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.105567" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.105460" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.106594" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.106672" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:01.106792" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.018259" elapsed="0.088560"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.132030" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.131652" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.132865" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.132571" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.133027" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.132221" elapsed="0.000831"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.133674" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.133249" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.134002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.134138" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.133866" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.134625" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.134325" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:01.135051" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.134753" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.135604" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.135286" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.135138" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.134734" elapsed="0.000959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.136502" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.135843" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.136588" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.131018" elapsed="0.005701"/>
</kw>
<msg time="2026-05-01T00:55:01.136777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.117932" elapsed="0.018895"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.150059" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.165439" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.178242" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.178506" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.178684" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.179048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.178904" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.178890" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.179268" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.179436" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.179619" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.178861" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.178759" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.179847" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.179923" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:01.180047" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.117067" elapsed="0.063009"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.181336" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.181089" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.181509" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.180750" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.181851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.181605" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.182395" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.182107" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.181931" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.181586" elapsed="0.001074"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.185022" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.182816" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:01.185098" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:01.185252" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:01.180409" elapsed="0.004867"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.186840" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.186591" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.187277" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.1&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.187039" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.187826" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.187581" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.188264" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.188023" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:01.189124" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:01.188928" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:01.189515" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:01.189300" elapsed="0.000244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.189694" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.190291" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.190046" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:01.190377" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:01.190581" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:01.188526" elapsed="0.002080"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:01.202187" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.1&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:01.202274" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,1', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:01.202417" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:01.192961" elapsed="0.009542"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.190678" elapsed="0.011905"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.202853" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.202621" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.190660" elapsed="0.012316"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.207966" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.204410" elapsed="0.003620"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.204104" elapsed="0.003977"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.204079" elapsed="0.004038"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.211879" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.208533" elapsed="0.003411"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.208198" elapsed="0.003796"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.208174" elapsed="0.003855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.212825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.212270" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.213295" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.212961" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.214082" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.213664" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.213411" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.212936" elapsed="0.001326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.215046" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.214527" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.215532" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.215181" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.216305" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.215881" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.215648" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.215157" elapsed="0.001268"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.216656" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:01.217793" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.217376" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.218045" elapsed="0.003355"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:01.203492" elapsed="0.018017"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:01.221769" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:55:01.221615" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.221589" elapsed="0.000307"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.222105" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.222199" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:55:01.224745" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:01.185617" elapsed="0.039155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.224843" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:01.224996" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:01.007039" elapsed="0.217982"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.225366" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.225125" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.225108" elapsed="0.000366"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.225509" elapsed="0.000027"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:01.002398" elapsed="0.223236"/>
</kw>
<var name="${pathid}">1</var>
<status status="PASS" start="2026-05-01T00:55:01.001323" elapsed="0.224351"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.226535" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.2 | LOCALPREF=200 | PATHID=2 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.225919" elapsed="0.000645"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.261192" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.260821" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.262201" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.261865" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.262368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.261519" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.263023" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.262630" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.263350" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.263514" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.263214" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.263944" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.263701" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.265180" level="INFO">mapping: {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.264689" elapsed="0.000537"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.265788" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.265386" elapsed="0.000428"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.267027" level="INFO">${value} = 100.100.100.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.266204" elapsed="0.000867"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.268839" level="INFO">${encoded} = 100.100.100.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.268389" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.268957" elapsed="0.000076"/>
</return>
<msg time="2026-05-01T00:55:01.269307" level="INFO">${encoded_value} = 100.100.100.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.267589" elapsed="0.001759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.269598" elapsed="0.000524"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.2</var>
<status status="PASS" start="2026-05-01T00:55:01.266037" elapsed="0.004190"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.271268" level="INFO">${value} = 200</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.270595" elapsed="0.000715"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.273379" level="INFO">${encoded} = 200</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.272951" elapsed="0.000465"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.273510" elapsed="0.000078"/>
</return>
<msg time="2026-05-01T00:55:01.273855" level="INFO">${encoded_value} = 200</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.271842" elapsed="0.002054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.274123" elapsed="0.000578"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">200</var>
<status status="PASS" start="2026-05-01T00:55:01.270346" elapsed="0.004459"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.275855" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.275092" elapsed="0.000824"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.278409" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.277824" elapsed="0.000656"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.278614" elapsed="0.000111"/>
</return>
<msg time="2026-05-01T00:55:01.279101" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.276706" elapsed="0.002451"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.279509" elapsed="0.000791"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:55:01.274926" elapsed="0.005517"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.281936" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.280995" elapsed="0.001000"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.284303" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.283875" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.284419" elapsed="0.000210"/>
</return>
<msg time="2026-05-01T00:55:01.284911" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.282723" elapsed="0.002229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.285188" elapsed="0.000547"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:01.280757" elapsed="0.005084"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.265864" elapsed="0.020017"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.285927" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:01.286093" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:01.264349" elapsed="0.021772"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.264056" elapsed="0.022098"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.286335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.286179" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.264037" elapsed="0.022376"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.287230" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.286614" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.287310" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.260198" elapsed="0.027241"/>
</kw>
<msg time="2026-05-01T00:55:01.287528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.247081" elapsed="0.040500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.300889" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.313767" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.326728" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.326922" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.327133" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.327516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.327356" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.327342" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.327737" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.327903" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.328068" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.327312" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.327209" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.328291" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.328366" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:01.328499" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.242777" elapsed="0.085750"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.353915" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.353543" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.354767" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.354437" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.354927" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.354104" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.355532" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.355114" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.355865" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.355998" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.355726" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.356430" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.356185" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:01.356868" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.356575" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.357465" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.357151" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.357001" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.356556" elapsed="0.000997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.358337" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.357699" elapsed="0.000670"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.358420" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.352917" elapsed="0.005697"/>
</kw>
<msg time="2026-05-01T00:55:01.358679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.339808" elapsed="0.018922"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.371946" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.386768" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.399727" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.399927" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.400110" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.400506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.400346" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.400330" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.400726" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.400895" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.401059" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.400295" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.400184" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.401281" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.401390" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:01.401539" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.338942" elapsed="0.062634"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.402839" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.402583" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.402995" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.402231" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.403334" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.403090" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.403890" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.403600" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.403415" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.403071" elapsed="0.000902"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.406336" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.404123" elapsed="0.002239"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:01.406414" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:01.406584" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:01.401909" elapsed="0.004729"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.408152" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.407907" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.408606" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.2&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;200&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.408351" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.409051" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.408811" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.409493" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.409241" elapsed="0.000295"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:01.410351" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:01.410148" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:01.410751" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:01.410553" elapsed="0.000223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.410925" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.411558" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.411287" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:01.411644" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:01.411800" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:01.409737" elapsed="0.002129"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:01.429423" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.2&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;200&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:01.429636" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,2', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:01.429857" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:01.414364" elapsed="0.015550"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.411941" elapsed="0.018080"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.430431" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.430081" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.411923" elapsed="0.018791"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.437648" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.433101" elapsed="0.004618"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.432598" elapsed="0.005173"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.432557" elapsed="0.005249"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.441511" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.438194" elapsed="0.003381"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.437885" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.437861" elapsed="0.003798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.442441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.441898" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.442992" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.442602" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.443770" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.443334" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.443107" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.442576" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.444374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.444014" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.444739" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.444498" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.445282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.444980" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.444820" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.444479" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.445580" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:01.446392" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.446103" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.446664" elapsed="0.002389"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:01.431578" elapsed="0.017539"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:01.449299" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:55:01.449190" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.449172" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.449561" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.449631" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:01.452014" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:01.406965" elapsed="0.045076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.452112" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:01.452268" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:01.231503" elapsed="0.220790"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.452655" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.452398" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.452381" elapsed="0.000372"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.452786" elapsed="0.000026"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:01.226825" elapsed="0.226084"/>
</kw>
<var name="${pathid}">2</var>
<status status="PASS" start="2026-05-01T00:55:01.225776" elapsed="0.227173"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.453794" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.3 | LOCALPREF=300 | PATHID=3 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.453193" elapsed="0.000629"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.488939" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.488567" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.489799" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.489471" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.489990" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.489127" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.490613" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.490187" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.490977" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.491117" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.490840" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.491599" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.491334" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.492819" level="INFO">mapping: {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.492328" elapsed="0.000537"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.493436" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.493042" elapsed="0.000437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.494572" level="INFO">${value} = 100.100.100.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.493880" elapsed="0.000737"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.496379" level="INFO">${encoded} = 100.100.100.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.495951" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.496515" elapsed="0.000079"/>
</return>
<msg time="2026-05-01T00:55:01.496868" level="INFO">${encoded_value} = 100.100.100.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.495140" elapsed="0.001771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.497145" elapsed="0.000533"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.3</var>
<status status="PASS" start="2026-05-01T00:55:01.493707" elapsed="0.004075"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.498832" level="INFO">${value} = 300</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.498074" elapsed="0.000804"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.500791" level="INFO">${encoded} = 300</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.500345" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.500912" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T00:55:01.501262" level="INFO">${encoded_value} = 300</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.499363" elapsed="0.001942"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.501555" elapsed="0.000512"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">300</var>
<status status="PASS" start="2026-05-01T00:55:01.497904" elapsed="0.004264"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.503199" level="INFO">${value} = 3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.502477" elapsed="0.000765"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.505040" level="INFO">${encoded} = 3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.504621" elapsed="0.000455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.505156" elapsed="0.000074"/>
</return>
<msg time="2026-05-01T00:55:01.505512" level="INFO">${encoded_value} = 3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.503833" elapsed="0.001722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.505785" elapsed="0.000503"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">3</var>
<status status="PASS" start="2026-05-01T00:55:01.502289" elapsed="0.004097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.507396" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:01.506741" elapsed="0.000698"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:01.509238" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.508821" elapsed="0.000453"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:01.509352" elapsed="0.000076"/>
</return>
<msg time="2026-05-01T00:55:01.509730" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:01.508032" elapsed="0.001740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.510001" elapsed="0.000608"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:01.506535" elapsed="0.004225"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.493530" elapsed="0.017272"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:01.510847" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:01.511050" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:01.492007" elapsed="0.019069"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.491714" elapsed="0.019395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.511288" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.511135" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.491695" elapsed="0.019671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.512130" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.511526" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.512210" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.487940" elapsed="0.024397"/>
</kw>
<msg time="2026-05-01T00:55:01.512392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.474481" elapsed="0.037960"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.525575" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.538571" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.551378" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.551587" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.551762" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.552125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.551982" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.551968" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.552342" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.552525" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.552691" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.551938" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.551837" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.552913" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.553024" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:01.553144" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.470092" elapsed="0.083078"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.578516" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.578124" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.579389" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.579085" elapsed="0.000395">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.579585" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.578740" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.580162" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.579775" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.580502" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:01.580652" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:01.580351" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.581096" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.580850" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:01.581533" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.581219" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.582061" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.581765" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.581618" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.581200" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.582984" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.582292" elapsed="0.000724"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.583067" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:01.577501" elapsed="0.005694"/>
</kw>
<msg time="2026-05-01T00:55:01.583329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.564330" elapsed="0.019058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.596523" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.609289" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.622140" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.622361" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.622572" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.623014" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.622863" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:01.622848" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.623238" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.623406" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.623588" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:01.622814" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.622657" elapsed="0.001010"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.623816" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.623893" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:01.624030" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:01.563485" elapsed="0.060573"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:01.625359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:01.625107" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:01.625535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:01.624755" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.625925" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.625673" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.626503" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.626185" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.626006" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.625654" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.628982" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:01.626764" elapsed="0.002245"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:01.629060" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:01.629217" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:01.624405" elapsed="0.004837"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.630830" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.630545" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.631270" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.3&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;300&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.631031" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.631734" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.631488" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.632166" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.631927" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:01.633030" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:01.632835" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:01.633383" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:01.633208" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.633574" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.634181" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.633936" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:01.634267" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:01.634423" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:01.632412" elapsed="0.002050"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:01.646971" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.3&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;300&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:01.647034" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,3', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:01.647177" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:01.637939" elapsed="0.009264"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.634536" elapsed="0.012712"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.647427" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.647274" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.634518" elapsed="0.013040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.655418" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.649807" elapsed="0.005740"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.649277" elapsed="0.006351"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.649236" elapsed="0.006448"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.658286" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.655966" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.655745" elapsed="0.002622"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.655728" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.658981" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.658573" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.659314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.659078" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.659916" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.659608" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.659396" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.659060" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.660541" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.660163" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.660872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.660637" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.661409" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:01.661114" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:01.660953" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.660620" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:01.661659" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:01.662463" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:01.662165" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:01.662644" elapsed="0.002381"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:01.648226" elapsed="0.016861"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:01.665264" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:01.665159" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.665141" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.665514" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:01.665583" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:01.667961" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:01.629589" elapsed="0.038399"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.668057" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:01.668209" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:01.458754" elapsed="0.209513"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:01.668627" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:01.668374" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:01.668356" elapsed="0.000363"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:01.668752" elapsed="0.000026"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:01.454086" elapsed="0.214788"/>
</kw>
<var name="${pathid}">3</var>
<status status="PASS" start="2026-05-01T00:55:01.453047" elapsed="0.215866"/>
</iter>
<var>${pathid}</var>
<value>@{PATH_ID_LIST}</value>
<status status="PASS" start="2026-05-01T00:55:01.001176" elapsed="0.667768"/>
</for>
<doc>Configure bgp application peer and fill it immediately with routes.</doc>
<status status="PASS" start="2026-05-01T00:55:00.781278" elapsed="0.887719"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.675513" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/exa.cfg' -&gt; '/home/jenkins//exa.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${DEFAUTL_RPC_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:55:01.669575" elapsed="0.005998"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.681026" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/exabgp_files/exarpc.py' -&gt; '/home/jenkins//exarpc.py'</msg>
<arg>${EXARPCSCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:55:01.675746" elapsed="0.005364"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.688910" level="INFO">6 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
bgp-l3vpn-ipv4.cfg
exa-md5.cfg
exa.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:55:01.689075" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | bgp-l3vpn-ipv4.cfg | exa-md5.cfg | exa.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:55:01.681341" elapsed="0.007770"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.689907" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:01.702047" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.689656" elapsed="0.012522"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.703014" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:01.752211" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.702600" elapsed="0.049740"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.753064" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:01.800158" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.752750" elapsed="0.047541"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.801077" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:01.848579" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.800706" elapsed="0.048020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.849483" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:01.896427" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:01.896717" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.849126" elapsed="0.047654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:01.897851" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:01.897203" elapsed="0.000760"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:55:01.689420" elapsed="0.208619"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.899075" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:01.944437" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.898652" elapsed="0.045998"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.945638" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:01.997293" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.945196" elapsed="0.052270"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:01.998153" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:02.052611" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:01.997872" elapsed="0.054925"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.053512" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:02.109222" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.053168" elapsed="0.056249"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.110136" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:02.159949" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:02.160197" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.109824" elapsed="0.050413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:02.161199" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:02.160685" elapsed="0.000594"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:55:01.898307" elapsed="0.263022"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.162073" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:02.242727" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.161828" elapsed="0.081063"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.244063" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:02.288701" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.243540" elapsed="0.045351"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.289695" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:02.336260" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.289319" elapsed="0.047092"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.337305" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:02.383754" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.336872" elapsed="0.046958"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.384208" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:02.437238" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:02.437589" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.384045" elapsed="0.053619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:02.439005" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.254;
      rd 1.2.3.4:1;
      label 24005;
    }
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:02.438198" elapsed="0.000923"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:55:02.161597" elapsed="0.277611"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.440362" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:02.484030" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.439924" elapsed="0.044236"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.484714" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:02.536935" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.484440" elapsed="0.052649"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.537625" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:02.588959" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.537371" elapsed="0.051687"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.589609" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:02.637145" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.589365" elapsed="0.047913"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.637894" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:02.688030" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:02.688231" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.637630" elapsed="0.050641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:02.689094" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:02.688642" elapsed="0.000520"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:55:02.439563" elapsed="0.249649"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.689902" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:02.735660" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.689642" elapsed="0.046136"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.736634" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:02.784223" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.736154" elapsed="0.048183"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.784881" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:02.833044" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.784645" elapsed="0.048566"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.833957" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:02.880285" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.833612" elapsed="0.046815"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.881208" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-05-01T00:55:02.928359" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:02.928627" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    i...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.880876" elapsed="0.047813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:02.929807" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    ipv4 unicast;
    ipv4 mpls-vpn;
  }

  process exarpcserver {
    run exarpc.py --host 10.30.170.157;
    encoder json;
    receive-routes;
    neighbor-changes;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:02.929136" elapsed="0.000778"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-05-01T00:55:02.689404" elapsed="0.240588"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.931027" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:02.976887" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.930640" elapsed="0.046401"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:02.977936" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:03.024840" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:02.977492" elapsed="0.047485"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.025732" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:03.076570" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:03.025371" elapsed="0.051344"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.077522" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:03.124690" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:03.077094" elapsed="0.047739"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.125588" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:03.172528" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:03.172756" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:03.125218" elapsed="0.047597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.173961" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:03.173246" elapsed="0.000947"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:55:02.930287" elapsed="0.243988"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:55:01.689190" elapsed="1.485160"/>
</for>
<arg>addpath=${exa_add_path_value}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:55:01.669189" elapsed="1.505337"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.182219" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:03.181890" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.182663" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:03.182404" elapsed="0.000303"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.209424" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:03.183309" elapsed="0.026189"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.214268" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:03.214362" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:03.209665" elapsed="0.004723"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.215005" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:03.214758" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:03.214485" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:03.214443" elapsed="0.000668"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:03.182950" elapsed="0.032209"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:03.216859" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:03.216948" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:03.215310" elapsed="0.001663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.217380" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:03.217133" elapsed="0.000291"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:03.181296" elapsed="0.036201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.219387" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:03.219039" elapsed="0.000374"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.221622" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:03.219591" elapsed="0.002058"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:03.226814" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:03.226989" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:03.227121" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:03.221816" elapsed="0.005341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.231048" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:03.227390" elapsed="0.003726"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:03.234993" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:03.231334" elapsed="0.003759">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:03.218574" elapsed="0.016674">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:06.238315" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:06.237407" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:06.243027" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:06.239009" elapsed="0.004062"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:06.249305" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:06.249549" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:06.249713" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:06.243325" elapsed="0.006430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:06.254109" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:06.250041" elapsed="0.004142"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:06.258336" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:06.254427" elapsed="0.004014">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:06.236111" elapsed="0.022527">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.262114" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:09.261080" elapsed="0.001104"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.267338" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:09.262630" elapsed="0.004786"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:09.274817" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:09.275021" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:09.275168" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:09.267980" elapsed="0.007223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.278092" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.275448" elapsed="0.002693"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.281672" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:09.278300" elapsed="0.003477">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:09.259534" elapsed="0.022410">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:09.282073" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:03.218064" elapsed="6.064139">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:09.282370" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:09.282431" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:03.217663" elapsed="6.064820"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.283704" level="INFO">[?2004l00:55:03 | 3375   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:03 | 3375   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:03 | 3375   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:03 | 3375   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:03 | 3375   | [01;34minstallation [0m | [1m        [0m
00:55:03 | 3375   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:03 | 3375   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:03 | 3375   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:03 | 3375   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:03 | 3375   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:03 | 3375   | configuration[0m | . local-as         | '64496'[0m
00:55:03 | 3375   | configuration[0m | . peer-as          | '64496'[0m
00:55:03 | 3375   | configuration[0m | &gt; capability       | [0m
00:55:03 | 3375   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:03 | 3375   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:03 | 3375   | configuration[0m | &lt; capability       | [0m
00:55:03 | 3375   | configuration[0m | &gt; family           | [0m
00:55:03 | 3375   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:03 | 3375   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:03 | 3375   | configuration[0m | &lt; family           | [0m
00:55:03 | 3375   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1m        [0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1m        [0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:09.284036" level="INFO">${output} = [?2004l00:55:03 | 3375   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:03 | 3375   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:03 | 3375   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:09.283527" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.284740" level="INFO">[?2004l00:55:03 | 3375   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:03 | 3375   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:03 | 3375   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:03 | 3375   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:03 | 3375   | [01;34minstallation [0m | [1m        [0m
00:55:03 | 3375   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:03 | 3375   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:03 | 3375   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:03 | 3375   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:03 | 3375   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:03 | 3375   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:03 | 3375   | configuration[0m | . local-as         | '64496'[0m
00:55:03 | 3375   | configuration[0m | . peer-as          | '64496'[0m
00:55:03 | 3375   | configuration[0m | &gt; capability       | [0m
00:55:03 | 3375   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:03 | 3375   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:03 | 3375   | configuration[0m | &lt; capability       | [0m
00:55:03 | 3375   | configuration[0m | &gt; family           | [0m
00:55:03 | 3375   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:03 | 3375   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:03 | 3375   | configuration[0m | &lt; family           | [0m
00:55:03 | 3375   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1m        [0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1m        [0m
00:55:03 | 3375   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.284299" elapsed="0.000597"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.286029" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:09.285586" elapsed="0.000482"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:09.286304" elapsed="0.000386"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:09.285178" elapsed="0.001596"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.289219" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:09.289353" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:09.286999" elapsed="0.002394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.289989" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.289635" elapsed="0.000422"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.292090" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:09.291002" elapsed="0.001146"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.293171" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:09.293261" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:09.292331" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.293885" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.293637" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:09.293362" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:09.293341" elapsed="0.000660"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:09.290419" elapsed="0.003630"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:09.283072" elapsed="0.011029"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:09.282633" elapsed="0.011494"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:09.282596" elapsed="0.011554"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:09.294323" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:09.294206" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:09.294190" elapsed="0.000246"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:55:03.180850" elapsed="6.113629"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.295588" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:09.295205" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.296012" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.295772" elapsed="0.000284"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.298072" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:09.296725" elapsed="0.001402"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.302366" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:09.302477" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:09.298285" elapsed="0.004221"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.303105" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.302848" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:09.302578" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:09.302558" elapsed="0.000687"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:09.296300" elapsed="0.006998"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:09.304906" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:09.305015" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:09.303469" elapsed="0.001576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.305485" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.305219" elapsed="0.000314"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:09.294877" elapsed="0.010711"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.307854" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:09.307500" elapsed="0.000381"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.310100" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:09.308045" elapsed="0.002081"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:09.314249" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:09.314389" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:09.314506" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:09.310290" elapsed="0.004245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.317233" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:09.314703" elapsed="0.002595"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:09.320115" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:09.317483" elapsed="0.002707">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:09.306734" elapsed="0.013569">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:12.323367" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:12.322447" elapsed="0.000989"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:12.328534" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:12.323877" elapsed="0.004725"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:12.334260" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:12.334440" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:12.334604" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:12.329098" elapsed="0.005543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:12.338343" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:12.334880" elapsed="0.003532"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:12.342260" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:12.338650" elapsed="0.003710">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:12.321156" elapsed="0.021383">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.345684" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:15.344703" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.351929" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:15.346276" elapsed="0.005721"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:15.358196" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:15.358339" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:15.358469" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:15.352404" elapsed="0.006101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.361180" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.358686" elapsed="0.002564"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.364209" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:15.361492" elapsed="0.002809">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:15.343373" elapsed="0.021055">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:15.364542" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:09.306154" elapsed="6.058481">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:15.364760" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:15.364821" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:09.305755" elapsed="6.059093"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.365929" level="INFO">[?2004l00:55:09 | 3379   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:09 | 3379   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:09 | 3379   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:09 | 3379   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:09 | 3379   | [01;34minstallation [0m | [1m        [0m
00:55:09 | 3379   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:09 | 3379   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:09 | 3379   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:09 | 3379   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:09 | 3379   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:09 | 3379   | configuration[0m | . local-as         | '64496'[0m
00:55:09 | 3379   | configuration[0m | . peer-as          | '64496'[0m
00:55:09 | 3379   | configuration[0m | &gt; capability       | [0m
00:55:09 | 3379   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:09 | 3379   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:09 | 3379   | configuration[0m | &lt; capability       | [0m
00:55:09 | 3379   | configuration[0m | &gt; family           | [0m
00:55:09 | 3379   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:09 | 3379   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:09 | 3379   | configuration[0m | &lt; family           | [0m
00:55:09 | 3379   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1m        [0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1m        [0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:15.366155" level="INFO">${output} = [?2004l00:55:09 | 3379   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:09 | 3379   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:09 | 3379   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:15.365791" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.366833" level="INFO">[?2004l00:55:09 | 3379   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:09 | 3379   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:09 | 3379   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:09 | 3379   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:09 | 3379   | [01;34minstallation [0m | [1m        [0m
00:55:09 | 3379   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:09 | 3379   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:09 | 3379   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:09 | 3379   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:09 | 3379   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:09 | 3379   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:09 | 3379   | configuration[0m | . local-as         | '64496'[0m
00:55:09 | 3379   | configuration[0m | . peer-as          | '64496'[0m
00:55:09 | 3379   | configuration[0m | &gt; capability       | [0m
00:55:09 | 3379   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:09 | 3379   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:09 | 3379   | configuration[0m | &lt; capability       | [0m
00:55:09 | 3379   | configuration[0m | &gt; family           | [0m
00:55:09 | 3379   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:09 | 3379   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:09 | 3379   | configuration[0m | &lt; family           | [0m
00:55:09 | 3379   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1m        [0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1m        [0m
00:55:09 | 3379   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.366426" elapsed="0.000573"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.368192" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:15.367729" elapsed="0.000504"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:15.368478" elapsed="0.000370"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:15.367302" elapsed="0.001646"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.372279" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:15.372415" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:15.369171" elapsed="0.003302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.373068" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.372706" elapsed="0.000433"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.375372" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:15.374132" elapsed="0.001295"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.376519" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:15.376605" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:15.375603" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.377214" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.376953" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:15.376704" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:15.376682" elapsed="0.000639"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:15.373594" elapsed="0.003773"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:15.365338" elapsed="0.012079"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:15.364959" elapsed="0.012484"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:15.364932" elapsed="0.012552"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:15.377656" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:15.377541" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:15.377524" elapsed="0.000239"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-05-01T00:55:09.294676" elapsed="6.083115"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.378845" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:15.378519" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.379268" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.379028" elapsed="0.000284"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.381557" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:15.380007" elapsed="0.001610"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.386639" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:15.386734" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:15.381781" elapsed="0.004980"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.387368" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.387113" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:15.386839" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:15.386816" elapsed="0.000677"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:15.379607" elapsed="0.007935"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:15.389056" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:15.389162" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:15.387694" elapsed="0.001495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.389675" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.389350" elapsed="0.000373"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:15.378172" elapsed="0.011624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.392203" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:15.391808" elapsed="0.000423"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.394680" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:15.392405" elapsed="0.002305"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:15.399232" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:15.399404" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:15.399540" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:15.394877" elapsed="0.004691"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.402366" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:15.399769" elapsed="0.002647"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:15.405297" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:15.402603" elapsed="0.002773">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:15.391289" elapsed="0.014229">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:18.408576" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:18.407652" elapsed="0.000994"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:18.413940" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:18.409027" elapsed="0.004979"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:18.420905" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:18.421043" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:18.421140" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:18.414563" elapsed="0.006604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:18.423839" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:18.421339" elapsed="0.002549"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:18.426660" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:18.424046" elapsed="0.002689">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:18.406320" elapsed="0.020535">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.429883" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.428989" elapsed="0.000963"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.435403" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:21.430332" elapsed="0.005165"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:21.441225" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.441365" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:21.441491" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:21.435868" elapsed="0.005652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.444166" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.441688" elapsed="0.002529"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.446955" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.444374" elapsed="0.002652">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:21.427761" elapsed="0.019376">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:21.447227" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:15.390413" elapsed="6.056940">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:21.447487" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:21.447533" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:15.389986" elapsed="6.057571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.448339" level="INFO">[?2004l00:55:15 | 3383   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:15 | 3383   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:15 | 3383   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:15 | 3383   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:15 | 3383   | [01;34minstallation [0m | [1m        [0m
00:55:15 | 3383   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:15 | 3383   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:15 | 3383   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:15 | 3383   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:15 | 3383   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:15 | 3383   | configuration[0m | . local-as         | '64496'[0m
00:55:15 | 3383   | configuration[0m | . peer-as          | '64496'[0m
00:55:15 | 3383   | configuration[0m | &gt; capability       | [0m
00:55:15 | 3383   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:15 | 3383   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:15 | 3383   | configuration[0m | &lt; capability       | [0m
00:55:15 | 3383   | configuration[0m | &gt; family           | [0m
00:55:15 | 3383   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:15 | 3383   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:15 | 3383   | configuration[0m | &lt; family           | [0m
00:55:15 | 3383   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1m        [0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1m        [0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:21.448624" level="INFO">${output} = [?2004l00:55:15 | 3383   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:15 | 3383   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:15 | 3383   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:21.448213" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.449230" level="INFO">[?2004l00:55:15 | 3383   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:15 | 3383   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:15 | 3383   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:15 | 3383   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:15 | 3383   | [01;34minstallation [0m | [1m        [0m
00:55:15 | 3383   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:15 | 3383   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:15 | 3383   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:15 | 3383   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:15 | 3383   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:15 | 3383   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:15 | 3383   | configuration[0m | . local-as         | '64496'[0m
00:55:15 | 3383   | configuration[0m | . peer-as          | '64496'[0m
00:55:15 | 3383   | configuration[0m | &gt; capability       | [0m
00:55:15 | 3383   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:15 | 3383   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:15 | 3383   | configuration[0m | &lt; capability       | [0m
00:55:15 | 3383   | configuration[0m | &gt; family           | [0m
00:55:15 | 3383   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:15 | 3383   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:15 | 3383   | configuration[0m | &lt; family           | [0m
00:55:15 | 3383   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1m        [0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1m        [0m
00:55:15 | 3383   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.448880" elapsed="0.000506"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.450523" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.450071" elapsed="0.000492"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:21.450775" elapsed="0.000316"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:21.449691" elapsed="0.001495"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.453665" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:21.453792" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:21.451417" elapsed="0.002414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.454387" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.454047" elapsed="0.000426"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.456367" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:21.455359" elapsed="0.001084"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.457833" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:21.457951" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:21.456703" elapsed="0.001285"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.458781" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.458418" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.458080" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.458054" elapsed="0.000874"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:21.454836" elapsed="0.004155"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:21.447938" elapsed="0.011122"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.447659" elapsed="0.011438"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.447634" elapsed="0.011494"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:21.459399" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.459203" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.459181" elapsed="0.000344"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-05-01T00:55:15.377978" elapsed="6.081575"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:55:03.180319" elapsed="18.279269"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.460026" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.459748" elapsed="0.000338">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${DEFAUTL_RPC_CFG}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:55:03.175278" elapsed="18.284909">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${ALLPATHS_SELM}</arg>
<arg>${ADDPATHCAP_SR}</arg>
<doc>Setup test case keyword. Early after the path selection config the incomming connection
from exabgp towards odl may be rejected by odl due to config process not finished yet. Because of that
we try to start the tool 3 times in case early attempts fail.</doc>
<status status="FAIL" start="2026-05-01T00:55:00.204989" elapsed="21.255296">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Remove_Odl_And_App_Peer_Configuration_And_Stop_ExaBgp" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.461495" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.461017" elapsed="0.000507"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.506985" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.506606" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.507874" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.507572" elapsed="0.000383">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:21.508065" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:21.507218" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.508654" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:21.508253" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.508975" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:21.509137" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:21.508841" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.509580" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.509316" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.510606" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.510335" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.511062" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.510806" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.511769" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.511478" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.512556" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.512324" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.512631" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:21.512787" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.511982" elapsed="0.000829"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.512964" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:21.511326" elapsed="0.001924"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.513860" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.513561" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.514787" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.514416" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.514863" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:21.515016" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.514073" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.515203" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:21.513409" elapsed="0.002075"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.511154" elapsed="0.004366"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.515564" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:21.515722" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:21.509990" elapsed="0.005757"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.509694" elapsed="0.006083"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.515950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.515802" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.509674" elapsed="0.006354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.516761" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.516169" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.516838" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:21.505947" elapsed="0.011026"/>
</kw>
<msg time="2026-05-01T00:55:21.517027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.492795" elapsed="0.024291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.530031" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.542953" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.555788" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.555982" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.556156" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.556583" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.556419" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:21.556405" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.556804" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.556972" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.557138" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:21.556375" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.556269" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.557362" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.557437" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:21.557576" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:21.488091" elapsed="0.069512"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.558727" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.558476" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:21.568602" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.568671" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.568797" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:21.560939" elapsed="0.007894"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.558839" elapsed="0.010048"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.569131" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.568922" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.558821" elapsed="0.010424"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.574513" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.570691" elapsed="0.003883"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.570365" elapsed="0.004259"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.570341" elapsed="0.004318"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.578329" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.575072" elapsed="0.003322"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.574735" elapsed="0.003708"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.574713" elapsed="0.003785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.579300" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.578737" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.579694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.579436" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.580273" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.579977" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.579808" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.579412" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.580890" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.580534" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.581218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.580986" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.581773" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.581479" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.581299" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.580968" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.582005" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:21.582845" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.582560" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.583059" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:21.569768" elapsed="0.015780"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:21.585597" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:21.588059" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:21.557868" elapsed="0.030227"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.588165" elapsed="0.000035"/>
</return>
<arg>${MULT_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:21.461750" elapsed="0.126572"/>
</kw>
<kw name="Deconfigure_App_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.589350" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.588984" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.590187" level="INFO">&amp;{route_mapping} = { APP_RIB=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{route_mapping}</var>
<arg>APP_RIB=${app_rib}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.589626" elapsed="0.000595"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.637544" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.637140" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.638352" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.638084" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:21.638542" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:21.637750" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.639151" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:21.638733" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.639497" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:21.639660" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:21.639340" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.640142" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.639899" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.641216" level="INFO">mapping: {'APP_RIB': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.640960" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.641711" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.641423" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.642396" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.642097" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.643511" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.643002" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.643592" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:21.643754" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.642627" elapsed="0.001153"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.643933" elapsed="0.000236"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:21.641961" elapsed="0.002249"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.644784" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.644481" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.645795" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.645340" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.645872" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:21.646025" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.644997" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.646203" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:21.644326" elapsed="0.002154"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.641786" elapsed="0.004731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.646561" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:55:21.646717" level="INFO">${mapping_to_use} = {'APP_RIB': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:21.640591" elapsed="0.006165"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.640265" elapsed="0.006525"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.646966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.646816" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.640242" elapsed="0.006802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.647779" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.647187" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.647857" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:21.636489" elapsed="0.011493"/>
</kw>
<msg time="2026-05-01T00:55:21.648037" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.621700" elapsed="0.026398"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.661242" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.674215" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.687135" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.687328" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.687518" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.687883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.687738" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:21.687724" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.688103" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.688271" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.688443" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:21.687695" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.687594" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.688683" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.688759" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:21.688878" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:21.617176" elapsed="0.071727"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.690018" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.689771" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:21.699005" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.699092" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.699278" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:21.692250" elapsed="0.007077"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.690131" elapsed="0.009272"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.699690" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.699446" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.690113" elapsed="0.009737"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.704886" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.701280" elapsed="0.003668"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.700975" elapsed="0.004021"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.700950" elapsed="0.004081"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.708376" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.705417" elapsed="0.003005"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.705109" elapsed="0.003362"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.705086" elapsed="0.003411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.709053" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.708673" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.709390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.709153" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.709958" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.709657" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.709488" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.709134" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.710803" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.710204" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.711249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.710984" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.711837" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.711517" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.711331" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.710962" elapsed="0.000959"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.712076" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:21.712882" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.712600" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.713061" elapsed="0.002530"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:21.700347" elapsed="0.015308"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:21.715701" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:21.718065" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:21.689162" elapsed="0.028929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.718145" elapsed="0.000028"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:21.590758" elapsed="0.127511"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.719064" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.718436" elapsed="0.000657"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.763196" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.762821" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.763994" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.763741" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:21.764208" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:21.763387" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.764799" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:21.764395" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:21.765123" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:21.765278" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:21.764988" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.765725" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.765480" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.766766" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.766509" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.767230" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.766970" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.767938" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.767635" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.768962" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.768508" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.769039" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:21.769191" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.768150" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.769367" elapsed="0.000256"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:55:21.767498" elapsed="0.002165"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.770362" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.769911" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.771401" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.770961" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.771496" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:21.771650" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.770615" elapsed="0.001059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.771826" elapsed="0.000221"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:55:21.769778" elapsed="0.002309"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.772648" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.772333" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.773705" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.773246" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.773781" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:21.773932" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.772859" elapsed="0.001098"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.774107" elapsed="0.000219"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:21.772199" elapsed="0.002166"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.775023" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:21.774724" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.776032" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.775597" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:21.776109" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:21.776262" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:21.775236" elapsed="0.001051"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.776438" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:21.774588" elapsed="0.002129"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.767304" elapsed="0.009449"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:21.776795" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:21.776952" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:21.766132" elapsed="0.010846"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.765839" elapsed="0.011171"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.777184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.777036" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.765820" elapsed="0.011440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.778022" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.777404" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.778098" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:21.762126" elapsed="0.016097"/>
</kw>
<msg time="2026-05-01T00:55:21.778277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.748689" elapsed="0.029649"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.791542" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.804876" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.817904" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.818108" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.818290" elapsed="0.000046"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.818781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.818629" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:21.818613" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.819013" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.819181" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.819347" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:21.818580" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.818466" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.819592" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.819671" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:21.819807" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:21.744282" elapsed="0.075552"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.820998" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.820730" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:21.834069" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.834119" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:21.834211" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:21.823256" elapsed="0.010981"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.821114" elapsed="0.013201"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.834650" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.834343" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.821096" elapsed="0.013748"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.842855" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.837166" elapsed="0.005786"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.836673" elapsed="0.006357"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.836634" elapsed="0.006453"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.846000" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.843572" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.843210" elapsed="0.002871"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.843173" elapsed="0.002933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.846726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.846310" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.847061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.846824" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.847667" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.847350" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.847180" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.846806" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.848270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.847912" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.848616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.848366" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.849150" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.848856" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.848696" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.848348" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.849383" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:21.850207" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.849916" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.850419" elapsed="0.002494"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:21.835674" elapsed="0.017303"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:21.853024" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:21.855411" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:21.820099" elapsed="0.035339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:21.855507" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:21.719326" elapsed="0.136307"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:55:21.588563" elapsed="0.267132"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.856392" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:21.856218" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.856839" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.856592" elapsed="0.000292"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.857703" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.857384" elapsed="0.000346"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:21.857882" elapsed="0.000252"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:21.857088" elapsed="0.001107"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.860632" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:21.860723" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:21.858363" elapsed="0.002387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.861149" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.860906" elapsed="0.000289"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.862855" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:21.861850" elapsed="0.001061"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.949372" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:21.949520" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:21.863072" elapsed="0.086478"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.950251" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.949915" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.949637" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.949612" elapsed="0.000805"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:21.861443" elapsed="0.089040"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:21.855917" elapsed="0.094621"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:21.951754" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:21.951340" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.951322" elapsed="0.000519"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:21.951992" elapsed="0.000322"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.957661" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.957225" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:21.957911" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.957766" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.957747" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.958521" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:21.958185" elapsed="0.000363"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:21.958973" level="INFO">${reference} = bgpcep_userfeatures_txt_020_Bgp_Functional_Multipath_Odl_Allpaths_Exa_SendReceived</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.958709" elapsed="0.000291"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-01T00:55:21.959339" level="INFO">${reference} = bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-01T00:55:21.959163" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.959881" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.959535" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.960372" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:21.960065" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.961031" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived&amp;order=bug_status"

Setup failed:
Unable to connect ExaBgp to ODL</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-05-01T00:55:21.960574" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.961549" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:21.961238" elapsed="0.000358"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:55:21.956910" elapsed="0.004742"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.951124" elapsed="0.010578"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:55:21.950736" elapsed="0.011007"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:21.460560" elapsed="0.501229"/>
</kw>
<doc>all-paths selected policy selected</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:55:00.204561" elapsed="21.757282">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_allpaths_exa_sendreceived&amp;order=bug_status"

Setup failed:
Unable to connect ExaBgp to ODL</status>
</test>
<test id="s1-s15-t3" name="Odl Npaths Exa SendReceived" line="81">
<kw name="Configure_Path_Selection_And_App_Peer_And_Connect_Peer" type="SETUP">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:21.965656" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:21.965375" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.967002" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.966890" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.966871" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.972219" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.972112" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.972093" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.973313" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:21.972927" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:21.973821" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:21.973523" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:21.973892" elapsed="0.000073"/>
</return>
<msg time="2026-05-01T00:55:21.974123" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:21.972532" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.980037" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.979928" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.979909" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:21.981428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:21.981278" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:21.981260" elapsed="0.000341"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:21.982172" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:21.981751" elapsed="0.000448"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:21.982660" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:21.982401" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:22.015413" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:21.984121" elapsed="0.031487"/>
</kw>
<msg time="2026-05-01T00:55:22.015780" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:22.015826" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:21.982877" elapsed="0.032986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:22.051428" level="INFO">". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "N "p "a "t "h "s "[C "E "x "a "[C "S "e "n "d "R "e "c "e "i "v "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:22.017404" elapsed="0.034208"/>
</kw>
<msg time="2026-05-01T00:55:22.051762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:22.051808" level="INFO">${message_wait} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:22.016111" elapsed="0.035734"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.052301" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.051986" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.051960" elapsed="0.000569"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.053246" level="INFO"> ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "N "p "a "t "h "s "[C "E "x "a "[C "S "e "n "d "R "e "c "e "i "v "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.052684" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.053781" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.053446" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.053427" elapsed="0.000643"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:22.054110" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:22.056772" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:55:22.056968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.056189" elapsed="0.000848"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.057254" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.057511" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:22.055307" elapsed="0.002370"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:22.054424" elapsed="0.003397"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:21.980921" elapsed="0.077023"/>
</kw>
<msg time="2026-05-01T00:55:22.058051" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:22.058097" level="INFO">${message} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:21.980264" elapsed="0.077871"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:22.058323" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:55:22.058214" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.058195" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.058880" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.059259" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.059332" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:21.979581" elapsed="0.079862"/>
</kw>
<msg time="2026-05-01T00:55:22.059556" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:22.059600" level="INFO">${output} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "O "d "l "[C "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:21.974572" elapsed="0.085067"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.059966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.059714" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.059697" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:21.974400" elapsed="0.085667"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:21.974212" elapsed="0.085887"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:21.971749" elapsed="0.088406"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:21.966595" elapsed="0.093618"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:21.966131" elapsed="0.094128"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:21.963168" elapsed="0.097146"/>
</kw>
<kw name="Configure_Odl_Peer_With_Path_Selection_Mode">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.061217" level="INFO">${npaths} = 2</msg>
<var>${npaths}</var>
<arg>"${psm}"=="${ALLPATHS_SELM}"</arg>
<arg>0</arg>
<arg>${N_PATHS_VALUE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.060821" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.062209" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=true | MULTIPATH=2 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>MULTIPATH=${npaths}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.061412" elapsed="0.000825"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.098739" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.098322" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.099559" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.099280" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.099735" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.098940" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.100309" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.099926" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.100656" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.100824" level="INFO">${template} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.100514" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.101254" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.101009" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.102366" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.102100" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.102857" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.102590" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.103854" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.103255" elapsed="0.000625"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.105036" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.104536" elapsed="0.000542"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.105198" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:22.105432" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.104070" elapsed="0.001403"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.105670" elapsed="0.000512"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:22.103117" elapsed="0.003107"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.106997" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.106491" elapsed="0.000532"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.108343" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.107852" elapsed="0.000532"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.108529" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.108761" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.107212" elapsed="0.001575"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.108943" elapsed="0.000483"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:55:22.106340" elapsed="0.003143"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.110325" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.109783" elapsed="0.000569"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.111567" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.111050" elapsed="0.000558"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.111724" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:22.111955" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.110560" elapsed="0.001420"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.112132" elapsed="0.000553"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:55:22.109601" elapsed="0.003128"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.113537" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.112981" elapsed="0.000583"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.114911" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.114259" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.115068" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:22.115297" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.113798" elapsed="0.001525"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.115504" elapsed="0.000481"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:55:22.112845" elapsed="0.003182"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.116891" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.116277" elapsed="0.000641"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.118106" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.117559" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.118262" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.118510" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.117105" elapsed="0.001430"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.118688" elapsed="0.000479"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:55:22.116142" elapsed="0.003066"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.119987" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.119483" elapsed="0.000530"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.121214" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.120735" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.121371" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.121639" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.120200" elapsed="0.001471"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.121860" elapsed="0.000496"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:22.119323" elapsed="0.003075"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.102933" elapsed="0.019501"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.122496" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:22.122658" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:22.101750" elapsed="0.020934"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.101375" elapsed="0.021340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.122891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.122741" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.101354" elapsed="0.021615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.123630" level="INFO">${final_text} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.123112" elapsed="0.000548"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.123707" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.097620" elapsed="0.026212"/>
</kw>
<msg time="2026-05-01T00:55:22.123923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.082969" elapsed="0.041005"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.137716" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.150687" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.163690" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.163888" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.164064" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.164435" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.164289" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.164274" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.164678" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.164845" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.165010" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.164244" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.164139" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.165232" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.165309" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:22.165443" level="INFO">${uri} = /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.078516" elapsed="0.086998"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.192928" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.192542" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.193817" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.193577" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.194040" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.193176" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.194786" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.194286" elapsed="0.000535"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.195144" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.195303" level="INFO">${template} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.195001" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.195752" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;$MULTIPATH&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.195506" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:22.196189" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.195886" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.196733" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.196419" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.196273" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.195866" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.197783" level="INFO">${final_text} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.196966" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.197866" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.191913" elapsed="0.006085"/>
</kw>
<msg time="2026-05-01T00:55:22.198059" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.178692" elapsed="0.019417"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.211367" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.224549" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.237596" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.237815" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.238002" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.238394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.238246" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.238230" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.238634" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.238803" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.238968" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.238196" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.238084" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.239193" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.239271" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:22.239430" level="INFO">${data} = &lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.175883" elapsed="0.063594"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.240844" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.240564" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/rib_policies/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.241012" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.240163" elapsed="0.000873"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.241400" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.241107" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.241995" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.241701" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.241514" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.241089" elapsed="0.000990"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.244462" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.242231" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:22.244591" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:22.244752" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_policies/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:22.239816" elapsed="0.004961"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.246247" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.245996" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.246699" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;2&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.246459" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.247152" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.246911" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.247605" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.247344" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:22.248444" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:22.248249" elapsed="0.000237"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:22.248923" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:22.248750" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.249098" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.249823" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.249558" elapsed="0.000309"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:22.249910" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:22.250067" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:22.247850" elapsed="0.002241"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:22.263433" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '1165', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;
    &lt;name&gt;example-bgp-rib&lt;/name&gt;
    &lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;
    &lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
        &lt;global&gt;
            &lt;config&gt;
                &lt;router-id&gt;192.0.2.2&lt;/router-id&gt;
                &lt;as&gt;64496&lt;/as&gt;
            &lt;/config&gt;
            &lt;apply-policy&gt;
                &lt;config&gt;
                    &lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;
                    &lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;
                    &lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;
                    &lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;
                &lt;/config&gt;
            &lt;/apply-policy&gt;
            &lt;afi-safis&gt;
                &lt;afi-safi&gt;
                    &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
                    &lt;receive&gt;true&lt;/receive&gt;
                    &lt;send-max&gt;2&lt;/send-max&gt;
                &lt;/afi-safi&gt;
            &lt;/afi-safis&gt;
        &lt;/global&gt;
    &lt;/bgp&gt;
&lt;/protocol&gt; 
 </msg>
<msg time="2026-05-01T00:55:22.263558" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:22.263700" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:22.253890" elapsed="0.009846"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.250162" elapsed="0.013685"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.264107" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.263887" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.250144" elapsed="0.014087"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.269140" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.265672" elapsed="0.003528"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.265287" elapsed="0.003963"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.265241" elapsed="0.004073"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.273058" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.269786" elapsed="0.003335"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.269416" elapsed="0.003753"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.269383" elapsed="0.003820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.274076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.273525" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.274572" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.274213" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.275124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.274823" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.274658" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.274188" elapsed="0.001020"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.275752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.275369" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.276085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.275849" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.276640" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.276328" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.276165" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.275830" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.276874" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:22.277758" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.277437" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.277941" elapsed="0.002345"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:22.264765" elapsed="0.015585"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:22.280540" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:55:22.280417" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.280398" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.280782" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.280851" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:22.283214" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:22.245107" elapsed="0.038134"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.283306" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:22.283478" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:22.067280" elapsed="0.216224"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.283899" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.283645" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.283626" elapsed="0.000366"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.284026" elapsed="0.000026"/>
</return>
<arg>${MULT_VAR_FOLDER}/rib_policies</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:22.062561" elapsed="0.221588"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.319475" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.319073" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.320273" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.320014" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.320461" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.319674" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.321047" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.320655" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.321484" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.321654" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.321300" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.322087" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.321842" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.323114" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.322856" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.323608" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.323322" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.324605" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.324011" elapsed="0.000620"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.325859" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.325328" elapsed="0.000573"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.326019" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:22.326258" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.324823" elapsed="0.001462"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.326442" elapsed="0.000515"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:22.323873" elapsed="0.003125"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.327785" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.327253" elapsed="0.000558"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.328966" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.328444" elapsed="0.000609"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.329208" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:55:22.329503" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.327997" elapsed="0.001534"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.329689" elapsed="0.000481"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:55:22.327117" elapsed="0.003096"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.331176" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.330479" elapsed="0.000724"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.332344" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.331855" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.332535" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:22.332767" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.331393" elapsed="0.001399"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.332946" elapsed="0.000659"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:55:22.330329" elapsed="0.003319"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.334414" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.333913" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.335588" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.335083" elapsed="0.000546"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.335743" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:22.335974" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.334643" elapsed="0.001357"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.336152" elapsed="0.000509"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:55:22.333767" elapsed="0.002937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.337635" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.336954" elapsed="0.000707"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.338800" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.338297" elapsed="0.000545"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.338957" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:22.339188" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.337852" elapsed="0.001361"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.339367" elapsed="0.000500"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:55:22.336819" elapsed="0.003090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.340692" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.340158" elapsed="0.000561"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.342042" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.341412" elapsed="0.000671"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.342198" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.342426" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.340926" elapsed="0.001541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.342623" elapsed="0.000475"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:22.340023" elapsed="0.003117"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.323688" elapsed="0.019487"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.343218" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:22.343380" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:22.322532" elapsed="0.020874"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.322206" elapsed="0.021295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.343686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.343530" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.322184" elapsed="0.021580"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.344600" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.343910" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.344678" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.318434" elapsed="0.026378"/>
</kw>
<msg time="2026-05-01T00:55:22.344868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.304985" elapsed="0.039933"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.358773" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.371965" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.385043" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.385272" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.385467" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.385858" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.385697" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.385681" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.386079" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.386247" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.386412" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.385651" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.385545" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.386656" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.386732" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:22.386906" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.300400" elapsed="0.086533"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.414519" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.414116" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.415270" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.415042" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.415432" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.414710" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.416024" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.415639" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.416347" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.416504" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.416212" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.416975" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;$PEER_PORT&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;$MULTIPATH&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.416693" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:22.417408" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.417116" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.417949" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'true', 'MULTIPATH': '2', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.417655" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.417507" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.417096" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.418895" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.418179" elapsed="0.000747"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.418977" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.413503" elapsed="0.005601"/>
</kw>
<msg time="2026-05-01T00:55:22.419193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.400129" elapsed="0.019115"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.432547" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.445709" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.458803" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.459020" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.459218" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.459632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.459482" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.459464" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.459855" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.460022" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.460186" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.459416" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.459307" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.460410" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.460503" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:22.460646" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.397439" elapsed="0.063237"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.462076" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.461808" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.462242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.461425" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.462666" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.462392" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.463234" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.462935" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.462749" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.462373" elapsed="0.000945"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.465806" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.463487" elapsed="0.002345"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:22.465887" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:55:22.466096" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:22.461064" elapsed="0.005057"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.467693" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.467417" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.468132" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;2&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.467896" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.468633" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.468341" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.469119" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.468868" elapsed="0.000295"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:22.470013" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:22.469816" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:22.470384" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:22.470209" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.470580" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.471205" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.470957" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:22.471291" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:22.471461" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:22.469367" elapsed="0.002123"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:22.483751" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '871', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;17900&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
             &lt;receive&gt;true&lt;/receive&gt;
             &lt;send-max&gt;2&lt;/send-max&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:22.483855" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:22.483950" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:22.473982" elapsed="0.009999"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.471562" elapsed="0.012468"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.484213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.484057" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.471544" elapsed="0.012757"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.490820" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.485323" elapsed="0.005595"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.485097" elapsed="0.005901"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.485078" elapsed="0.005978"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.497240" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.491718" elapsed="0.005625"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.491182" elapsed="0.006242"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.491145" elapsed="0.006366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.498089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.497697" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.498425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.498187" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.498990" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.498690" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.498524" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.498169" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.499622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.499238" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.499960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.499721" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.500516" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.500205" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.500042" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.499703" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.500774" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:22.501600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.501298" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.501783" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:22.484686" elapsed="0.019532"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:22.504393" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:22.504287" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.504268" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.504650" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.504718" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:22.507140" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:22.466475" elapsed="0.040692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.507269" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:22.507432" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:22.288894" elapsed="0.218578"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.507819" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.507576" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.507558" elapsed="0.000353"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.507944" elapsed="0.000027"/>
</return>
<arg>${MULT_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:22.284409" elapsed="0.223661"/>
</kw>
<arg>${odl_path_sel_mode}</arg>
<doc>Configures odl peer with path selection mode</doc>
<status status="PASS" start="2026-05-01T00:55:22.060485" elapsed="0.447649"/>
</kw>
<kw name="Configure_App_Peer_With_Routes">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.509000" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.508624" elapsed="0.000407"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.509870" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.185 | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>APP_PEER_ID=${ODL_SYSTEM_IP}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.509198" elapsed="0.000701"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.544844" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.544374" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.545671" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.545400" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.545840" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.545061" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.546419" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.546036" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.546760" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.546913" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.546623" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.547338" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.547097" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.548348" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.548092" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.548881" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.548568" elapsed="0.000345"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.549870" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.549283" elapsed="0.000613"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.551113" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.550611" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.551276" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:22.551529" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.550145" elapsed="0.001410"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.551711" elapsed="0.000496"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:55:22.549146" elapsed="0.003104"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.553072" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.552517" elapsed="0.000581"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.554408" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.553921" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.554594" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.554827" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.553441" elapsed="0.001411"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.555006" elapsed="0.000506"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:55:22.552367" elapsed="0.003188"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.556306" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.555803" elapsed="0.000530"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.557609" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.557081" elapsed="0.000571"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.557770" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:22.558000" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.556535" elapsed="0.001492"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.558183" elapsed="0.000586"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:22.555669" elapsed="0.003143"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.559581" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.559063" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.560770" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.560237" elapsed="0.000582"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.560948" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:22.561179" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.559795" elapsed="0.001409"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.561358" elapsed="0.000514"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:22.558927" elapsed="0.002987"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.562779" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.562173" elapsed="0.000633"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.563930" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.563433" elapsed="0.000538"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.564085" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:22.564315" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.562993" elapsed="0.001347"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.564508" elapsed="0.000565"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:22.562029" elapsed="0.003087"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.566058" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.565368" elapsed="0.000717"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.567344" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.566864" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.567540" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.567771" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.566312" elapsed="0.001485"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.567950" elapsed="0.000476"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:22.565231" elapsed="0.003259"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.548964" elapsed="0.019562"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.568570" elapsed="0.000062"/>
</return>
<msg time="2026-05-01T00:55:22.568783" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:22.547773" elapsed="0.021036"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.547470" elapsed="0.021371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.569017" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.568867" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.547434" elapsed="0.021660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.569937" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.569237" elapsed="0.000728"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.570014" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.543746" elapsed="0.026392"/>
</kw>
<msg time="2026-05-01T00:55:22.570192" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.530316" elapsed="0.039925"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.583791" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.596971" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.610217" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.610444" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.610644" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.611126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.610904" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.610886" elapsed="0.000326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.611360" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.611544" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.611713" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.610846" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.610727" elapsed="0.001069"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.611945" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.612023" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:22.612180" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.526009" elapsed="0.086201"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.640297" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.639851" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.641219" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.640956" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.641392" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.640598" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.642003" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.641604" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.642340" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.642539" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.642196" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.643003" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.642732" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:22.643521" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.643136" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.644092" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.643780" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.643628" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.643112" elapsed="0.001066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.645049" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.644328" elapsed="0.000821"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.645205" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.639101" elapsed="0.006244"/>
</kw>
<msg time="2026-05-01T00:55:22.645402" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.625503" elapsed="0.019964"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.658719" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.671888" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.685222" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.685429" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.685630" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.686019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.685872" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.685857" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.686242" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.686410" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.686595" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.685824" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.685711" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.686824" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.686901" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:22.687035" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.622672" elapsed="0.064392"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.688545" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.688186" elapsed="0.000444">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.688741" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.687819" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.689095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.688841" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.689671" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.689359" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.689177" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.688822" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.692129" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.689905" elapsed="0.002250"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:22.692206" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:22.692400" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:22.687472" elapsed="0.004959"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.693873" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.693624" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.694306" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.694071" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.694761" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.694519" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.695186" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.694952" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:22.696049" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:22.695850" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:22.696464" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:22.696229" elapsed="0.000268"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.696658" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.697272" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.697025" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:22.697358" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:22.697536" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:22.695429" elapsed="0.002132"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:22.709305" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:22.709365" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:22.709599" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:22.699921" elapsed="0.009738"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.697632" elapsed="0.012127"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.710168" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.709819" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.697615" elapsed="0.012750"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.718232" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.712648" elapsed="0.005681"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.712011" elapsed="0.006404"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.711971" elapsed="0.006553"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.722839" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.719158" elapsed="0.003728"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.718661" elapsed="0.004259"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.718623" elapsed="0.004321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.723630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.723143" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.723969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.723731" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.724581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.724214" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.724049" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.723712" elapsed="0.000956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.725193" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.724828" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.725537" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.725289" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.726074" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.725781" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.725619" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.725271" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.726307" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:22.727125" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.726837" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.727303" elapsed="0.002406"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:22.711187" elapsed="0.018585"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:22.729946" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:55:22.729839" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.729820" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.730188" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.730255" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:22.732657" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:22.692814" elapsed="0.039871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.732752" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:22.732910" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:22.514784" elapsed="0.218151"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.733320" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.733076" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.733058" elapsed="0.000356"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.733463" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:22.510171" elapsed="0.223421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.734548" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.1 | LOCALPREF=100 | PATHID=1 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.733942" elapsed="0.000635"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.769737" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.769346" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.770636" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.770258" elapsed="0.000452">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.770804" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.769929" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.771372" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.770993" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.771713" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.771864" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.771575" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.772330" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.772046" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.773589" level="INFO">mapping: {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.773102" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.774182" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.773796" elapsed="0.000412"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.775264" level="INFO">${value} = 100.100.100.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.774627" elapsed="0.000678"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.777090" level="INFO">${encoded} = 100.100.100.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.776666" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.777202" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T00:55:22.777562" level="INFO">${encoded_value} = 100.100.100.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.775785" elapsed="0.001820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.777832" elapsed="0.000530"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.1</var>
<status status="PASS" start="2026-05-01T00:55:22.774429" elapsed="0.004059"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.779514" level="INFO">${value} = 100</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.778826" elapsed="0.000729"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.782989" level="INFO">${encoded} = 100</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.782499" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.783108" elapsed="0.000076"/>
</return>
<msg time="2026-05-01T00:55:22.783917" level="INFO">${encoded_value} = 100</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.781472" elapsed="0.002487"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.784242" elapsed="0.000545"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">100</var>
<status status="PASS" start="2026-05-01T00:55:22.778658" elapsed="0.006230"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.785884" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.785182" elapsed="0.000745"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.787850" level="INFO">${encoded} = 1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.787321" elapsed="0.000565"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.787965" elapsed="0.000076"/>
</return>
<msg time="2026-05-01T00:55:22.788366" level="INFO">${encoded_value} = 1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.786399" elapsed="0.002013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.788673" elapsed="0.000505"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-05-01T00:55:22.785013" elapsed="0.004265"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.790263" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:22.789612" elapsed="0.000692"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:22.792211" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.791738" elapsed="0.000510"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:22.792327" elapsed="0.000075"/>
</return>
<msg time="2026-05-01T00:55:22.792690" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:22.790796" elapsed="0.001934"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.792956" elapsed="0.000545"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:22.789418" elapsed="0.004184"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.774255" elapsed="0.019388"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:22.793689" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:22.793855" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:22.772777" elapsed="0.021104"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.772480" elapsed="0.021436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.794099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.793944" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.772444" elapsed="0.021733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.794993" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.794321" elapsed="0.000700"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.795072" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.768735" elapsed="0.026465"/>
</kw>
<msg time="2026-05-01T00:55:22.795255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.755490" elapsed="0.039818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.809926" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.823163" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.836541" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.836796" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.836992" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.837416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.837262" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.837242" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.837665" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.837833" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.838002" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.837199" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.837075" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.838238" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.838320" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:55:22.838508" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.750908" elapsed="0.087636"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.865197" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.864794" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.866149" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.865760" elapsed="0.000463">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.866321" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.865396" elapsed="0.000950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.867020" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.866621" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.867358" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.867537" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.867213" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.868012" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.867729" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:22.868541" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.868179" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.869077" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.868777" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.868629" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.868149" elapsed="0.001012"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.870007" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.869311" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.870090" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.864113" elapsed="0.006112"/>
</kw>
<msg time="2026-05-01T00:55:22.870281" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.850562" elapsed="0.019768"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.883490" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.896884" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.909864" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.910161" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.910351" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.910786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.910633" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:22.910615" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.911018" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.911190" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.911359" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:22.910575" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.910435" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.911609" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.911688" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:22.911884" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.849583" elapsed="0.062340"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.913395" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.913084" elapsed="0.000406">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.913587" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.912693" elapsed="0.000919"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.913952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.913686" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.914529" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.914216" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.914033" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.913666" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.917122" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.914771" elapsed="0.002378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:22.917202" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:22.917363" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:22.912320" elapsed="0.005068"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.918954" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.918701" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.919394" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.1&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.919156" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.919962" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.919672" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.920433" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.920186" elapsed="0.000308"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:22.921312" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:22.921109" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:22.921685" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:22.921507" elapsed="0.000204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.921863" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.922492" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.922231" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:22.922579" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:22.922736" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:22.920701" elapsed="0.002060"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:22.935530" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;1&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.1&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;100&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:22.935704" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,1', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:22.936041" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:22.925186" elapsed="0.010929"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.922830" elapsed="0.013398"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.936716" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.936295" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.922813" elapsed="0.014182"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.945380" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.939887" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.939220" elapsed="0.006276"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.939174" elapsed="0.006349"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.948633" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.945844" elapsed="0.002835"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.945590" elapsed="0.003148"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.945567" elapsed="0.003203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.949390" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.948963" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.949805" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.949555" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.950362" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.950057" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.949890" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.949534" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.951069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.950696" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.951406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.951169" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.952013" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.951679" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.951512" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.951150" elapsed="0.000948"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.952252" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:22.953104" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:22.952802" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.953285" elapsed="0.002481"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:22.938004" elapsed="0.017831"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:22.956023" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:55:22.955910" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.955890" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.956271" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:22.956339" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:22.958849" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:22.917741" elapsed="0.041136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.958949" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:22.959107" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:22.739470" elapsed="0.219662"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:22.959505" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:22.959237" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.959220" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:22.959642" elapsed="0.000027"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:22.734841" elapsed="0.224954"/>
</kw>
<var name="${pathid}">1</var>
<status status="PASS" start="2026-05-01T00:55:22.733796" elapsed="0.226042"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.960713" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.2 | LOCALPREF=200 | PATHID=2 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:22.960089" elapsed="0.000652"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.996544" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:22.996110" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.997644" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:22.997207" elapsed="0.000516">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:22.997821" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:22.996858" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.998429" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:22.998016" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:22.998787" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:22.998943" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:22.998644" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:22.999403" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:22.999130" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.000750" level="INFO">mapping: {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.000234" elapsed="0.000563"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.001364" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.000959" elapsed="0.000431"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.002497" level="INFO">${value} = 100.100.100.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.001814" elapsed="0.000726"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.004309" level="INFO">${encoded} = 100.100.100.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.003878" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.004436" elapsed="0.000100"/>
</return>
<msg time="2026-05-01T00:55:23.004812" level="INFO">${encoded_value} = 100.100.100.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.003008" elapsed="0.001846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.005086" elapsed="0.000550"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.2</var>
<status status="PASS" start="2026-05-01T00:55:23.001642" elapsed="0.004095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.006716" level="INFO">${value} = 200</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.006028" elapsed="0.000730"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.008726" level="INFO">${encoded} = 200</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.008271" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.008846" elapsed="0.000076"/>
</return>
<msg time="2026-05-01T00:55:23.009196" level="INFO">${encoded_value} = 200</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.007238" elapsed="0.002000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.009501" elapsed="0.000512"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">200</var>
<status status="PASS" start="2026-05-01T00:55:23.005861" elapsed="0.004255"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.011081" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.010406" elapsed="0.000718"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.013051" level="INFO">${encoded} = 2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.012430" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.013166" elapsed="0.000074"/>
</return>
<msg time="2026-05-01T00:55:23.013533" level="INFO">${encoded_value} = 2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.011650" elapsed="0.001926"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.013803" elapsed="0.000551"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-05-01T00:55:23.010237" elapsed="0.004231"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.015410" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.014768" elapsed="0.000713"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.017344" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.016933" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.017475" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T00:55:23.017831" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.016003" elapsed="0.001868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.018099" elapsed="0.000524"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:23.014598" elapsed="0.004126"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:23.001443" elapsed="0.017320"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:23.018808" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:23.018970" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:22.999910" elapsed="0.019086"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:22.999561" elapsed="0.019467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.019205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.019053" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:22.999538" elapsed="0.019744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.020117" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.019427" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.020196" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:22.995218" elapsed="0.025104"/>
</kw>
<msg time="2026-05-01T00:55:23.020379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:22.981740" elapsed="0.038690"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.033563" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.046320" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.059741" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.059964" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.060211" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.060663" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.060489" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:23.060469" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.060893" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.061058" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.061220" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:23.060415" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.060296" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.061463" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.061547" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:55:23.061693" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:22.977306" elapsed="0.084417"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.087306" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.086922" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.088243" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:23.087878" elapsed="0.000443">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:23.088416" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:23.087541" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.089023" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:23.088638" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.089348" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:23.089524" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:23.089210" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.089948" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.089708" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:23.090364" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.090068" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.090949" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.090651" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.090499" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.090050" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.091909" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.091182" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.091992" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:23.086291" elapsed="0.005833"/>
</kw>
<msg time="2026-05-01T00:55:23.092182" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:23.073043" elapsed="0.019188"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.106461" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.119540" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.133086" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.133349" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.133557" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.133983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.133832" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:23.133814" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.134223" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.134392" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.134576" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:23.133771" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.133643" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.134807" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.134963" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:55:23.135131" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:23.072130" elapsed="0.063034"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.136708" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:23.136379" elapsed="0.000409">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:23.136885" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:23.135963" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.137252" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.136983" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.137837" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.137535" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.137334" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.136964" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.140384" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:23.138081" elapsed="0.002330"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:23.140478" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:23.140642" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:23.135596" elapsed="0.005070"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.142210" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.141958" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.142666" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.2&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;200&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.142408" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.143111" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.142870" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.143589" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.143300" elapsed="0.000332"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:23.144440" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:23.144239" elapsed="0.000242"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:23.144808" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:23.144635" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.144982" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.145629" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.145357" elapsed="0.000316"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:23.145715" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:23.145871" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:23.143835" elapsed="0.002107"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:23.157334" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;2&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.2&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;200&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:23.157432" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,2', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:23.157610" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:23.148356" elapsed="0.009293"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.146017" elapsed="0.011704"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.158010" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.157764" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.145998" elapsed="0.012141"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.163481" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.159766" elapsed="0.003782"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.159410" elapsed="0.004192"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.159382" elapsed="0.004257"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.167636" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.164045" elapsed="0.003660"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.163721" elapsed="0.004035"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.163697" elapsed="0.004096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.168637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.168059" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.168973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.168735" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.169531" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.169217" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.169054" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.168717" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.170129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.169771" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.170471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.170225" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.171004" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.170712" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.170553" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.170207" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:23.171242" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:23.172101" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.171805" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.172343" elapsed="0.002376"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:23.158719" elapsed="0.016067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:23.174971" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:55:23.174861" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.174843" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.175217" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.175302" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:23.177667" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:23.141003" elapsed="0.036691"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.177765" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:23.177921" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:22.965784" elapsed="0.212163"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.178305" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.178051" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.178034" elapsed="0.000365"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.178432" elapsed="0.000043"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:22.961005" elapsed="0.217572"/>
</kw>
<var name="${pathid}">2</var>
<status status="PASS" start="2026-05-01T00:55:22.959940" elapsed="0.218679"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.179523" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.3 | LOCALPREF=300 | PATHID=3 | APP_RIB=10.30.170.185 }</msg>
<var>&amp;{route_mapping}</var>
<arg>NEXTHOP=${NEXT_HOP_PREF}${pathid}</arg>
<arg>LOCALPREF=${pathid}00</arg>
<arg>PATHID=${pathid}</arg>
<arg>APP_RIB=${app_rib}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.178868" elapsed="0.000685"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.215395" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.214928" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.216396" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:23.215979" elapsed="0.000535">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:23.216615" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:23.215633" elapsed="0.001007"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.217198" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:23.216808" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.217550" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:23.217714" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:23.217389" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.218220" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.217971" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.219540" level="INFO">mapping: {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.219030" elapsed="0.000556"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.220142" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.219748" elapsed="0.000420"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.221243" level="INFO">${value} = 100.100.100.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.220602" elapsed="0.000683"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.222998" level="INFO">${encoded} = 100.100.100.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.222578" elapsed="0.000458"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.223116" elapsed="0.000103"/>
</return>
<msg time="2026-05-01T00:55:23.223506" level="INFO">${encoded_value} = 100.100.100.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.221779" elapsed="0.001769"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.223777" elapsed="0.000518"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.3</var>
<status status="PASS" start="2026-05-01T00:55:23.220400" elapsed="0.003995"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.225352" level="INFO">${value} = 300</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.224713" elapsed="0.000680"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.227313" level="INFO">${encoded} = 300</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.226859" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.227429" elapsed="0.000096"/>
</return>
<msg time="2026-05-01T00:55:23.227794" level="INFO">${encoded_value} = 300</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.226070" elapsed="0.001764"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.228057" elapsed="0.000530"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">300</var>
<status status="PASS" start="2026-05-01T00:55:23.224545" elapsed="0.004140"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.229761" level="INFO">${value} = 3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.228972" elapsed="0.000831"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.231486" level="INFO">${encoded} = 3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.231042" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.231603" elapsed="0.000073"/>
</return>
<msg time="2026-05-01T00:55:23.231937" level="INFO">${encoded_value} = 3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.230255" elapsed="0.001722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.232203" elapsed="0.000533"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">3</var>
<status status="PASS" start="2026-05-01T00:55:23.228805" elapsed="0.004028"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.233907" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:23.233116" elapsed="0.000833"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:23.235637" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.235210" elapsed="0.000463"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:23.235749" elapsed="0.000073"/>
</return>
<msg time="2026-05-01T00:55:23.236084" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:23.234403" elapsed="0.001721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.236350" elapsed="0.000529"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:23.232952" elapsed="0.004024"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:23.220221" elapsed="0.016793"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:23.237060" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:23.237282" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:23.218700" elapsed="0.018609"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.218345" elapsed="0.018997"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.237579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.237371" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.218321" elapsed="0.019337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.238440" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.237804" elapsed="0.000741"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.238597" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:23.214209" elapsed="0.024518"/>
</kw>
<msg time="2026-05-01T00:55:23.238784" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:23.200824" elapsed="0.038015"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.252164" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.268304" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.282185" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.282460" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.282652" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.283134" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.282925" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:23.282907" elapsed="0.000315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.283366" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.283555" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.283723" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:23.282865" elapsed="0.000913"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.282736" elapsed="0.001070"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.283954" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.284106" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:55:23.284262" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:23.196206" elapsed="0.088085"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.311285" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.310811" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.312281" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:23.311890" elapsed="0.000469">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:23.312489" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:23.311522" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.313096" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:23.312686" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.313442" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:23.313647" level="INFO">${template} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:23.313287" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.314088" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;$PATHID&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;$NEXTHOP&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;$LOCALPREF&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.313837" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:23.314605" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.314226" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.315174" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.314845" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.314694" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.314201" elapsed="0.001059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.316096" level="INFO">${final_text} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.315408" elapsed="0.000718"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.316180" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:23.309941" elapsed="0.006395"/>
</kw>
<msg time="2026-05-01T00:55:23.316484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:23.295779" elapsed="0.020767"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.331208" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.344419" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.357350" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.357577" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.357760" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.358156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.358007" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:23.357990" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.358379" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.358563" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.358732" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:23.357956" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.357843" elapsed="0.000971"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.358995" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.359077" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:23.359223" level="INFO">${data} =   &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
    ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:23.294753" elapsed="0.064500"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:23.360631" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:23.360334" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:23.360800" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:23.359958" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.361206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.360948" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.361807" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.361491" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.361288" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.360928" elapsed="0.000963"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.364338" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:23.362058" elapsed="0.002308"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:23.364420" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:55:23.364601" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:23.359608" elapsed="0.005018"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.366173" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.365917" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.366667" level="INFO">  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.3&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;300&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.366396" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.367159" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.366909" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.367650" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.367355" elapsed="0.000341"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:23.368624" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:23.368365" elapsed="0.000286"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:23.368979" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:23.368804" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.369153" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.369809" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.369557" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:23.369895" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:23.370052" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:23.367903" elapsed="0.002173"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:23.380361" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '625', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=  &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
   &lt;prefix&gt;1.1.1.1/32&lt;/prefix&gt;
   &lt;path-id&gt;3&lt;/path-id&gt;
   &lt;route-key&gt;1.1.1.1/32&lt;/route-key&gt;
   &lt;attributes&gt;
    &lt;ipv4-next-hop&gt;
     &lt;global&gt;100.100.100.3&lt;/global&gt;
    &lt;/ipv4-next-hop&gt;
    &lt;as-path/&gt;
    &lt;multi-exit-disc&gt;
     &lt;med&gt;0&lt;/med&gt;
    &lt;/multi-exit-disc&gt;
    &lt;local-pref&gt;
     &lt;pref&gt;300&lt;/pref&gt;
    &lt;/local-pref&gt;
    &lt;originator-id&gt;
     &lt;originator&gt;41.41.41.41&lt;/originator&gt;
    &lt;/originator-id&gt;
    &lt;origin&gt;
     &lt;value&gt;igp&lt;/value&gt;
    &lt;/origin&gt;
    &lt;cluster-id&gt;
     &lt;cluster&gt;40.40.40.40&lt;/cluster&gt;
    &lt;/cluster-id&gt;
   &lt;/attributes&gt;
  &lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:23.380424" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=1.1.1.1%2F32,3', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:23.380594" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:23.372801" elapsed="0.007820"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.370147" elapsed="0.010519"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.380861" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.380693" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.370129" elapsed="0.010824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.384535" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.382013" elapsed="0.002570"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.381792" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.381774" elapsed="0.002870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.387680" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.384940" elapsed="0.002820"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.384703" elapsed="0.003108"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.384685" elapsed="0.003161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.388660" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.388080" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.389137" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.388802" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.389965" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.389499" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.389250" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.388777" elapsed="0.001342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.391086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.390417" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.391576" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.391223" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.392332" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:23.391919" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:23.391691" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.391198" elapsed="0.001250"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:23.392681" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:23.393846" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:23.393416" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:23.394119" elapsed="0.003403"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:23.381334" elapsed="0.016278"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:23.397865" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:55:23.397714" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.397687" elapsed="0.000300"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.398195" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:23.398289" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:55:23.401165" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:23.364958" elapsed="0.036235"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.401264" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:23.401419" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:23.184775" elapsed="0.216720"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:23.401850" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:23.401606" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:23.401588" elapsed="0.000353"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:23.401974" elapsed="0.000027"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:23.179822" elapsed="0.222284"/>
</kw>
<var name="${pathid}">3</var>
<status status="PASS" start="2026-05-01T00:55:23.178720" elapsed="0.223428"/>
</iter>
<var>${pathid}</var>
<value>@{PATH_ID_LIST}</value>
<status status="PASS" start="2026-05-01T00:55:22.733651" elapsed="0.668529"/>
</for>
<doc>Configure bgp application peer and fill it immediately with routes.</doc>
<status status="PASS" start="2026-05-01T00:55:22.508311" elapsed="0.893926"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.410146" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/exa.cfg' -&gt; '/home/jenkins//exa.cfg'</msg>
<arg>${BGP_VAR_FOLDER}/${DEFAUTL_RPC_CFG}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:55:23.402856" elapsed="0.007375"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.417278" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/exabgp_files/exarpc.py' -&gt; '/home/jenkins//exarpc.py'</msg>
<arg>${EXARPCSCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:55:23.410490" elapsed="0.006871"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.426899" level="INFO">6 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
bgp-l3vpn-ipv4.cfg
exa-md5.cfg
exa.cfg
gobgp.cfg</msg>
<msg time="2026-05-01T00:55:23.427229" level="INFO">@{cfgfiles} = [ bgp-flowspec-redirect.cfg | bgp-flowspec.cfg | bgp-l3vpn-ipv4.cfg | exa-md5.cfg | exa.cfg | gobgp.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:55:23.417610" elapsed="0.009687"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.428683" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:23.442886" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.428237" elapsed="0.014778"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.443731" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:23.492155" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.443372" elapsed="0.048968"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.492989" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:23.539963" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.492730" elapsed="0.047387"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.540854" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:23.587302" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.540575" elapsed="0.046859"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.588153" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-05-01T00:55:23.635692" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:23.635852" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.587847" elapsed="0.048050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.636722" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;

        }
        then {
            redirect 65500:12345;
        }
    }
    route flow2 {
        match {
            source 10.0.0.2/32;
            destination 192.168.0.2/32;

        }
        then {
                redirect 1.2.3.4;
        }
    }
    route flow4 {
        match {
            source 10.0.0.4/32;
            destination 192.168.0.4/32;

        }
        next-hop 127.0.0.1;
        then {
                redirect-to-nexthop;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.636224" elapsed="0.000571"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-05-01T00:55:23.427889" elapsed="0.208956"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.638126" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:23.684409" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.637239" elapsed="0.047435"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.685767" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:23.736050" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.685304" elapsed="0.050939"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.737151" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:23.784500" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.736759" elapsed="0.047944"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.785674" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:23.831925" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.785188" elapsed="0.046891"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.832749" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-05-01T00:55:23.884359" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:23.884640" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.832441" elapsed="0.052241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:23.885601" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/32;
            destination 192.168.0.1/32;
            port =80;
            destination-port &gt;8080&amp;&lt;8088;
            source-port &gt;1024;
            protocol tcp;
            packet-length &gt;400&amp;&lt;500;
            fragment =first-fragment;
            icmp-type echo-reply;
            icmp-code network-unreachable;
            tcp-flags =urgent;
            dscp 20;
        }
        then {
            action sample-terminal;
        }
    }
}
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:23.885081" elapsed="0.000608"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-05-01T00:55:23.637035" elapsed="0.248711"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.886468" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:23.932563" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.886210" elapsed="0.046516"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.933411" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:23.980334" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.933076" elapsed="0.047489"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:23.981406" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:24.028534" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:23.981030" elapsed="0.047718"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.029827" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:24.076186" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.029238" elapsed="0.047099"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.077151" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-05-01T00:55:24.123982" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:24.124228" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.076808" elapsed="0.047482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.125525" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.254;
      rd 1.2.3.4:1;
      label 24005;
    }
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.124795" elapsed="0.000869"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:55:23.885968" elapsed="0.239801"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.126805" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:24.172514" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.126386" elapsed="0.046361"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.173882" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:24.220179" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.173313" elapsed="0.047007"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.221084" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:24.268125" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.220746" elapsed="0.047531"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.269309" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:24.316811" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.268863" elapsed="0.048153"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.318062" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-05-01T00:55:24.368286" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:24.368687" level="INFO">${stdout} = neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.317634" elapsed="0.051144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.370359" level="INFO">neighbor 10.30.170.185 {
  router-id 10.30.170.157;
  local-address 10.30.170.157;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unicast;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.369557" elapsed="0.000962"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-05-01T00:55:24.126059" elapsed="0.244553"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.371947" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:24.416427" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.371483" elapsed="0.045210"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.417790" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:24.468853" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.417262" elapsed="0.051738"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.469785" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:24.520680" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.469397" elapsed="0.051518"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.521957" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa.cfg'.</msg>
<msg time="2026-05-01T00:55:24.572057" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.521439" elapsed="0.050756"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.572964" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-05-01T00:55:24.620251" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:24.620539" level="INFO">${stdout} = neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    i...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.572640" elapsed="0.047964"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.621721" level="INFO">neighbor 10.30.170.185 {
router-id 10.30.170.157;
local-address 10.30.170.157;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    ipv4 unicast;
    ipv4 mpls-vpn;
  }

  process exarpcserver {
    run exarpc.py --host 10.30.170.157;
    encoder json;
    receive-routes;
    neighbor-changes;
  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.621050" elapsed="0.000778"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-05-01T00:55:24.371000" elapsed="0.250904"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.622905" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.170.157/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:24.668665" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.622535" elapsed="0.046272"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.669612" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:24.720352" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.669183" elapsed="0.051337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.721208" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:24.767983" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.720897" elapsed="0.047253"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.769029" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:24.820520" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.768623" elapsed="0.052124"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.821716" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-05-01T00:55:24.868652" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:24.869158" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:24.821263" elapsed="0.047967"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.870874" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.170.157"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.185"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.170.157"
        remote-port = 1790
    [[neighbors.afi-safis]]
        [neighbors.afi-safis.config]
           afi-safi-name = "ipv4-flowspec"
        [neighbors.afi-safis.long-lived-graceful-restart.config]
           enabled = true
           restart-time = 86400</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.869970" elapsed="0.001215"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-05-01T00:55:24.622188" elapsed="0.249086"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:55:23.427441" elapsed="1.443936"/>
</for>
<arg>addpath=${exa_add_path_value}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-05-01T00:55:23.402431" elapsed="1.469162"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.881238" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:24.880781" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.881683" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.881422" elapsed="0.000305"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.905825" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:24.882341" elapsed="0.023745"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.910509" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:24.910720" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:24.906653" elapsed="0.004109"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.912113" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.911504" elapsed="0.000681"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:24.910958" elapsed="0.001278"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:24.910884" elapsed="0.001406"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:24.881978" elapsed="0.030412"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:24.914746" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:24.914881" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:24.912678" elapsed="0.002240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.915581" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.915163" elapsed="0.000485"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:24.879835" elapsed="0.035905"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.918370" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:24.917959" elapsed="0.000443"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.920993" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:24.918609" elapsed="0.002413"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:24.926381" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:24.926591" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:24.926745" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:24.921221" elapsed="0.005563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.931719" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:24.927058" elapsed="0.004773"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:24.936444" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:24.932118" elapsed="0.004489">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:24.917350" elapsed="0.019434">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:27.939752" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:27.938828" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:27.944540" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:27.940340" elapsed="0.004245"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:27.950903" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:27.951101" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:27.951254" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:27.944841" elapsed="0.006475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:27.955600" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:27.951614" elapsed="0.004064"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:27.959819" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:27.955919" elapsed="0.004003">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:27.937607" elapsed="0.022484">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.963254" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:30.962326" elapsed="0.000998"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.968336" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:30.963747" elapsed="0.004651"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:30.975432" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:30.975601" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:30.975697" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:30.968800" elapsed="0.006923"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.978513" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.975917" elapsed="0.002646"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.981532" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:30.978719" elapsed="0.002886">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:30.961009" elapsed="0.020710">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:30.981809" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:24.916674" elapsed="6.065226">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:30.982018" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:30.982062" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:24.916050" elapsed="6.066036"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.982921" level="INFO">[?2004l00:55:25 | 3424   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:25 | 3424   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:25 | 3424   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:25 | 3424   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:25 | 3424   | [01;34minstallation [0m | [1m        [0m
00:55:25 | 3424   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:25 | 3424   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:25 | 3424   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:25 | 3424   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:25 | 3424   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:25 | 3424   | configuration[0m | . local-as         | '64496'[0m
00:55:25 | 3424   | configuration[0m | . peer-as          | '64496'[0m
00:55:25 | 3424   | configuration[0m | &gt; capability       | [0m
00:55:25 | 3424   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:25 | 3424   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:25 | 3424   | configuration[0m | &lt; capability       | [0m
00:55:25 | 3424   | configuration[0m | &gt; family           | [0m
00:55:25 | 3424   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:25 | 3424   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:25 | 3424   | configuration[0m | &lt; family           | [0m
00:55:25 | 3424   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1m        [0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1m        [0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:30.983141" level="INFO">${output} = [?2004l00:55:25 | 3424   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:25 | 3424   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:25 | 3424   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:30.982789" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.983590" level="INFO">[?2004l00:55:25 | 3424   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:25 | 3424   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:25 | 3424   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:25 | 3424   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:25 | 3424   | [01;34minstallation [0m | [1m        [0m
00:55:25 | 3424   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:25 | 3424   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:25 | 3424   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:25 | 3424   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:25 | 3424   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:25 | 3424   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:25 | 3424   | configuration[0m | . local-as         | '64496'[0m
00:55:25 | 3424   | configuration[0m | . peer-as          | '64496'[0m
00:55:25 | 3424   | configuration[0m | &gt; capability       | [0m
00:55:25 | 3424   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:25 | 3424   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:25 | 3424   | configuration[0m | &lt; capability       | [0m
00:55:25 | 3424   | configuration[0m | &gt; family           | [0m
00:55:25 | 3424   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:25 | 3424   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:25 | 3424   | configuration[0m | &lt; family           | [0m
00:55:25 | 3424   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1m        [0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1m        [0m
00:55:25 | 3424   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.983325" elapsed="0.000376"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.984573" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:30.984239" elapsed="0.000362"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:30.984759" elapsed="0.000251"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:30.983955" elapsed="0.001113"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.987235" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:30.987327" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:30.985236" elapsed="0.002118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.987792" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.987529" elapsed="0.000311"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.989315" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:30.988475" elapsed="0.000894"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.990336" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:30.990421" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:30.989563" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.991023" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.990778" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:30.990533" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:30.990515" elapsed="0.000613"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:30.988096" elapsed="0.003077"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:30.982506" elapsed="0.008716"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:30.982187" elapsed="0.009061"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:30.982163" elapsed="0.009108"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:30.991440" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:30.991325" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:30.991309" elapsed="0.000247"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-05-01T00:55:24.879357" elapsed="6.112226"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.992623" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:30.992285" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.993045" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.992808" elapsed="0.000281"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.995118" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:30.993702" elapsed="0.001472"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:30.999172" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:30.999267" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:30.995332" elapsed="0.003962"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:30.999914" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:30.999635" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:30.999365" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:30.999346" elapsed="0.000673"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:30.993329" elapsed="0.006737"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:31.001531" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:31.001618" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:31.000215" elapsed="0.001428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:31.002042" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:31.001801" elapsed="0.000286"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:30.991965" elapsed="0.010176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:31.004201" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:31.003840" elapsed="0.000388"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:31.006488" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:31.004389" elapsed="0.002128"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:31.010441" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:31.010571" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:31.010664" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:31.006678" elapsed="0.004012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:31.013295" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:31.010855" elapsed="0.002487"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:31.016079" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:31.013512" elapsed="0.002631">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:31.003183" elapsed="0.013066">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:34.019270" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:34.018376" elapsed="0.000963"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:34.024296" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:34.019755" elapsed="0.004603"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:34.030329" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:34.030492" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:34.030593" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:34.024891" elapsed="0.005728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:34.033282" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:34.030788" elapsed="0.002543"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:34.036988" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:34.033505" elapsed="0.003579">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:34.017108" elapsed="0.020132">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.040287" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:37.039334" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.045671" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:37.040776" elapsed="0.004956"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:37.052663" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:37.052812" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:37.052926" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:37.046167" elapsed="0.006786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.055669" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.053148" elapsed="0.002571"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.059337" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:37.055880" elapsed="0.003561">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:37.038110" elapsed="0.021525">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:37.059770" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:31.002697" elapsed="6.057206">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:37.060104" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:37.060169" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:31.002299" elapsed="6.057906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.061481" level="INFO">[?2004l00:55:31 | 3428   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:31 | 3428   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:31 | 3428   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:31 | 3428   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:31 | 3428   | [01;34minstallation [0m | [1m        [0m
00:55:31 | 3428   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:31 | 3428   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:31 | 3428   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:31 | 3428   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:31 | 3428   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:31 | 3428   | configuration[0m | . local-as         | '64496'[0m
00:55:31 | 3428   | configuration[0m | . peer-as          | '64496'[0m
00:55:31 | 3428   | configuration[0m | &gt; capability       | [0m
00:55:31 | 3428   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:31 | 3428   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:31 | 3428   | configuration[0m | &lt; capability       | [0m
00:55:31 | 3428   | configuration[0m | &gt; family           | [0m
00:55:31 | 3428   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:31 | 3428   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:31 | 3428   | configuration[0m | &lt; family           | [0m
00:55:31 | 3428   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1m        [0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1m        [0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:37.062314" level="INFO">${output} = [?2004l00:55:31 | 3428   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:31 | 3428   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:31 | 3428   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:37.061282" elapsed="0.001078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.063044" level="INFO">[?2004l00:55:31 | 3428   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:31 | 3428   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:31 | 3428   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:31 | 3428   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:31 | 3428   | [01;34minstallation [0m | [1m        [0m
00:55:31 | 3428   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:31 | 3428   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:31 | 3428   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:31 | 3428   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:31 | 3428   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:31 | 3428   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:31 | 3428   | configuration[0m | . local-as         | '64496'[0m
00:55:31 | 3428   | configuration[0m | . peer-as          | '64496'[0m
00:55:31 | 3428   | configuration[0m | &gt; capability       | [0m
00:55:31 | 3428   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:31 | 3428   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:31 | 3428   | configuration[0m | &lt; capability       | [0m
00:55:31 | 3428   | configuration[0m | &gt; family           | [0m
00:55:31 | 3428   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:31 | 3428   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:31 | 3428   | configuration[0m | &lt; family           | [0m
00:55:31 | 3428   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1m        [0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1m        [0m
00:55:31 | 3428   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.062636" elapsed="0.000575"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.064511" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:37.063949" elapsed="0.000604"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:37.064781" elapsed="0.000354"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:37.063543" elapsed="0.001665"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.067943" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:37.068078" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:37.065360" elapsed="0.002751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.068550" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.068277" elapsed="0.000323"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.070336" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:37.069244" elapsed="0.001148"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.071568" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:37.071655" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:37.070601" elapsed="0.001082"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.072304" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.072011" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:37.071757" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:37.071735" elapsed="0.000678"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:37.068870" elapsed="0.003606"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:37.060864" elapsed="0.011665"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:37.060412" elapsed="0.012144"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:37.060375" elapsed="0.012206"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:37.072755" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:37.072637" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:37.072621" elapsed="0.000248"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-05-01T00:55:30.991783" elapsed="6.081114"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.073956" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:37.073636" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.074372" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.074135" elapsed="0.000282"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.076537" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:37.075030" elapsed="0.001566"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.081171" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:37.081263" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:37.076776" elapsed="0.004514"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.081887" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.081637" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:37.081361" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:37.081341" elapsed="0.000653"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:55:37.074675" elapsed="0.007371"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:37.083640" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-05-01T00:55:37.083727" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:37.082194" elapsed="0.001559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.084196" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exa.cfg
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.083909" elapsed="0.000339"/>
</kw>
<arg>${cfg_file}</arg>
<doc>Dump the start command into prompt. It assumes that no exabgp is running. For verified
start use Start_ExaBgp_And_Verify_Connected keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:37.073289" elapsed="0.011014"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.086482" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:37.086110" elapsed="0.000401"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.089049" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:37.086711" elapsed="0.002367"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:37.094191" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:37.094331" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:37.094429" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:37.089244" elapsed="0.005235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.097291" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:37.094659" elapsed="0.002704"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:37.101643" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:37.097620" elapsed="0.004124">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:37.085650" elapsed="0.016258">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:40.105010" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:40.103971" elapsed="0.001109"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:40.109937" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:40.105491" elapsed="0.004509"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:40.116582" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:40.116731" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:40.116827" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:40.110518" elapsed="0.006334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:40.119520" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:40.117023" elapsed="0.002547"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:40.123191" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:40.119765" elapsed="0.003523">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:40.102727" elapsed="0.020715">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.126902" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.125835" elapsed="0.001138"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.132252" level="INFO">${exp_status_code} = 200</msg>
<var>${exp_status_code}</var>
<arg>${connected}</arg>
<arg>${200}</arg>
<arg>${404}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.127362" elapsed="0.004937"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.139246" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.139631" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.170.157?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:43.139955" level="INFO">${rsp} = &lt;Response [409]&gt;</msg>
<var>${rsp}</var>
<arg>${session}</arg>
<arg>url=${peer_check_url}${exabgp_ip}?content=nonconfig</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:43.132584" elapsed="0.007436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.146687" level="INFO">{
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
}</msg>
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.140565" elapsed="0.006233"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.149797" level="FAIL">200.0 != 409.0</msg>
<arg>${exp_status_code}</arg>
<arg>${rsp.status_code}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-05-01T00:55:43.147149" elapsed="0.002730">200.0 != 409.0</status>
</kw>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-05-01T00:55:43.124532" elapsed="0.025477">200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:43.150110" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:55:37.084885" elapsed="6.065319">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-05-01T00:55:43.150326" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:43.150371" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:37.084489" elapsed="6.065905"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.151320" level="INFO">[?2004l00:55:37 | 3432   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:37 | 3432   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:37 | 3432   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:37 | 3432   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:37 | 3432   | [01;34minstallation [0m | [1m        [0m
00:55:37 | 3432   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:37 | 3432   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:37 | 3432   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:37 | 3432   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:37 | 3432   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:37 | 3432   | configuration[0m | . local-as         | '64496'[0m
00:55:37 | 3432   | configuration[0m | . peer-as          | '64496'[0m
00:55:37 | 3432   | configuration[0m | &gt; capability       | [0m
00:55:37 | 3432   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:37 | 3432   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:37 | 3432   | configuration[0m | &lt; capability       | [0m
00:55:37 | 3432   | configuration[0m | &gt; family           | [0m
00:55:37 | 3432   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:37 | 3432   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:37 | 3432   | configuration[0m | &lt; family           | [0m
00:55:37 | 3432   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1m        [0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1m        [0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:43.151573" level="INFO">${output} = [?2004l00:55:37 | 3432   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:37 | 3432   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:37 | 3432   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:43.151173" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.152007" level="INFO">[?2004l00:55:37 | 3432   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:55:37 | 3432   | [01;34mversion      [0m | [1m4.2.17  [0m
00:55:37 | 3432   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
00:55:37 | 3432   | [01;34mos           [0m | [1mLinux releng-26932-215-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
00:55:37 | 3432   | [01;34minstallation [0m | [1m        [0m
00:55:37 | 3432   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:55:37 | 3432   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:55:37 | 3432   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:55:37 | 3432   | configuration[0m | &gt; neighbor         | '10.30.170.185'[0m
00:55:37 | 3432   | configuration[0m | . router-id        | '10.30.170.157'[0m
00:55:37 | 3432   | configuration[0m | . local-address    | '10.30.170.157'[0m
00:55:37 | 3432   | configuration[0m | . local-as         | '64496'[0m
00:55:37 | 3432   | configuration[0m | . peer-as          | '64496'[0m
00:55:37 | 3432   | configuration[0m | &gt; capability       | [0m
00:55:37 | 3432   | configuration[0m | . route-refresh    | 'disable'[0m
00:55:37 | 3432   | configuration[0m | . add-path         | 'send/receive'[0m
00:55:37 | 3432   | configuration[0m | &lt; capability       | [0m
00:55:37 | 3432   | configuration[0m | &gt; family           | [0m
00:55:37 | 3432   | configuration[0m | . ipv4             | 'unicast'[0m
00:55:37 | 3432   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:55:37 | 3432   | configuration[0m | &lt; family           | [0m
00:55:37 | 3432   | configuration[0m | &gt; process          | 'exarpcserver'[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1m        [0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1m        [0m
00:55:37 | 3432   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.151758" elapsed="0.000362"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.152944" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.152617" elapsed="0.000354"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:43.153124" elapsed="0.000284"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:43.152327" elapsed="0.001157"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.155938" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:43.156031" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:43.153649" elapsed="0.002409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.156478" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.156215" elapsed="0.000313"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.158815" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:43.157155" elapsed="0.001715"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.159683" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:43.159764" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:43.159028" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.160354" level="INFO">[?2004l[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.160099" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.159856" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.159837" elapsed="0.000641"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:43.156789" elapsed="0.003737"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:43.150872" elapsed="0.009704"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.150540" elapsed="0.010062"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.150509" elapsed="0.010115"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:43.160805" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.160678" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.160662" elapsed="0.000241"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-05-01T00:55:37.073089" elapsed="6.087841"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-05-01T00:55:24.878788" elapsed="18.282180"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.161411" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:55:43.161129" elapsed="0.000361">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${DEFAUTL_RPC_CFG}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>connection_retries=${3}</arg>
<doc>Starts the ExaBgp and verifies its connection. The verification is done by checking the presence
of the peer in the bgp rib.</doc>
<status status="FAIL" start="2026-05-01T00:55:24.872625" elapsed="18.288967">Unable to connect ExaBgp to ODL</status>
</kw>
<arg>${NPATHS_SELM}</arg>
<arg>${ADDPATHCAP_SR}</arg>
<doc>Setup test case keyword. Early after the path selection config the incomming connection
from exabgp towards odl may be rejected by odl due to config process not finished yet. Because of that
we try to start the tool 3 times in case early attempts fail.</doc>
<status status="FAIL" start="2026-05-01T00:55:21.962745" elapsed="21.198959">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Remove_Odl_And_App_Peer_Configuration_And_Stop_ExaBgp" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.162838" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.162281" elapsed="0.000585"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.206754" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.206328" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.207590" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:43.207297" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:43.207745" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:43.206946" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.208319" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.207933" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.208660" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:43.208818" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:43.208524" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.209239" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.208999" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.210264" level="INFO">mapping: {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.210011" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.210760" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.210481" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.211446" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.211150" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.212236" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.212019" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.212312" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:43.212485" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.211676" elapsed="0.000836"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.212666" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:43.211014" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.213554" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.213239" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.214475" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.214108" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.214553" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:43.214739" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.213765" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.214915" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:43.213104" elapsed="0.002072"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.210838" elapsed="0.004373"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.215253" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:55:43.215424" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:43.209664" elapsed="0.005785"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.209351" elapsed="0.006146"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.215672" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.215523" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.209332" elapsed="0.006416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.216490" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.215888" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.216569" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:43.205674" elapsed="0.011019"/>
</kw>
<msg time="2026-05-01T00:55:43.216746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.192578" elapsed="0.024227"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.229772" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.242758" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.255614" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.255811" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.255990" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.256421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.256274" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:43.256258" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.256664" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.256831" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.256995" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:43.256224" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.256116" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.257222" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.257299" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:43.257434" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:43.188166" elapsed="0.069311"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.258649" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.258358" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.268287" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.268336" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.268427" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:43.260864" elapsed="0.007608"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.258763" elapsed="0.009750"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.268689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.268538" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.258745" elapsed="0.010026"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.274734" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.269792" elapsed="0.005005"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.269573" elapsed="0.005524"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.269555" elapsed="0.005618"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.279206" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.275737" elapsed="0.003526"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.275307" elapsed="0.003992"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.275281" elapsed="0.004044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.279964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.279522" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.280311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.280065" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.280985" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.280646" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.280463" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.280047" elapsed="0.001023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.281621" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.281236" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.281980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.281719" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.282541" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.282226" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.282064" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.281702" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.282777" elapsed="0.000405"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:43.283666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.283349" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.283847" elapsed="0.002430"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:43.269128" elapsed="0.017216"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:43.286391" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:55:43.288879" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:43.257744" elapsed="0.031163"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.288962" elapsed="0.000029"/>
</return>
<arg>${MULT_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:43.163112" elapsed="0.125977"/>
</kw>
<kw name="Deconfigure_App_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.289922" level="INFO">${app_rib} = 10.30.170.185</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.289627" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.290604" level="INFO">&amp;{route_mapping} = { APP_RIB=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{route_mapping}</var>
<arg>APP_RIB=${app_rib}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.290111" elapsed="0.000524"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.334845" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.334473" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.335683" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:43.335389" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:43.335854" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:43.335051" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.336423" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.336041" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.336765" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/multipaths/route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:43.336930" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:43.336629" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.337389" level="INFO">/rests/data/bgp-rib:application-rib=$APP_RIB/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.337149" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.338643" level="INFO">mapping: {'APP_RIB': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.338163" elapsed="0.000530"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.339148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.338855" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.339849" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.339548" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.340901" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.340413" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.340979" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:43.341135" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.340064" elapsed="0.001096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.341314" elapsed="0.000251"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:43.339398" elapsed="0.002208"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.342151" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.341856" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.343183" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.342727" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.343259" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:43.343410" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.342361" elapsed="0.001074"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.343606" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:43.341722" elapsed="0.002145"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.339226" elapsed="0.004677"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.343946" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:43.344101" level="INFO">${mapping_to_use} = {'APP_RIB': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:43.337817" elapsed="0.006309"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.337524" elapsed="0.006634"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.344335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.344183" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.337505" elapsed="0.006905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.345131" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.344570" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.345207" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:43.333820" elapsed="0.011512"/>
</kw>
<msg time="2026-05-01T00:55:43.345385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.320750" elapsed="0.024695"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.358381" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.371442" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.384646" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.384888" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.385070" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.385489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.385324" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:43.385307" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.385714" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.385880" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.386045" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:43.385272" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.385151" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.386271" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.386348" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:43.386509" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:43.316360" elapsed="0.070178"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.387754" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.387473" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.400262" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.400310" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.400400" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:43.390186" elapsed="0.010241"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.387872" elapsed="0.012616"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.400667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.400515" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.387853" elapsed="0.012948"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.404332" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.401846" elapsed="0.002530"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.401618" elapsed="0.002793"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.401600" elapsed="0.002836"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.407080" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.404730" elapsed="0.002395"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.404509" elapsed="0.002651"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.404492" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.407798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.407389" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.408135" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.407897" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.408706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.408383" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.408217" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.407879" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.409308" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.408949" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.409659" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.409404" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.410196" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.409904" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.409740" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.409386" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.410434" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:43.411288" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.410962" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.411484" elapsed="0.002475"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:43.401164" elapsed="0.012858"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:43.414068" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:43.416480" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:43.386802" elapsed="0.029706"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.416563" elapsed="0.000029"/>
</return>
<arg>${MULT_VAR_FOLDER}/route</arg>
<arg>mapping=${route_mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:43.290862" elapsed="0.125828"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.417416" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>APP_PEER_NAME=${APP_PEER_NAME}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.416859" elapsed="0.000585"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.461772" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.461377" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.462592" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:43.462305" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:43.462818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:43.461970" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.463420" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.463012" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:43.463780" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:43.463938" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:43.463633" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.464368" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.464123" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.465415" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.465159" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.465903" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.465639" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.466609" level="INFO">${value} = controller-config</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.466292" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.467690" level="INFO">${encoded} = controller-config</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.467164" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.467769" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:43.467924" level="INFO">${encoded_value} = controller-config</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.466820" elapsed="0.001129"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.468101" elapsed="0.000230"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-05-01T00:55:43.466157" elapsed="0.002214"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.468933" level="INFO">${value} = example-bgp-peer-app</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.468640" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.469944" level="INFO">${encoded} = example-bgp-peer-app</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.469504" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.470020" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:43.470170" level="INFO">${encoded_value} = example-bgp-peer-app</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.469141" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.470349" elapsed="0.000237"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-05-01T00:55:43.468506" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.471165" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.470870" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.472351" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.471910" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.472428" elapsed="0.000058"/>
</return>
<msg time="2026-05-01T00:55:43.472612" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.471374" elapsed="0.001264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.472789" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:43.470738" elapsed="0.002315"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.473680" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:43.473351" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.474698" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.474240" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:43.474775" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:43.474929" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:43.473893" elapsed="0.001061"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.475105" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:43.473212" elapsed="0.002155"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.465981" elapsed="0.009457"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:43.475498" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:43.475658" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:43.464808" elapsed="0.010876"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.464506" elapsed="0.011216"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.475895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.475747" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.464483" elapsed="0.011488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.476748" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.476113" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.476826" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:43.460732" elapsed="0.016219"/>
</kw>
<msg time="2026-05-01T00:55:43.477005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.447499" elapsed="0.029566"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.490395" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.503467" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.516277" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.516486" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.516665" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.517078" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.516933" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:43.516919" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.517306" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.517490" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.517659" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:43.516890" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.516785" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.517882" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.517958" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:43.518082" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:43.442651" elapsed="0.075458"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.519240" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.518989" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.528367" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.528416" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.528530" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:43.521639" elapsed="0.006918"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.519353" elapsed="0.009244"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.528777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.528624" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.519335" elapsed="0.009525"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.532425" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.529892" elapsed="0.002614"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.529673" elapsed="0.002889"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.529655" elapsed="0.002942"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.536370" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.532979" elapsed="0.003455"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.532674" elapsed="0.003828"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.532652" elapsed="0.003886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.537297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.536776" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.537781" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.537430" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.538625" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.538181" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.537946" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.537405" elapsed="0.001336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.539485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.538967" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.539983" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.539655" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.540615" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.540299" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.540095" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.539629" elapsed="0.001068"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.540847" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:43.541656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.541353" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.541836" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:43.529226" elapsed="0.015045"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:43.544317" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:43.546821" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:43.518372" elapsed="0.028476"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.546902" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:43.417696" elapsed="0.129330"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:55:43.289265" elapsed="0.257822"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.547887" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:55:43.547700" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.548312" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.548066" elapsed="0.000290"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.549177" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.548876" elapsed="0.000328"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:43.549364" elapsed="0.000277"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:55:43.548578" elapsed="0.001123"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.551884" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:43.551976" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:43.549859" elapsed="0.002144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.552407" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.552160" elapsed="0.000311"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.554529" level="INFO">deactivate</msg>
<arg>deactivate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:43.553106" elapsed="0.001478"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.644171" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T00:55:43.644314" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:55:43.554743" elapsed="0.089602"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.645049" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.644760" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.644447" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.644417" elapsed="0.000818"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-05-01T00:55:43.552719" elapsed="0.092569"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-05-01T00:55:43.547312" elapsed="0.098030"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.646809" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.646380" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.646363" elapsed="0.000533"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.647046" elapsed="0.000324"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.652669" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.652210" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:43.652927" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.652777" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.652758" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.653443" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.653146" elapsed="0.000341"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:43.653917" level="INFO">${reference} = bgpcep_userfeatures_txt_020_Bgp_Functional_Multipath_Odl_Npaths_Exa_SendReceived</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.653648" elapsed="0.000296"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-01T00:55:43.654284" level="INFO">${reference} = bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-01T00:55:43.654105" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.654827" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.654481" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.655328" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.655010" elapsed="0.000346"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.656030" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived&amp;order=bug_status"

Setup failed:
Unable to connect ExaBgp to ODL</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-05-01T00:55:43.655528" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.656563" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.656245" elapsed="0.000366"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-05-01T00:55:43.651833" elapsed="0.004834"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.646162" elapsed="0.010555"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-05-01T00:55:43.645562" elapsed="0.011197"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.161969" elapsed="0.494839"/>
</kw>
<doc>n-paths policy selected on odl</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:55:21.962141" elapsed="21.694716">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_020_bgp_functional_multipath_odl_npaths_exa_sendreceived&amp;order=bug_status"

Setup failed:
Unable to connect ExaBgp to ODL</status>
</test>
<test id="s1-s15-t4" name="Delete_Bgp_Peer_Configuration" line="91">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:43.660441" elapsed="0.000278"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:43.660173" elapsed="0.000603"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.661805" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.661691" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.661673" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.667213" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.667083" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.667052" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.668374" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.667914" elapsed="0.000488"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.668877" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:43.668583" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:43.668947" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:43.669109" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:43.667533" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.674767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.674660" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.674641" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.676045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.675914" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.675896" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:43.676579" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.676261" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.676988" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:43.676770" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.709211" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:43.677523" elapsed="0.031788"/>
</kw>
<msg time="2026-05-01T00:55:43.709510" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:43.709558" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.677172" elapsed="0.032423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.741265" level="INFO">". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:43.710106" elapsed="0.031301"/>
</kw>
<msg time="2026-05-01T00:55:43.741615" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:43.741662" level="INFO">${message_wait} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "D "e "l "e "t...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.709767" elapsed="0.031933"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.742077" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.741796" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.741772" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.742661" level="INFO"> ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.742305" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.743043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.742827" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.742791" elapsed="0.000392"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:43.743219" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:43.746088" elapsed="0.000317"/>
</kw>
<msg time="2026-05-01T00:55:43.746500" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.744829" elapsed="0.001822"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.746956" elapsed="0.000112"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.747352" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:43.744111" elapsed="0.003533"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:43.743540" elapsed="0.004171"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:43.675613" elapsed="0.072209"/>
</kw>
<msg time="2026-05-01T00:55:43.747913" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:43.747957" level="INFO">${message} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "D "e "l "e "t...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.674990" elapsed="0.073004"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:43.748209" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:55:43.748079" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.748060" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.748738" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.749077" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.749149" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:43.674309" elapsed="0.074961"/>
</kw>
<msg time="2026-05-01T00:55:43.749364" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:43.749409" level="INFO">${output} =  ". "t "x "t ". "0 "2 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "u "l "t "i "p "a "t "h ". "D "e "l "e "t...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.669531" elapsed="0.079915"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.749802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.749540" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.749523" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:43.669368" elapsed="0.080535"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:43.669191" elapsed="0.080743"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:43.666700" elapsed="0.083290"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:43.661372" elapsed="0.088674"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.660934" elapsed="0.089158"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:43.657945" elapsed="0.092201"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.750951" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.170.157 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.750334" elapsed="0.000646"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:55:43.657332" elapsed="0.093767"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.757977" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.757646" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.759512" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:55:43.792555" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:43.792677" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:55:43.792722" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:55:43.792763" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:43.759305" elapsed="0.033481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.793622" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:55:43.793314" elapsed="0.000354"/>
</kw>
<msg time="2026-05-01T00:55:43.793762" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:55:43.793805" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.792968" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.794432" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.793996" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.795732" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.795275" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.796194" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.795941" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.796676" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.796420" elapsed="0.000300"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:55:43.794908" elapsed="0.001867"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.794555" elapsed="0.002254"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.794536" elapsed="0.002299"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.796990" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.796890" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.796874" elapsed="0.000182"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:55:43.797196" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:43.797107" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.797092" elapsed="0.000189"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.797427" elapsed="0.000024"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:55:43.758745" elapsed="0.038817"/>
</kw>
<msg time="2026-05-01T00:55:43.797627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.758210" elapsed="0.039478"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:55:43.757003" elapsed="0.040762"/>
</kw>
<msg time="2026-05-01T00:55:43.797812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.752953" elapsed="0.044912"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:55:43.752579" elapsed="0.045360"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:55:43.752059" elapsed="0.045928"/>
</kw>
<kw name="Put_As_Xml_To_Uri" owner="TemplatedRequests">
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.803542" level="INFO">/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.803264" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.803993" level="INFO">&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;&lt;peer-groups&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;internal-neighbor&lt;/peer-group-name&gt;&lt;route-reflector&gt;&lt;config&gt;&lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;&lt;/config&gt;&lt;/route-reflector&gt;&lt;timers&gt;&lt;config&gt;&lt;hold-time&gt;180.0&lt;/hold-time&gt;&lt;connect-retry&gt;10.0&lt;/connect-retry&gt;&lt;/config&gt;&lt;/timers&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;64496&lt;/peer-as&gt;&lt;/config&gt;&lt;/peer-group&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;external-neighbor&lt;/peer-group-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;65000&lt;/peer-as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/peer-group&gt;&lt;/peer-groups&gt;&lt;global&gt;&lt;apply-policy&gt;&lt;config&gt;&lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;&lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;&lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;&lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;&lt;/config&gt;&lt;/apply-policy&gt;&lt;config&gt;&lt;router-id&gt;192.0.2.2&lt;/router-id&gt;&lt;as&gt;64496&lt;/as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/global&gt;&lt;neighbors&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.1&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.5&lt;/neighbor-address&gt;&lt;config&gt;&lt;local-as&gt;65001&lt;/local-as&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.6&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;application-peers&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;/neighbors&gt;&lt;/bgp&gt;&lt;/protocol&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.803758" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.804668" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.804399" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.805105" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.804865" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:43.805945" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:43.805750" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:43.806311" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:43.806132" elapsed="0.000205"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.806505" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.807131" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.806874" elapsed="0.000301"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:43.807217" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:43.807372" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:43.805364" elapsed="0.002033"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.827503" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0x4xu1xri99whjdkwxr0krrov24.node0', 'Content-Length': '9528', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;protocol xmlns="http://openconfig.net/yang/network-instance"&gt;&lt;identifier xmlns:x="http://openconfig.net/yang/policy-types"&gt;x:BGP&lt;/identifier&gt;&lt;name&gt;example-bgp-rib&lt;/name&gt;&lt;bgp xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;&lt;peer-groups&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;internal-neighbor&lt;/peer-group-name&gt;&lt;route-reflector&gt;&lt;config&gt;&lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;&lt;/config&gt;&lt;/route-reflector&gt;&lt;timers&gt;&lt;config&gt;&lt;hold-time&gt;180.0&lt;/hold-time&gt;&lt;connect-retry&gt;10.0&lt;/connect-retry&gt;&lt;/config&gt;&lt;/timers&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;64496&lt;/peer-as&gt;&lt;/config&gt;&lt;/peer-group&gt;&lt;peer-group&gt;&lt;peer-group-name&gt;external-neighbor&lt;/peer-group-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;restart-time&gt;60&lt;/restart-time&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;transport&gt;&lt;config&gt;&lt;passive-mode&gt;true&lt;/passive-mode&gt;&lt;remote-port&gt;179&lt;/remote-port&gt;&lt;/config&gt;&lt;/transport&gt;&lt;config&gt;&lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;&lt;peer-as&gt;65000&lt;/peer-as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;graceful-restart&gt;&lt;config&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/config&gt;&lt;/graceful-restart&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/peer-group&gt;&lt;/peer-groups&gt;&lt;global&gt;&lt;apply-policy&gt;&lt;config&gt;&lt;default-export-policy&gt;REJECT-ROUTE&lt;/default-export-policy&gt;&lt;default-import-policy&gt;REJECT-ROUTE&lt;/default-import-policy&gt;&lt;export-policy&gt;default-odl-export-policy&lt;/export-policy&gt;&lt;import-policy&gt;default-odl-import-policy&lt;/import-policy&gt;&lt;/config&gt;&lt;/apply-policy&gt;&lt;config&gt;&lt;router-id&gt;192.0.2.2&lt;/router-id&gt;&lt;as&gt;64496&lt;/as&gt;&lt;/config&gt;&lt;afi-safis&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;ROUTE-TARGET-CONSTRAIN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-MULTICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV6-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;IPV4-MCAST-VPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;afi-safi&gt;&lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;&lt;/afi-safi&gt;&lt;/afi-safis&gt;&lt;/global&gt;&lt;neighbors&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.1&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.5&lt;/neighbor-address&gt;&lt;config&gt;&lt;local-as&gt;65001&lt;/local-as&gt;&lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;neighbor&gt;&lt;neighbor-address&gt;192.0.2.6&lt;/neighbor-address&gt;&lt;config&gt;&lt;peer-group&gt;application-peers&lt;/peer-group&gt;&lt;/config&gt;&lt;/neighbor&gt;&lt;/neighbors&gt;&lt;/bgp&gt;&lt;/protocol&gt; 
 </msg>
<msg time="2026-05-01T00:55:43.827713" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:43.827806" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:43.809645" elapsed="0.018187"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.807483" elapsed="0.020393"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.828057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.827903" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.807453" elapsed="0.020691"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.831720" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.829098" elapsed="0.002666"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.828878" elapsed="0.002921"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.828861" elapsed="0.002964"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.834501" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.832100" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.831879" elapsed="0.002703"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.831863" elapsed="0.002744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.835193" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.834805" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.835546" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.835291" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.836107" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.835808" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.835629" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.835273" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.836777" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.836357" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.837121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.836887" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.837672" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.837362" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:43.837201" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.836870" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.837919" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:43.838736" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:43.838439" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.838918" elapsed="0.002449"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:43.828564" elapsed="0.012864"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:43.841626" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:43.841520" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.841501" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.841862" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.841930" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:43.844252" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:43.800720" elapsed="0.043560"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:43.844341" elapsed="0.000027"/>
</return>
<arg>${OPENCONFIG_RIB_URI}</arg>
<arg>${rib_old}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Specify XML headers and return Put_To_Uri response text.</doc>
<status status="PASS" start="2026-05-01T00:55:43.798190" elapsed="0.046374"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:55:43.844752" elapsed="0.000570"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.845638" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:55:43.845548" elapsed="0.000190"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="PASS" start="2026-05-01T00:55:43.751761" elapsed="0.094044"/>
</kw>
<doc>Functional test suite for bgp - n-path and all-path selection

Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests n-path and all-path selection policy.
It uses odl and exabgp as bgp peers. Routes advertized from odl
are configured via application peer.</doc>
<status status="FAIL" start="2026-05-01T00:54:52.286583" elapsed="51.559256"/>
</suite>
<suite id="s1-s16" name="060 Bgp Functional Mvpn" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.935888" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:43.931424" elapsed="0.004518"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:55:43.931194" elapsed="0.004820"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.940878" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:55:43.937159" elapsed="0.003747"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:55:43.941113" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.940992" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.940968" elapsed="0.000230"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.941725" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:43.941354" elapsed="0.000413"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.942254" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:55:43.941944" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:55:43.942809" elapsed="0.000299"/>
</kw>
<msg time="2026-05-01T00:55:43.943208" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:43.943255" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:43.942463" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.943844" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.943462" elapsed="0.000408"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.944883" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:43.944595" elapsed="0.000314"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.945324" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:43.945073" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.945809" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.945523" elapsed="0.000313"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.949060" elapsed="0.000220"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.949808" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.949483" elapsed="0.000351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.949998" elapsed="0.000227"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.951027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.950735" elapsed="0.000318"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:55:43.951098" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:55:43.951257" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:55:43.950422" elapsed="0.000860"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:43.952035" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18b2cb90&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:55:43.951438" elapsed="0.000782"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.952387" elapsed="0.000244"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:55:43.948441" elapsed="0.004254"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:43.948235" elapsed="0.004506"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:55:43.945903" elapsed="0.006900"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.953393" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:43.952990" elapsed="0.000447"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.954042" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:43.953625" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.954654" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:43.954251" elapsed="0.000447"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:55:43.944125" elapsed="0.010631"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:55:43.936815" elapsed="0.017997"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:43.954990" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:43.954879" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.954860" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.958261" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:43.957866" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.958778" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:43.958476" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:43.958849" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:43.959005" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:43.957537" elapsed="0.001492"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:43.960039" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.959763" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.960900" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:55:43.961016" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:55:43.960693" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:43.964560" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:43.963917" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:43.963897" elapsed="0.000802"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.965400" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:55:43.965656" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:55:43.964947" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.966677" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:43.965984" elapsed="0.000838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.968028" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:43.967103" elapsed="0.000978"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:43.970055" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:55:43.970238" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:43.969517" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.970648" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:55:43.972278" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:55:44.549986" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:55:44 UTC 2026

  System load:  0.01               Processes:             122
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:54:52 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:55:43.971950" elapsed="0.578178"/>
</kw>
<msg time="2026-05-01T00:55:44.550211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.971496" elapsed="0.578985"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:55:43.968574" elapsed="0.582062"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.551543" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:55:44.565290" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:55:44.565698" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:55:44.565928" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:44.551027" elapsed="0.015011"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.566793" elapsed="0.001134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.570682" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:44.569320" elapsed="0.001597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.571658" elapsed="0.000071"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.571280" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.571228" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:55:44.572341" elapsed="0.000085"/>
</return>
<status status="PASS" start="2026-05-01T00:55:44.572022" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.571997" elapsed="0.000621"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.572702" elapsed="0.000022"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.577288" elapsed="0.000657"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.578334" elapsed="0.000555"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.579275" elapsed="0.000408"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:44.573393" elapsed="0.006359"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:55:43.962935" elapsed="0.617000"/>
</kw>
<msg time="2026-05-01T00:55:44.579991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.962272" elapsed="0.617772"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:55:43.961767" elapsed="0.618438"/>
</kw>
<msg time="2026-05-01T00:55:44.580246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.961214" elapsed="0.619084"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.583019" elapsed="0.000335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.583538" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.583851" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:44.580610" elapsed="0.003391"/>
</kw>
<msg time="2026-05-01T00:55:44.584093" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:55:43.960287" elapsed="0.623831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.584571" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:44.584307" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:55:44.584655" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:55:43.959388" elapsed="0.625393"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:43.959206" elapsed="0.625613"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:43.959080" elapsed="0.625774"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:55:43.955298" elapsed="0.629611"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:55:44.585067" elapsed="0.000226"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.599623" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.599512" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.599492" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.599985" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:55:44.600088" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.599850" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.600560" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:44.600283" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.601002" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:44.600761" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:44.601824" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:55:44.601599" elapsed="0.000332">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:55:44.602036" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:55:44.602082" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.601219" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.602407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:44.602181" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.602162" elapsed="0.000493"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:44.603440" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.603160" elapsed="0.000331"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:55:44.603541" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:44.603701" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:55:44.602865" elapsed="0.000860"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.603883" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.604664" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:55:44.604766" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.604546" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.604947" elapsed="0.002238"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.607642" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:55:44.798021" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.607356" elapsed="0.190825"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.801958" elapsed="0.000376"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.802532" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.802858" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:44.799340" elapsed="0.003710"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:44.798622" elapsed="0.004477"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.599201" elapsed="0.203952"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:44.586033" elapsed="0.217169"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.585659" elapsed="0.217597"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:44.585514" elapsed="0.217784"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:55:44.585349" elapsed="0.217988"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:55:43.936311" elapsed="0.867086"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.806084" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.805966" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.805945" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.810977" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.810869" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.810851" elapsed="0.000241"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.812080" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:44.811692" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.812592" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:44.812272" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:44.812663" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:44.812825" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:44.811334" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.818282" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.818174" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.818156" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.819626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:44.819497" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.819478" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:44.820256" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.819894" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.820706" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:44.820470" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.855269" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:44.821432" elapsed="0.033979"/>
</kw>
<msg time="2026-05-01T00:55:44.855573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:44.855621" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.820897" elapsed="0.034762"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.947401" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "6 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "m "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:44.856365" elapsed="0.091282"/>
</kw>
<msg time="2026-05-01T00:55:44.947815" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:44.947862" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.855844" elapsed="0.092055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.948320" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:44.948005" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.947974" elapsed="0.000609"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.949151" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "6 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "m "v "p "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:44.948742" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.949569" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:44.949308" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.949290" elapsed="0.000455"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:44.949784" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.952135" elapsed="0.000536"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.953015" elapsed="0.000316"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:55:44.953682" elapsed="0.000238"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:44.951295" elapsed="0.002715"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:44.950107" elapsed="0.004039"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:44.819188" elapsed="0.135061"/>
</kw>
<msg time="2026-05-01T00:55:44.954342" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:44.954386" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.818523" elapsed="0.135900"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:44.954693" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:44.954582" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.954562" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.955192" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.955583" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:44.955657" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:44.817885" elapsed="0.137883"/>
</kw>
<msg time="2026-05-01T00:55:44.955862" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:44.955906" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.813297" elapsed="0.142646"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:44.956278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:44.956020" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:44.956003" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:44.813150" elapsed="0.143230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:44.812969" elapsed="0.143443"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:44.810575" elapsed="0.146446"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:55:44.804027" elapsed="0.153053"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:44.803577" elapsed="0.153546"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:55:43.930869" elapsed="1.026306"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.957712" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:55:44.957341" elapsed="0.000397"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.958230" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:55:44.957910" elapsed="0.000361"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:44.959999" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:55:44.960075" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:44.959722" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.960257" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:55:44.961541" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:55:45.557194" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:55:45 UTC 2026

  System load:  0.04               Processes:             104
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:54:53 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:55:44.961159" elapsed="0.596194"/>
</kw>
<msg time="2026-05-01T00:55:45.557436" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.960797" elapsed="0.596741"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:55:44.959237" elapsed="0.598416"/>
</kw>
<msg time="2026-05-01T00:55:45.557796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:44.958850" elapsed="0.598996"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:55:44.958488" elapsed="0.599436"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:45.558540" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18b99d10&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:55:45.558160" elapsed="0.000554"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.566844" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:55:45.581175" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:55:45.558897" elapsed="0.022368"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.583206" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:55:45.615755" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:55:45.615976" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:55:45.616055" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:55:45.616127" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:55:45.582947" elapsed="0.033223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.617861" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:55:45.617311" elapsed="0.000631"/>
</kw>
<msg time="2026-05-01T00:55:45.618109" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:55:45.618188" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.616561" elapsed="0.001669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.619332" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.618571" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.620039" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.619520" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.619483" elapsed="0.000687"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:55:45.620409" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-05-01T00:55:45.620252" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.620229" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.620722" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.620670" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:45.620635" elapsed="0.000177"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.621061" elapsed="0.000034"/>
</kw>
<msg time="2026-05-01T00:55:45.621278" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:55:45.582396" elapsed="0.038917"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:55:45.621565" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:55:45.621411" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.621388" elapsed="0.000311"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.621915" elapsed="0.000031"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:55:45.581731" elapsed="0.040302"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:43.930553" elapsed="1.691554"/>
</kw>
<test id="s1-s16-t1" name="Configure_App_Peer" line="49">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:45.626800" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:45.626400" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.628621" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.628425" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.628399" elapsed="0.000334"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.634373" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.634225" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.634201" elapsed="0.000340"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.635589" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.635186" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.636089" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:45.635782" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:45.636163" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:45.636324" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:45.634805" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.642050" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.641941" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.641922" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.643314" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.643204" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.643186" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:45.643878" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.643563" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.644293" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:45.644074" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.675023" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:45.644902" elapsed="0.030242"/>
</kw>
<msg time="2026-05-01T00:55:45.675340" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:45.675398" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.644500" elapsed="0.030944"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.699007" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:45.676039" elapsed="0.023073"/>
</kw>
<msg time="2026-05-01T00:55:45.699274" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:45.699320" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.675670" elapsed="0.023686"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.699701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.699439" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.699417" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.700243" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.699934" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.700618" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.700379" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.700361" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:45.700731" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:45.703321" elapsed="0.000164"/>
</kw>
<msg time="2026-05-01T00:55:45.703548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:45.702215" elapsed="0.001465"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.704155" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.704523" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:45.701595" elapsed="0.003114"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:45.701021" elapsed="0.003752"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:45.642901" elapsed="0.061968"/>
</kw>
<msg time="2026-05-01T00:55:45.704960" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:45.705004" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.642277" elapsed="0.062763"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:45.705255" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:45.705117" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.705098" elapsed="0.000250"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.705778" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.706123" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.706194" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:45.641600" elapsed="0.064702"/>
</kw>
<msg time="2026-05-01T00:55:45.706396" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:45.706439" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "C "o "n "f "i "g "u "r "e "_...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.636774" elapsed="0.069719"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.706824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.706570" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.706552" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:45.636618" elapsed="0.070306"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:45.636412" elapsed="0.070544"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:45.633850" elapsed="0.073163"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:45.628020" elapsed="0.079063"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.627392" elapsed="0.079741"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:45.622920" elapsed="0.084266"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.741306" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.740867" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:45.742198" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:45.741880" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:45.742375" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:45.741535" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.742969" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.742583" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:45.743384" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:45.743568" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:45.743240" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.744009" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.743758" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.745077" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.744818" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.745606" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.745316" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.746530" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:45.746002" elapsed="0.000554"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:45.747296" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.747075" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:45.747374" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:45.747554" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:45.746752" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.747738" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:45.745861" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.748620" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:45.748267" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:45.749382" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.749155" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:45.749470" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:45.749623" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:45.748839" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.749805" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:45.748132" elapsed="0.001934"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:45.745685" elapsed="0.004415"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:45.750142" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:45.750302" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:45.744485" elapsed="0.005842"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.744135" elapsed="0.006224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.750552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.750385" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.744111" elapsed="0.006517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.751354" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:45.750774" elapsed="0.000608"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:45.751430" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:45.740144" elapsed="0.011429"/>
</kw>
<msg time="2026-05-01T00:55:45.751628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:45.727309" elapsed="0.024400"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.764127" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.776499" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.789226" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.789489" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.789678" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.790076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.789926" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:45.789910" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.790307" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.790500" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.790670" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:45.789875" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.789758" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.790899" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.790980" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:45.791122" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:45.722841" elapsed="0.068309"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.818488" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.818088" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:45.819286" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:45.819025" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:45.819543" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:45.818685" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.820137" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.819742" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:45.820509" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:45.820719" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:45.820334" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.821184" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.820919" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:45.821653" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.821304" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.822192" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.821892" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.821742" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.821284" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.823035" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:45.822428" elapsed="0.000637"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:45.823116" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:45.817415" elapsed="0.005839"/>
</kw>
<msg time="2026-05-01T00:55:45.823309" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:45.804545" elapsed="0.018813"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.836116" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.848543" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.862759" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.863033" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.863214" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.863632" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.863480" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:45.863462" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.863860" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.864028" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.864194" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:45.863413" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.863294" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.864424" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.864529" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:45.864675" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:45.801562" elapsed="0.063143"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:45.866289" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:45.865951" elapsed="0.000419">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:45.866495" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:45.865400" elapsed="0.001121"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.866855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.866594" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.867412" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.867118" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.866936" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.866575" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.869862" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.867668" elapsed="0.002221"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:45.869941" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:45.870098" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:45.865049" elapsed="0.005074"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.871533" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.871266" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.871976" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.871738" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.872424" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.872176" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.872947" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.872700" elapsed="0.000292"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:45.873907" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:45.873672" elapsed="0.000264"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:45.874270" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:45.874094" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.874461" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.875073" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.874826" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:45.875161" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:45.875318" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:45.873198" elapsed="0.002145"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:45.889728" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:45.889810" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:55:45 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:45.889951" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:45.877652" elapsed="0.012336"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.875413" elapsed="0.014638"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.890307" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.890088" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.875396" elapsed="0.015042"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.895093" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.891794" elapsed="0.003360"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.891482" elapsed="0.003720"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.891439" elapsed="0.003798"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.898856" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.895649" elapsed="0.003272"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.895314" elapsed="0.003655"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.895292" elapsed="0.003712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.899794" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:45.899237" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.900268" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.899932" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.901077" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.900635" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.900382" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.899907" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.902038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:45.901438" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.902514" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.902176" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.903068" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:45.902766" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:45.902599" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.902150" elapsed="0.001003"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:45.903305" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:45.904128" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:45.903842" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.904311" elapsed="0.002327"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:45.890970" elapsed="0.015731"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:45.906877" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:45.906770" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.906751" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.907119" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.907188" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:45.909546" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:45.870473" elapsed="0.039101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:45.909682" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:45.909849" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:45.711825" elapsed="0.198050"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.910218" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.909973" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.909956" elapsed="0.000355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:45.910346" elapsed="0.000027"/>
</return>
<arg>${MVPN_DIR}/app_peer</arg>
<arg>mapping=${MVPN_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:45.707464" elapsed="0.203025"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-05-01T00:55:45.622191" elapsed="0.288420"/>
</test>
<test id="s1-s16-t2" name="Reconfigure_ODL_To_Accept_Connection" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:45.914201" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:45.913936" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.915491" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.915366" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.915347" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.920499" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.920377" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.920359" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.921564" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:45.921172" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.922062" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:45.921769" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:45.922170" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:45.922331" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:45.920793" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.927833" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.927725" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.927707" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.929091" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:45.928984" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.928966" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:45.929639" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:45.929309" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.930064" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:45.929846" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.960025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:45.930612" elapsed="0.029516"/>
</kw>
<msg time="2026-05-01T00:55:45.960294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:45.960341" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.930254" elapsed="0.030123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:45.990204" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:45.960918" elapsed="0.029400"/>
</kw>
<msg time="2026-05-01T00:55:45.990505" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:45.990553" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.960575" elapsed="0.030016"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.990900" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.990671" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.990651" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:45.991429" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:45.991128" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.991825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.991604" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.991585" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:45.991936" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:45.994505" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:55:45.994714" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:45.993386" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.995125" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.995491" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:45.992765" elapsed="0.002917"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:45.992211" elapsed="0.003535"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:45.928682" elapsed="0.067199"/>
</kw>
<msg time="2026-05-01T00:55:45.995975" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:45.996021" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.928063" elapsed="0.067997"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:45.996246" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:55:45.996138" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.996118" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.996765" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.997110" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:45.997184" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:45.927376" elapsed="0.069918"/>
</kw>
<msg time="2026-05-01T00:55:45.997387" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:45.997431" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "R "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.922748" elapsed="0.074736"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:45.997814" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:45.997562" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:45.997544" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:45.922602" elapsed="0.075329"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:45.922410" elapsed="0.075551"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:45.920021" elapsed="0.077994"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:45.915076" elapsed="0.082995"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:45.914644" elapsed="0.083472"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:45.911548" elapsed="0.086621"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.031950" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.031572" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:46.032750" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:46.032496" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:46.032916" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:46.032145" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.033509" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:46.033106" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:46.033844" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:46.034080" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:46.033701" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.034574" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.034304" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.035591" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.035313" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.036069" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.035800" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.036773" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.036473" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.037543" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.037308" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.037620" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:46.037773" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.036990" elapsed="0.000814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.037988" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:55:46.036320" elapsed="0.001947"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.038842" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.038540" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.039601" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.039374" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.039678" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:46.039831" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.039056" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.040010" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:55:46.038388" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.040840" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.040539" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.041772" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.041557" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.041848" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:46.042023" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.041056" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.042203" elapsed="0.000225"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:55:46.040387" elapsed="0.002097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.043038" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.042737" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.043810" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.043599" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.043886" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:46.044039" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.043256" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.044218" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:55:46.042600" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.045063" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.044754" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.045863" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.045653" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.045940" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:55:46.046113" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.045315" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.046293" elapsed="0.000407"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:46.044618" elapsed="0.002123"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.047295" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:46.046992" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:46.048062" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.047846" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:46.048138" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:46.048289" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:46.047527" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.048484" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:55:46.046856" elapsed="0.001891"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:46.036144" elapsed="0.012638"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:46.048825" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:46.048984" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:46.034984" elapsed="0.014027"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.034690" elapsed="0.014353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.049222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.049069" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.034671" elapsed="0.014629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.050150" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:46.049466" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:46.050229" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:46.030935" elapsed="0.019419"/>
</kw>
<msg time="2026-05-01T00:55:46.050408" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:46.018222" elapsed="0.032249"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.063055" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.075449" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.087969" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.088166" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.088344" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.088734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.088587" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:46.088573" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.088957" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.089127" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.089294" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:46.088543" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.088418" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.089540" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.089617" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:46.089747" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:46.013749" elapsed="0.076026"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.116034" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.115661" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:46.116783" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:46.116574" elapsed="0.000273">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:46.116939" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:46.116225" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.117523" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:46.117127" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:46.117849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:46.117980" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:46.117711" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.118443" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.118194" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:46.118907" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.118612" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.119432" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.119139" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.118991" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.118593" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.120311" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:46.119680" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:46.120390" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:46.115028" elapsed="0.005511"/>
</kw>
<msg time="2026-05-01T00:55:46.120594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:46.102436" elapsed="0.018204"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.133108" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.145610" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.158247" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.158442" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.158635" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.158997" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.158852" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:46.158838" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.159218" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.159388" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.159569" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:46.158809" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.158708" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.159831" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.159907" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:46.160029" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:46.099793" elapsed="0.060264"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:46.161309" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:46.161070" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:46.161479" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:46.160731" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.161820" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.161576" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.162383" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.162068" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.161900" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.161558" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.164808" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:46.162635" elapsed="0.002200"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:46.164886" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:46.165040" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:46.160388" elapsed="0.004676"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.166484" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.166212" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.166922" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.166687" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.167358" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.167119" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.167811" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.167566" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:46.168676" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:46.168474" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:46.169025" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:46.168856" elapsed="0.000194"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.169200" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.169824" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.169578" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:46.169909" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:46.170063" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:46.168057" elapsed="0.002062"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:46.180858" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '295', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:55:46.180937" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:46.181066" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:46.172444" elapsed="0.008659"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.170192" elapsed="0.010973"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.181420" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.181202" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.170174" elapsed="0.011395"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.186201" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.182944" elapsed="0.003352"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.182637" elapsed="0.003709"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.182611" elapsed="0.003770"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.189981" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.186803" elapsed="0.003243"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.186486" elapsed="0.003607"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.186436" elapsed="0.003692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.190919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:46.190377" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.191386" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.191054" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.192170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.191752" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.191522" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.191029" elapsed="0.001257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.193051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:46.192539" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.193534" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.193186" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.194317" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.193874" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:46.193645" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.193162" elapsed="0.001274"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:46.194668" elapsed="0.000479"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:46.195670" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:46.195375" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.195852" elapsed="0.002294"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:46.182073" elapsed="0.016136"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:46.198479" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:55:46.198352" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.198331" elapsed="0.000239"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.198720" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.198790" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:46.201038" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:46.165389" elapsed="0.035676"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:46.201130" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:46.201284" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:46.002906" elapsed="0.198403"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.201661" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.201406" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.201389" elapsed="0.000364"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:46.201786" elapsed="0.000026"/>
</return>
<arg>${MVPN_DIR}/bgp_peer</arg>
<arg>mapping=${MVPN_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:45.998434" elapsed="0.203476"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:55:45.910953" elapsed="0.291068"/>
</test>
<test id="s1-s16-t3" name="Start_Bgp_Peer" line="65">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:46.205710" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:46.205429" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.206981" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:46.206872" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.206854" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.212016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:46.211910" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.211893" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.213091" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:46.212713" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.213592" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:46.213281" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:46.213664" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:46.213821" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:46.212310" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.219330" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:46.219222" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.219203" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.220601" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:46.220483" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.220437" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:46.221114" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:46.220817" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:46.221544" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:46.221304" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:46.253442" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:46.222109" elapsed="0.031467"/>
</kw>
<msg time="2026-05-01T00:55:46.253738" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:46.253785" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:46.221770" elapsed="0.032051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:46.277558" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:46.254341" elapsed="0.023319"/>
</kw>
<msg time="2026-05-01T00:55:46.277820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:46.277866" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:46.253997" elapsed="0.023905"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.278205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.277980" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.277959" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.278781" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.278450" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.279136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.278913" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.278895" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:46.279246" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:46.281751" elapsed="0.000142"/>
</kw>
<msg time="2026-05-01T00:55:46.281952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:46.280688" elapsed="0.001393"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.282354" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.282737" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:46.280058" elapsed="0.002863"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:46.279530" elapsed="0.003454"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:46.220154" elapsed="0.062926"/>
</kw>
<msg time="2026-05-01T00:55:46.283171" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:46.283215" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:46.219577" elapsed="0.063675"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:46.283435" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-05-01T00:55:46.283329" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.283311" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.283945" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.284282" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:46.284353" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:46.218885" elapsed="0.065599"/>
</kw>
<msg time="2026-05-01T00:55:46.284614" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:46.284658" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "S "t "a "r "t "_ "B "g "p "_...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:46.214214" elapsed="0.070480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:46.285025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:46.284769" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:46.284752" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:46.214069" elapsed="0.071056"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:46.213900" elapsed="0.071253"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:46.211554" elapsed="0.073652"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:46.206586" elapsed="0.078674"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:46.206135" elapsed="0.079168"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:46.203160" elapsed="0.082199"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Start_Bgp_Peer">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.287098" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:46.286777" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:46.287542" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:46.287288" elapsed="0.000300"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:46.290947" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:55:46.291040" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:46.287739" elapsed="0.003334"/>
</kw>
<arg>--amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug --mvpn --wfr 1</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:55:46.286311" elapsed="0.004824"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.293340" level="FAIL">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:55:46.292733" elapsed="6.001804">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.294853" elapsed="0.000041"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:55:46.292446" elapsed="6.002565">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:55:46.292042" elapsed="6.003100"/>
</kw>
<msg time="2026-05-01T00:55:52.295252" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:46.291689" elapsed="6.003589"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:55:52.295480" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:55:52.295373" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.295347" elapsed="0.000226"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.295814" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.296018" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:55:46.291393" elapsed="6.004705"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-05-01T00:55:46.285985" elapsed="6.010160"/>
</kw>
<arg>3x</arg>
<arg>1s</arg>
<arg>Start Bgp Peer</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:46.285560" elapsed="6.010625"/>
</kw>
<doc>Start Python speaker to connect to ODL. We need to do WUKS until odl really starts to accept incomming bgp connection. The failure happens if the incomming connection comes too quickly after configuring the peer in the previous test case.</doc>
<status status="PASS" start="2026-05-01T00:55:46.202362" elapsed="6.094070"/>
</test>
<test id="s1-s16-t4" name="Odl_To_Play_intra_as_ipmsi_ad" line="70">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:52.300026" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:52.299753" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.301511" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.301363" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.301341" elapsed="0.000249"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.306654" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.306533" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.306512" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.307851" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.307381" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.308362" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:52.308046" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:52.308434" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:55:52.308617" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.306994" elapsed="0.001649"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.316221" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.316085" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.316060" elapsed="0.000253"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.317726" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.317618" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.317600" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:52.318270" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.317943" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.318729" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:52.318505" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.351216" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:52.319251" elapsed="0.032094"/>
</kw>
<msg time="2026-05-01T00:55:52.351554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:52.351602" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.318916" elapsed="0.032724"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.379244" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:52.352180" elapsed="0.027175"/>
</kw>
<msg time="2026-05-01T00:55:52.379539" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:52.379585" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.351820" elapsed="0.027801"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.379936" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.379702" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.379681" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.380522" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.380161" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.380990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.380768" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.380750" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:52.381101" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:52.383720" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:55:52.383930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.382600" elapsed="0.001466"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.384346" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.384764" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:52.381966" elapsed="0.002989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:52.381405" elapsed="0.003614"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:52.317285" elapsed="0.067831"/>
</kw>
<msg time="2026-05-01T00:55:52.385208" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:52.385253" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.316564" elapsed="0.068727"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:52.385492" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:55:52.385367" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.385349" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.385985" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.386328" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.386399" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:52.315650" elapsed="0.070872"/>
</kw>
<msg time="2026-05-01T00:55:52.386616" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:52.386659" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.309170" elapsed="0.077527"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.387024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.386772" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.386755" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:52.309016" elapsed="0.078107"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:52.308701" elapsed="0.078456"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:52.306113" elapsed="0.081099"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:52.301061" elapsed="0.086207"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.300587" elapsed="0.086725"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:52.297354" elapsed="0.090012"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.388273" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/announce_intra_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/announce_intra_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.388534" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.388054" elapsed="0.000542"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:55:52.388981" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.388767" elapsed="0.000240"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.389351" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/withdraw_intra_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/withdraw_intra_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.389497" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.389164" elapsed="0.000377"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:55:52.389957" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.389733" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:52.390275" elapsed="0.052518"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.390060" elapsed="0.052791"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.390043" elapsed="0.052842"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.479507" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.479102" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.480337" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.480048" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:52.480533" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:52.479710" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.481145" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.480758" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.481491" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.481664" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.481336" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.482090" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.481848" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.483222" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.482963" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.483721" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.483432" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.484415" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.484115" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.485528" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.485056" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.485611" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:55:52.485776" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.484728" elapsed="0.001073"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.485959" elapsed="0.000242"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:52.483977" elapsed="0.002318"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.486873" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.486571" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.487841" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.487411" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.487919" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:52.488073" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.487091" elapsed="0.001007"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.488253" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:52.486416" elapsed="0.002116"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.483800" elapsed="0.004792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.488637" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:52.488798" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:52.482525" elapsed="0.006299"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.482210" elapsed="0.006646"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.489036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.488883" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.482187" elapsed="0.006927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.489856" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.489260" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.489934" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.478473" elapsed="0.011587"/>
</kw>
<msg time="2026-05-01T00:55:52.490115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.465589" elapsed="0.024574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.502791" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.515326" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.527716" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.527957" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.528139" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.528530" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.528366" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:52.528352" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.528792" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.528962" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.529131" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:52.528322" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.528216" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.529360" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.529437" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:52.529576" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:52.461281" elapsed="0.068322"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.554525" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.554132" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.555277" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.555053" elapsed="0.000292">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:52.555437" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:52.554718" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.556026" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.555643" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.556347" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.556506" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.556214" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.556970" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.556723" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:52.557387" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.557092" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.557976" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.557681" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.557524" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.557073" elapsed="0.000987"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.558665" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.558207" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.558745" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.553483" elapsed="0.005389"/>
</kw>
<msg time="2026-05-01T00:55:52.558928" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.540808" elapsed="0.018167"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.571486" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.583884" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.596429" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.596645" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.597021" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.597398" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.597248" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:52.597233" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.597656" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.597828" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.597996" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:52.597204" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.597102" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.598248" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.598364" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:52.598517" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:52.539901" elapsed="0.058646"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.599850" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.599582" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:52.600014" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:52.599221" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.600365" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.600111" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.600977" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.600667" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.600478" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.600093" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.603544" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.601223" elapsed="0.002348"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:52.603624" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:52.603782" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:52.598890" elapsed="0.004918"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.605425" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.605169" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.605893" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.605652" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.606357" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.606109" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.606819" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.606575" elapsed="0.000287"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:52.607693" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:52.607493" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:52.608052" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:52.607877" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.608229" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.608911" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.608607" elapsed="0.000350"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:52.609037" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:52.609203" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:52.607071" elapsed="0.002159"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:52.625303" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '666', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:52.625391" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AQwAAQECAwQBAgoKCgo%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:52.625568" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:52.611619" elapsed="0.014004"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.609303" elapsed="0.016421"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.626134" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.625783" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.609285" elapsed="0.017047"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.633852" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.628719" elapsed="0.005177"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.628185" elapsed="0.005747"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.628145" elapsed="0.005811"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.636570" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.634236" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.634013" elapsed="0.002642"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.633996" elapsed="0.002684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.637278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.636880" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.637634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.637376" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.638179" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.637881" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.637716" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.637358" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.638803" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.638425" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.639136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.638899" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.639692" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.639378" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.639216" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.638881" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.639926" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:52.640827" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.640500" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.641013" elapsed="0.002293"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:52.627176" elapsed="0.016194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:52.643565" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:55:52.643443" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.643425" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.643806" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.643874" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:52.646314" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:52.604141" elapsed="0.042200"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.646413" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:52.646594" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:52.448835" elapsed="0.197784"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.646964" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.646724" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.646706" elapsed="0.000350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.647089" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:52.443249" elapsed="0.203965"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.650516" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.648155" elapsed="0.002391"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.650724" elapsed="0.002405"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:55:52.653182" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:55:52.647876" elapsed="0.005437"/>
</kw>
<msg time="2026-05-01T00:55:52.653388" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:52.647389" elapsed="0.006024"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.654284" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:55:52.654359" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:52.654018" elapsed="0.000364"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.654807" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:55:52.654880" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:52.654554" elapsed="0.000350"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.655063" elapsed="0.000304"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.655725" level="INFO">${sum_1} = 933</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:52.655544" elapsed="0.000206"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.656075" level="INFO">${sum_2} = 933</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:52.655901" elapsed="0.000199"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.656295" elapsed="0.000321"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:55:52.653650" elapsed="0.003026"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:52.657022" elapsed="0.002078"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.706685" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.706278" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.707500" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.707221" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:52.707677" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:52.706885" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.708255" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.707870" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.708600" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.708797" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.708461" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.709252" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.709009" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.710501" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.710175" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.710981" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.710711" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.711820" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.711381" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.713013" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.712479" elapsed="0.000617"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.713234" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:52.713482" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.712043" elapsed="0.001466"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.713669" elapsed="0.000421"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:52.711240" elapsed="0.002892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.714819" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.714387" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.715948" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.715472" elapsed="0.000561"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.716172" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:52.716394" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.715035" elapsed="0.001385"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.716592" elapsed="0.000412"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:52.714249" elapsed="0.002847"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.711062" elapsed="0.006071"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.717177" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:52.717337" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:52.709696" elapsed="0.007666"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.709370" elapsed="0.008025"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.717589" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.717420" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.709349" elapsed="0.008318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.718385" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.717814" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.718479" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.705662" elapsed="0.012951"/>
</kw>
<msg time="2026-05-01T00:55:52.718668" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.692860" elapsed="0.025857"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.731308" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.743653" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.756268" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.756483" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.756663" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.757043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.756882" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:52.756868" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.757267" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.757436" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.757620" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:52.756839" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.756739" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.757889" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.757966" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:52.758085" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:52.688528" elapsed="0.069583"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.759208" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.758960" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:52.768634" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:52.768682" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:52.768773" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:52.761404" elapsed="0.007395"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.759321" elapsed="0.009518"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.769059" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.768865" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.759303" elapsed="0.009841"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.773694" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.770379" elapsed="0.003376"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.770069" elapsed="0.003734"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.770044" elapsed="0.003795"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.777514" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.774230" elapsed="0.003349"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.773916" elapsed="0.003707"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.773892" elapsed="0.003756"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.778215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.777829" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.778576" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.778314" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.779131" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.778833" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.778664" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.778296" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.779755" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.779378" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.780086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.779850" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.780641" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.780332" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.780168" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.779833" elapsed="0.000937"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.780945" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:52.781778" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.781481" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.781962" elapsed="0.002423"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:52.769521" elapsed="0.014943"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:52.784514" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:52.786843" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:52.758374" elapsed="0.028496"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.786926" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:52.660617" elapsed="0.126435"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.659986" elapsed="0.127122"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:55:52.659424" elapsed="0.127744"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.790641" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.788119" elapsed="0.002552"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.790850" elapsed="0.002139"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:55:52.793041" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:55:52.787834" elapsed="0.005336"/>
</kw>
<msg time="2026-05-01T00:55:52.793245" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:52.787339" elapsed="0.005932"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.794364" level="INFO">Length is 128.</msg>
<msg time="2026-05-01T00:55:52.794489" level="INFO">${len_1} = 128</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:52.793995" elapsed="0.000529"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.795091" level="INFO">Length is 128.</msg>
<msg time="2026-05-01T00:55:52.795193" level="INFO">${len_2} = 128</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:52.794742" elapsed="0.000483"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.795443" elapsed="0.000449"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.796354" level="INFO">${sum_1} = 782</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:52.796109" elapsed="0.000281"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:52.796868" level="INFO">${sum_2} = 782</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:52.796626" elapsed="0.000277"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:52.797133" elapsed="0.000441"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:55:52.793504" elapsed="0.004152"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.842433" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.842062" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.843310" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.842978" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:52.843495" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:52.842644" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.844074" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.843690" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:52.844403" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:52.844562" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:52.844266" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.844989" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.844748" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.846041" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.845787" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.846550" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.846256" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.847505" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.846952" elapsed="0.000580"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.848670" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.848206" elapsed="0.000505"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.848831" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:52.849083" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.847726" elapsed="0.001383"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.849266" elapsed="0.000518"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:52.846813" elapsed="0.003013"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.850602" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:52.850080" elapsed="0.000549"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:52.851766" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.851300" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:52.851927" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:52.852148" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:52.850821" elapsed="0.001353"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.852330" elapsed="0.000515"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:52.849942" elapsed="0.002945"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.846639" elapsed="0.006284"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:52.852966" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:52.853140" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:52.845417" elapsed="0.007748"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.845120" elapsed="0.008076"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.853374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.853222" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.845101" elapsed="0.008369"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.854361" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.853622" elapsed="0.000768"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.854498" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.841402" elapsed="0.013232"/>
</kw>
<msg time="2026-05-01T00:55:52.854694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.828644" elapsed="0.026113"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.867485" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.879945" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.892423" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.892637" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.892815" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.893198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.893036" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:52.893022" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.893422" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.893609" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.893778" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:52.892992" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.892889" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.894003" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.894079" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:52.894197" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:52.824135" elapsed="0.070088"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.895388" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:52.895141" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:52.903019" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:52.903371" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:52.903528" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:55:52.903571" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.897603" elapsed="0.006362">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:52.895515" elapsed="0.008528">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.904235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.904077" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:55:52.895497" elapsed="0.008824">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.908909" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.905431" elapsed="0.003527">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:52.905205" elapsed="0.003844">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:55:52.905186" elapsed="0.003932">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.912740" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.909556" elapsed="0.003230">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:52.909219" elapsed="0.003654">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:55:52.909195" elapsed="0.003724">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.913797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.913311" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.914134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.913895" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.914698" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.914382" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.914216" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.913877" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.915302" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.914943" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:52.915651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:52.915397" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.916224" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:52.915932" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.915764" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.915380" elapsed="0.000927"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:52.916475" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:52.917273" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:52.916988" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:55:52.919723" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.917471" elapsed="0.002284">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.904721" elapsed="0.015168">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:52.919950" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:52.922375" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:55:52.922406" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:55:52.894540" elapsed="0.027894">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:52.922515" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:55:52.799114" elapsed="0.123574">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.798535" elapsed="0.124215"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:55:52.797967" elapsed="0.124843"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:55:52.387682" elapsed="0.535179"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.296873" elapsed="0.626102"/>
</test>
<test id="s1-s16-t5" name="Play_To_Odl_intra_as_ipmsi_ad" line="74">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:52.927397" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:52.927128" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.928672" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.928563" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.928544" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.933790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.933673" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.933651" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.934862" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:52.934481" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:52.935381" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:52.935052" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:52.935466" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:52.935624" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:52.934087" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.941176" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.941053" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.941035" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:52.942400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:52.942293" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:52.942275" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:52.942946" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:52.942649" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.943355" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:52.943138" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.972521" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:52.943907" elapsed="0.028719"/>
</kw>
<msg time="2026-05-01T00:55:52.972801" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:52.972848" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.943563" elapsed="0.029320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:52.999772" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:52.973438" elapsed="0.026443"/>
</kw>
<msg time="2026-05-01T00:55:53.000042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:53.000087" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.973057" elapsed="0.027066"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.000426" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.000201" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.000181" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.001036" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:53.000675" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.001559" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.001247" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.001222" elapsed="0.000444"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:53.001713" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:53.004713" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:55:53.004925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:53.003416" elapsed="0.001641"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.005361" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.005733" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:53.002641" elapsed="0.003282"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:53.002057" elapsed="0.003932"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:52.941991" elapsed="0.064097"/>
</kw>
<msg time="2026-05-01T00:55:53.006181" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:53.006227" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.941399" elapsed="0.064864"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:53.006506" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:53.006378" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.006359" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.007006" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.007350" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.007422" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:52.940717" elapsed="0.066854"/>
</kw>
<msg time="2026-05-01T00:55:53.007675" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:53.007720" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.936014" elapsed="0.071742"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.008110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.007841" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.007822" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:52.935868" elapsed="0.072344"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:52.935701" elapsed="0.072542"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:52.933273" elapsed="0.075026"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:52.928258" elapsed="0.080096"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:52.927831" elapsed="0.080566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:52.923795" elapsed="0.084670"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.009630" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.009093" elapsed="0.000566"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.010286" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.009831" elapsed="0.000483"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.010881" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.010501" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.011296" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/announce_intra_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/announce_intra_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:53.011470" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:53.011085" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.011849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/withdraw_intra_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/withdraw_intra_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:53.011983" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:53.011658" elapsed="0.000359"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:53.012182" elapsed="0.005286"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:55:53.017692" elapsed="0.001937"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.074944" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:53.074497" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.075932" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.075642" elapsed="0.000387">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:53.076136" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:53.075211" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.076875" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:53.076386" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.077231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:53.077437" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:53.077086" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.077939" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:53.077667" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.079176" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:53.078858" elapsed="0.000367"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.079704" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.079391" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.080589" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:53.080139" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:53.082315" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.081600" elapsed="0.000822"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:53.082524" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:55:53.082866" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:53.080831" elapsed="0.002062"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.083083" elapsed="0.000427"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:55:53.079995" elapsed="0.003557"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.084280" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:53.083829" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:53.085925" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.085240" elapsed="0.000788"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:53.086110" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:53.086432" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:53.084744" elapsed="0.001732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:53.086638" elapsed="0.000390"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:53.083671" elapsed="0.003400"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:53.079807" elapsed="0.007299"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:53.087151" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:53.087312" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:53.078431" elapsed="0.008907"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:53.078069" elapsed="0.009365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.087664" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.087491" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.078045" elapsed="0.009703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.088577" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:53.087906" elapsed="0.000700"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:53.088657" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:53.073715" elapsed="0.015077"/>
</kw>
<msg time="2026-05-01T00:55:53.088851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:53.060113" elapsed="0.028790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.102407" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.115493" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.129248" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.129629" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.129848" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.130327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.130166" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:53.130148" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.130587" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.130791" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.130988" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:53.130106" elapsed="0.000949"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.129953" elapsed="0.001134"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.131270" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.131378" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:55:53.131736" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:53.055483" elapsed="0.076293"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.133707" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.133275" elapsed="0.000523">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:53.133901" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:53.132765" elapsed="0.001163"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.134305" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.134008" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.134980" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:53.134621" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:53.134398" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.133986" elapsed="0.001087"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.138127" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:53.135269" elapsed="0.002891"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:53.138234" elapsed="0.000057"/>
</return>
<msg time="2026-05-01T00:55:53.138487" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:53.132297" elapsed="0.006218"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:53.140434" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.140088" elapsed="0.000446">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:53.140633" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:53.139646" elapsed="0.001013"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:53.140938" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:55:53.140746" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:53.140718" elapsed="0.000336"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.141214" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.141442" elapsed="0.000041"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.141534" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:53.143782" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:53.139183" elapsed="0.004629"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.145691" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:53.145264" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:53.146177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:53.145922" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:53.155316" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:53.155722" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:53.155929" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.148693" elapsed="0.007693">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:53.146303" elapsed="0.010228">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.156842" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.156583" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-05-01T00:55:53.146277" elapsed="0.010664">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.157534" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.157739" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:53.157678" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:53.157648" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.158087" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.158194" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.144243" elapsed="0.014122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.158541" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.031789" elapsed="0.126916">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:53.159144" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:53.158865" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:53.158838" elapsed="0.000452"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:53.159339" elapsed="0.000023"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:55:53.026308" elapsed="0.133211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.215034" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.214624" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.215999" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.215731" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.216175" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.215343" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.216774" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.216369" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.217111" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.217274" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.216967" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.217746" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.217476" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.218927" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.218609" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.219407" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.219137" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.220269" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.219859" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.221551" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.220964" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.221746" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:55:55.222057" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.220509" elapsed="0.001575"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.222244" elapsed="0.000411"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:55:55.219720" elapsed="0.002978"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.223557" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.222952" elapsed="0.000632"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.224856" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.224281" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.225036" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:55.225333" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.223818" elapsed="0.001541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.225532" elapsed="0.000371"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.222816" elapsed="0.003129"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.219512" elapsed="0.006471"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.226026" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:55.226182" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:55.218258" elapsed="0.007950"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.217895" elapsed="0.008345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.226419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.226266" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.217870" elapsed="0.008678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.227283" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.226702" elapsed="0.000609"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.227360" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.213976" elapsed="0.013526"/>
</kw>
<msg time="2026-05-01T00:55:55.227558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.200972" elapsed="0.026636"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.240285" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.252749" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.265321" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.265573" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.265795" elapsed="0.000026"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.266235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.266077" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.266058" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.266486" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.266660" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.266827" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.266014" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.265886" elapsed="0.001023"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.267062" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.267144" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:55:55.267314" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.196564" elapsed="0.070779"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.268925" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.268615" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.269100" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.268179" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.269485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.269197" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.270057" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.269763" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.269569" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.269178" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.272761" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.270297" elapsed="0.002491"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:55.272842" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:55.273001" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.267807" elapsed="0.005218"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.274247" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.274015" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.274402" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.273679" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:55.274649" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:55.274513" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.274495" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.274882" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.275056" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.275122" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:55.277069" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.273337" elapsed="0.003758"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.278524" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.278254" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.278975" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.278730" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:55.287100" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:55.287520" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '323'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:55:55.287622" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:55.281254" elapsed="0.006394"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.279086" elapsed="0.008657"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.287932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.287772" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.279067" elapsed="0.008952"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.291629" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.289048" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.288825" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.288806" elapsed="0.002962"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.294782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.292052" elapsed="0.002794"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.291826" elapsed="0.003069"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.291809" elapsed="0.003120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.295753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.295166" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.296229" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.295892" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.297021" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.296598" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.296344" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.295866" elapsed="0.001272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.297895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.297366" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.298362" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.298031" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.299138" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.298729" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.298496" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.298006" elapsed="0.001248"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.299488" elapsed="0.000516"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:55.300675" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.300243" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.300872" elapsed="0.002317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:55.288386" elapsed="0.014867"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.303428" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:55.303324" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.303305" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.306531" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.303663" elapsed="0.002897"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:55:55.306649" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:55.306818" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:55.277413" elapsed="0.029432"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.306908" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:55.307061" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:55.173832" elapsed="0.133256"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.335587" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.335092" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.336474" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.336179" elapsed="0.000418">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.336779" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.335834" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.337411" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.336975" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.337787" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.337951" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.337621" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.338403" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.338138" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:55.338945" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.338537" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.339702" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.339178" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.339029" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.338517" elapsed="0.001300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.340478" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.339968" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.340557" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.334465" elapsed="0.006218"/>
</kw>
<msg time="2026-05-01T00:55:55.340778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.321621" elapsed="0.019209"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.353307" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.365647" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.377991" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.378194" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.378376" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.378784" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.378634" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.378619" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.379008" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.379177" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.379345" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.378588" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.378473" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.379590" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.379666" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:55.379834" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.318864" elapsed="0.060998"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.380042" elapsed="0.002348"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.383588" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.383148" elapsed="0.000514"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.384258" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.383854" elapsed="0.000432"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.384444" elapsed="0.000350"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.382734" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.382487" elapsed="0.002400"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.385064" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.384913" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.382466" elapsed="0.002674"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:55:55.308266" elapsed="0.076923"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:55:55.307419" elapsed="0.077847"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.307173" elapsed="0.078138"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.307156" elapsed="0.078179"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.385369" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:55:55.167951" elapsed="0.217565"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:53.019895" elapsed="2.365682"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.435219" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.434845" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.436070" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.435761" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.436238" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.435413" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.436835" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.436432" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.437162" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.437307" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.437025" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.437754" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.437511" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.438964" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.438504" elapsed="0.000506"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.439472" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.439176" elapsed="0.000362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.440370" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.439958" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.442060" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.441277" elapsed="0.000922"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.442307" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:55:55.442741" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.440615" elapsed="0.002164"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.442999" elapsed="0.000542"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:55:55.439770" elapsed="0.003831"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.444562" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.443977" elapsed="0.000621"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.446276" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.445523" elapsed="0.000894"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.446552" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:55:55.446962" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.444869" elapsed="0.002130"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.447217" elapsed="0.000531"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.443765" elapsed="0.004042"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.439592" elapsed="0.008302"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.447958" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:55:55.448180" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:55.438163" elapsed="0.010053"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.437866" elapsed="0.010394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.448604" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.448296" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.437847" elapsed="0.010885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.449521" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.448933" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.449600" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.434211" elapsed="0.015515"/>
</kw>
<msg time="2026-05-01T00:55:55.449780" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.421410" elapsed="0.028417"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.462180" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.474514" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.487028" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.487237" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.487422" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.487826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.487677" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.487663" elapsed="0.000301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.488113" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.488284" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.488468" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.487633" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.487516" elapsed="0.001033"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.488699" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.488781" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:55.488911" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.417091" elapsed="0.071846"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.490222" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.489963" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.490382" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.489616" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.490742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.490493" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.491292" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.491001" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.490822" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.490474" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.495175" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.491546" elapsed="0.003656"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:55.495255" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:55.495528" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.489270" elapsed="0.006284"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.496855" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.496622" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.497011" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.496268" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:55.497241" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:55.497107" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.497088" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.497488" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.497661" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.497726" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:55.499646" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.495939" elapsed="0.003734"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.501066" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.500820" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.501524" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.501266" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:55.509993" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:55.510132" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '323'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:55:55.510242" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:55.503705" elapsed="0.006564"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.501635" elapsed="0.008676"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.510517" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.510337" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.501617" elapsed="0.008988"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.514661" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.511638" elapsed="0.003092"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.511398" elapsed="0.003381"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.511379" elapsed="0.003436"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.518728" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.515208" elapsed="0.003587"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.514893" elapsed="0.003965"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.514870" elapsed="0.004036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.519750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.519170" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.520397" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.520028" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.521069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.520765" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.520548" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.519991" elapsed="0.001163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.521703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.521319" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.522039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.521802" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.522593" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.522284" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.522121" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.521784" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.522831" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:55.523646" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.523341" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.523836" elapsed="0.002306"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:55.510976" elapsed="0.015231"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.526385" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:55.526278" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.526259" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.529477" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.526621" elapsed="0.002887"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:55:55.529562" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:55.529722" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:55.499997" elapsed="0.029752"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.529812" elapsed="0.000113"/>
</return>
<msg time="2026-05-01T00:55:55.530056" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:55.394490" elapsed="0.135594"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.560938" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.560482" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.561770" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.561494" elapsed="0.000395">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.562105" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.561134" elapsed="0.000998"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.562765" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.562300" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.563118" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.563265" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.562959" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.563739" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.563468" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:55.564280" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.563858" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.565041" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.564535" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.564368" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.563839" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.565779" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.565276" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.565858" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.559829" elapsed="0.006155"/>
</kw>
<msg time="2026-05-01T00:55:55.566042" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.546792" elapsed="0.019299"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.578587" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.591004" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.603459" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.603711" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.603893" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.604346" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.604196" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.604181" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.604589" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.604761" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.604931" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.604146" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.603978" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.605164" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.605241" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:55.605387" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.544146" elapsed="0.061270"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.605612" elapsed="0.002367"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.609232" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.608795" elapsed="0.000466"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.609832" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.609418" elapsed="0.000442"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.610018" elapsed="0.000328"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.608347" elapsed="0.002059"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.608099" elapsed="0.002342"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.610637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.610484" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.608080" elapsed="0.002634"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:55:55.531228" elapsed="0.079536"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:55:55.530409" elapsed="0.080433"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.530166" elapsed="0.080723"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.530149" elapsed="0.080764"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.610948" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:55:55.390168" elapsed="0.220909"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:55.385764" elapsed="0.225410"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.661310" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.660937" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.662091" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.661857" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.662257" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.661517" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.662851" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.662462" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.663177" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.663323" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.663041" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.663771" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.663524" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.665012" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.664537" elapsed="0.000522"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.665526" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.665226" elapsed="0.000327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.666322" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.665918" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.667577" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.667015" elapsed="0.000666"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.667759" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:55.668088" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.666560" elapsed="0.001557"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.668276" elapsed="0.000399"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.665780" elapsed="0.002938"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.669373" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.668974" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.670625" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.670065" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.670806" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:55.671098" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.669605" elapsed="0.001519"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.671278" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.668836" elapsed="0.002872"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.665604" elapsed="0.006179"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.671832" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:55.671994" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:55.664193" elapsed="0.007827"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.663884" elapsed="0.008183"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.672246" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.672093" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.663864" elapsed="0.008459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.673055" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.672482" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.673131" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.660306" elapsed="0.012950"/>
</kw>
<msg time="2026-05-01T00:55:55.673311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.647593" elapsed="0.025766"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.685940" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.698349" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.710757" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.710955" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.711132" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.711516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.711355" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.711340" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.711742" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.711911" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.712077" elapsed="0.000042"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.711310" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.711207" elapsed="0.000971"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.712370" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.712461" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:55.712588" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.643305" elapsed="0.069310"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.713902" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.713651" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.714063" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.713280" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.714409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.714158" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.714982" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.714691" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.714507" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.714140" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.717668" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.715217" elapsed="0.002479"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:55.717748" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:55.717906" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.712948" elapsed="0.004983"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.719152" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.718922" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.719308" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.718587" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:55.719557" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:55:55.719403" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.719385" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.719797" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.719969" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.720035" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:55.721964" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.718240" elapsed="0.003751"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.723394" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.723147" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.723853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.723612" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:55.732214" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:55.732360" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '323'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:55:55.732479" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:55.726114" elapsed="0.006394"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.723962" elapsed="0.008594"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.732800" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.732592" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.723944" elapsed="0.008977"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.738010" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.734377" elapsed="0.003702"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.734057" elapsed="0.004071"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.734032" elapsed="0.004132"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.741581" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.738577" elapsed="0.003051"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.738244" elapsed="0.003419"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.738220" elapsed="0.003469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.742259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.741871" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.742619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.742357" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.743169" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.742871" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.742703" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.742340" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.743792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.743416" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.744144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.743888" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.744707" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.744393" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.744226" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.743870" elapsed="0.000921"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.744946" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:55.745763" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.745468" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.745945" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:55.733440" elapsed="0.014881"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.748561" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:55.748391" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.748372" elapsed="0.000280"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.751611" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.748806" elapsed="0.002835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:55:55.751694" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:55.751861" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:55.722309" elapsed="0.029578"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.751951" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:55:55.752102" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:55.620040" elapsed="0.132089"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.780638" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.780085" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.781516" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.781194" elapsed="0.000451">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.781822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.780853" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.782476" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.782017" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.782837" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.782997" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.782670" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.783463" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.783182" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:55.784007" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.783588" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.784797" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.784259" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.784094" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.783567" elapsed="0.001316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.785545" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.785033" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.785677" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.779442" elapsed="0.006376"/>
</kw>
<msg time="2026-05-01T00:55:55.786015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.766549" elapsed="0.019515"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.798511" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.810924" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.823523" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.823735" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.823916" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.824351" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.824161" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.824146" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.824598" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.824769" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.824934" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.824113" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.823999" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.825165" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.825243" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:55.825393" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.763824" elapsed="0.061597"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.825668" elapsed="0.002389"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.829308" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.828870" elapsed="0.000467"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.829905" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.829508" elapsed="0.000425"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.830091" elapsed="0.000331"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:55:55.828429" elapsed="0.002070"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.828140" elapsed="0.002393"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.830709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.830559" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.828122" elapsed="0.002664"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:55:55.753316" elapsed="0.077519"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:55:55.752518" elapsed="0.078395"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.752253" elapsed="0.078707"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.752235" elapsed="0.078750"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.831020" elapsed="0.000033"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:55:55.615657" elapsed="0.215499"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:55.611353" elapsed="0.219864"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:55:55.831385" elapsed="0.002752"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.886578" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.886132" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.887415" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.887132" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.887609" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.886788" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.888190" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.887803" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.888582" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.888778" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.888420" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.889269" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.889022" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.890573" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.890242" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.891062" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.890786" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.891900" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.891491" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.893989" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.893350" elapsed="0.000744"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.894178" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:55:55.894523" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.892124" elapsed="0.002425"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.894711" elapsed="0.000397"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.891327" elapsed="0.003824"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.895832" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.895404" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:55.897101" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.896561" elapsed="0.000641"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:55.897279" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:55.897588" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:55.896049" elapsed="0.001566"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.897770" elapsed="0.000365"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:55.895268" elapsed="0.002908"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.891143" elapsed="0.007069"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:55.898255" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:55.898410" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:55.889717" elapsed="0.008718"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.889392" elapsed="0.009109"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.898682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.898529" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.889368" elapsed="0.009394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.899497" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.898907" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.899575" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:55.885352" elapsed="0.014348"/>
</kw>
<msg time="2026-05-01T00:55:55.899754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.872662" elapsed="0.027142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.913914" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.927523" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.940011" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.940273" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.940560" elapsed="0.000027"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.941023" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.940867" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:55.940849" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.941252" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.941419" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.941604" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:55.940806" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.940666" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.941833" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.941913" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:55.942078" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.868350" elapsed="0.073756"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.943770" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.943425" elapsed="0.000424">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:55.943945" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.943018" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.944311" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.944042" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.945265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.944679" elapsed="0.000612"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.944428" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.944023" elapsed="0.001328"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.947758" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:55.945523" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:55.947838" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:55.948140" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.942475" elapsed="0.005690"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.949532" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.949310" elapsed="0.000277"/>
</kw>
<msg time="2026-05-01T00:55:55.949673" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:55.948964" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.949913" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:55.949776" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.949755" elapsed="0.000227"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:55.950294" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:55.950474" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:55.950130" elapsed="0.000370"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:55:55.950898" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.950659" elapsed="0.000265"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:55:55.950970" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:55.951125" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:55.948591" elapsed="0.002558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.952656" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.952319" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.953112" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.952870" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:55.960857" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:55.961299" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '468'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:55:55.961402" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:55.955320" elapsed="0.006109"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.953223" elapsed="0.008277"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.961690" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.961529" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.953205" elapsed="0.008575"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.965587" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.962842" elapsed="0.002815"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.962619" elapsed="0.003087"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.962601" elapsed="0.003140"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.969683" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:55.966202" elapsed="0.003551"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.965819" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.965796" elapsed="0.004040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.970654" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.970088" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.971125" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.970791" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.971907" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.971492" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.971237" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.970767" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.972818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.972249" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:55.973153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:55.972915" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:55.973705" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:55.973397" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:55.973233" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.972897" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.973942" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:55.974767" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:55.974465" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:55.974948" elapsed="0.002300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:55.962174" elapsed="0.015139"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:55.977510" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:55.977386" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:55.977367" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:55.980609" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:55.977736" elapsed="0.002903"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:55:55.980691" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:55.980856" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:55.951493" elapsed="0.029390"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:55.980947" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:55:55.981098" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:55.845329" elapsed="0.135795"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.010702" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:56.010184" elapsed="0.000604"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:56.011625" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:56.011308" elapsed="0.000444">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:56.011930" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:56.010965" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.012667" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:56.012125" elapsed="0.000572"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:56.013039" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:56.013203" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:56.012870" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.013675" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:56.013390" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:56.014218" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:56.013801" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.014989" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:56.014471" elapsed="0.000546"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:56.014307" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:56.013778" elapsed="0.001297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.015733" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:56.015224" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:56.015814" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:56.009555" elapsed="0.006392"/>
</kw>
<msg time="2026-05-01T00:55:56.016001" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:55.995590" elapsed="0.020459"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.036089" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.049975" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.062600" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.062823" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.063013" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.063413" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:56.063263" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:56.063247" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.063655" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.063831" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.063999" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:56.063213" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:56.063098" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.064228" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:56.064304" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:56.064431" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:55.992945" elapsed="0.071554"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:56.064683" elapsed="0.002373"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:56.068158" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:56.067844" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:56.069002" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:56.068346" elapsed="0.000685"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:55:56.069563" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "10.10.10.10",
       "route-distinguisher": "1.2.3.4:258"
      },
      "path-id": 0,
      "route-key": "AQwAAQECAwQBAgoKCgo="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:55:56.069763" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:55:56.069194" elapsed="0.000643">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:55:56.067387" elapsed="0.002634">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:56.067138" elapsed="0.002967">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:56.070298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:56.070142" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-05-01T00:55:56.067119" elapsed="0.003260">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.982273" elapsed="0.088270">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.981468" elapsed="0.089229">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:55.981207" elapsed="0.089599">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:55:55.981190" elapsed="0.089666">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:56.070909" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:55:55.839438" elapsed="0.231622">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.127174" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.126709" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.128109" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.127828" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.128284" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.127433" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.128899" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.128497" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.129238" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.129469" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.129093" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.129915" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.129665" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.131175" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.130850" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.131711" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.131390" elapsed="0.000355"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.132578" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.132140" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.133886" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.133291" elapsed="0.000700"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.134075" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:55:58.134419" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.132815" elapsed="0.001645"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.134626" elapsed="0.000398"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:55:58.131997" elapsed="0.003069"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.135775" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.135327" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.137061" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.136496" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.137249" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:55:58.137579" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.136004" elapsed="0.001669"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.137835" elapsed="0.000384"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:58.135188" elapsed="0.003073"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.131809" elapsed="0.006490"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.138394" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:55:58.138578" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:58.130493" elapsed="0.008112"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.130052" elapsed="0.008587"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.138834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.138671" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.130025" elapsed="0.008887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.139958" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.139064" elapsed="0.000925"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.140040" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.125773" elapsed="0.014396"/>
</kw>
<msg time="2026-05-01T00:55:58.140227" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.111534" elapsed="0.028748"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.153900" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.167168" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.180058" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.180377" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.180596" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.181091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.180928" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.180908" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.181328" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.181520" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.181780" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.180861" elapsed="0.000976"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.180683" elapsed="0.001184"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.182022" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.182106" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:55:58.182272" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.106265" elapsed="0.076038"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.183891" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.183592" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.184066" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.183164" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.184442" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.184167" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.185086" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.184775" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.184544" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.184147" elapsed="0.001027"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.188165" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.185331" elapsed="0.002870"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:58.188267" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:55:58.188520" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:58.182786" elapsed="0.005773"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.190267" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.189994" elapsed="0.000332"/>
</kw>
<msg time="2026-05-01T00:55:58.190462" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.189507" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.190762" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.190570" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.190548" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.191182" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.191350" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.191007" elapsed="0.000368"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:55:58.191808" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.191555" elapsed="0.000283"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:55:58.191886" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:58.192051" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:58.189021" elapsed="0.003057"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.193728" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.193436" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.194202" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.193935" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:58.202072" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:58.202335" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:55:58.202553" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:58.196862" elapsed="0.005722"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.194318" elapsed="0.008315"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.202869" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.202665" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.194298" elapsed="0.008694"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.208119" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.204561" elapsed="0.003630"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.204216" elapsed="0.004026"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.204189" elapsed="0.004090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.211686" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.208735" elapsed="0.002998"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.208360" elapsed="0.003409"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.208336" elapsed="0.003459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.212418" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.212001" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.212827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.212571" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.213387" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.213082" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.212911" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.212550" elapsed="0.000958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.214071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.213690" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.214491" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.214171" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.215046" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.214748" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.214580" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.214152" elapsed="0.000977"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.215289" elapsed="0.000399"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:58.216161" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.215857" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.216345" elapsed="0.002408"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:58.203591" elapsed="0.015305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.219088" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.218973" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.218954" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:58.222171" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.219317" elapsed="0.002883"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:55:58.222253" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:55:58.222529" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:58.192512" elapsed="0.030047"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.222627" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:58.222810" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:58.083443" elapsed="0.139395"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.254301" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.253741" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.255317" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.254987" elapsed="0.000480">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.255650" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.254605" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.256309" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.255859" elapsed="0.000478"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.256689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.256863" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.256521" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.257329" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.257056" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:58.257906" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.257470" elapsed="0.000502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.258809" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.258172" elapsed="0.000677"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.258000" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.257432" elapsed="0.001489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.259614" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.259085" elapsed="0.000614"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.259759" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.253030" elapsed="0.006875"/>
</kw>
<msg time="2026-05-01T00:55:58.259960" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.239364" elapsed="0.020647"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.272871" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.285942" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.301964" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.302224" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.302416" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.302891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.302719" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.302703" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.303123" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.303292" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.303474" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.302667" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.302546" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.303711" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.303789" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:55:58.303929" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.236603" elapsed="0.067355"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.304218" elapsed="0.002422"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:58.307759" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.307416" elapsed="0.000371"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:55:58.308218" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.307944" elapsed="0.000302"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.308429" elapsed="0.000423"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.306984" elapsed="0.001932"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.306725" elapsed="0.002226"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.309130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.308977" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.306706" elapsed="0.002503"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:55:58.224092" elapsed="0.085168"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:55:58.223203" elapsed="0.086137"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.222925" elapsed="0.086463"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.222908" elapsed="0.086505"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.309463" elapsed="0.000033"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:55:58.078586" elapsed="0.231018"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:55.834311" elapsed="2.475355"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:55:58.309890" elapsed="0.002834"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:55:53.008717" elapsed="5.304074"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:52.923307" elapsed="5.389611"/>
</test>
<test id="s1-s16-t6" name="Odl_To_Play_inter_as_ipmsi_ad" line="78">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:58.317332" elapsed="0.000327"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:58.316947" elapsed="0.000792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.319332" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.319167" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.319139" elapsed="0.000295"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.325821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.325710" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.325691" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.326956" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.326562" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.327442" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:58.327148" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:58.327531" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:55:58.327695" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.326138" elapsed="0.001582"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.333316" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.333205" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.333185" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.334659" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.334539" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.334517" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:58.335194" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.334886" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.335623" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:58.335383" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.365657" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:58.336147" elapsed="0.029618"/>
</kw>
<msg time="2026-05-01T00:55:58.365932" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:58.365978" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.335812" elapsed="0.030203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.392222" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "e "r "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:58.366606" elapsed="0.025729"/>
</kw>
<msg time="2026-05-01T00:55:58.392515" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:58.392562" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.366193" elapsed="0.026406"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.392910" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.392680" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.392659" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.393433" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "e "r "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.393134" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.393808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.393591" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.393573" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:58.393920" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:58.396541" elapsed="0.000314"/>
</kw>
<msg time="2026-05-01T00:55:58.396920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.395499" elapsed="0.001561"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.397340" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.397705" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:58.394850" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:58.394216" elapsed="0.003743"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:58.334181" elapsed="0.063875"/>
</kw>
<msg time="2026-05-01T00:55:58.398164" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:58.398210" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.333559" elapsed="0.064689"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:58.398510" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-05-01T00:55:58.398382" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.398362" elapsed="0.000270"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.399038" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.399374" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.399444" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:58.332859" elapsed="0.066713"/>
</kw>
<msg time="2026-05-01T00:55:58.399665" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:58.399710" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.328178" elapsed="0.071569"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.400083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.399828" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.399810" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:58.327964" elapsed="0.072219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:58.327780" elapsed="0.072435"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:58.325321" elapsed="0.074951"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:58.318750" elapsed="0.081577"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.317959" elapsed="0.082415"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:58.313827" elapsed="0.086599"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.401324" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/announce_inter_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/announce_inter_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.401524" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.401109" elapsed="0.000442"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:55:58.401925" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.401712" elapsed="0.000240"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.402301" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/withdraw_inter_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/withdraw_inter_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.402428" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.402111" elapsed="0.000358"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:55:58.402922" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.402688" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:58.403235" elapsed="0.002575"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.403020" elapsed="0.002826"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.403003" elapsed="0.002869"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.442746" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.442287" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.443663" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.443384" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.443841" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.443038" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.444424" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.444034" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.444774" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.444922" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.444635" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.445352" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.445108" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.446366" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.446112" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.446919" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.446613" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.447648" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.447312" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.448810" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.448301" elapsed="0.000540"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.448899" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:55:58.449098" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.447926" elapsed="0.001202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.449317" elapsed="0.000307"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:58.447173" elapsed="0.002504"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.450307" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.449970" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.451481" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.451002" elapsed="0.000510"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.451568" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:55:58.451753" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.450624" elapsed="0.001156"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.452093" elapsed="0.000248"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:58.449808" elapsed="0.002581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.446997" elapsed="0.005434"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.452503" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:55:58.452698" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:58.445788" elapsed="0.006944"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.445485" elapsed="0.007282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.452982" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.452796" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.445462" elapsed="0.007612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.454206" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.453286" elapsed="0.001000"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.454344" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.441573" elapsed="0.012951"/>
</kw>
<msg time="2026-05-01T00:55:58.454622" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.428702" elapsed="0.025983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.467894" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.480365" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.492620" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.492821" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.492999" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.493377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.493229" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.493214" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.493619" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.493788" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.493954" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.493183" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.493078" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.494181" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.494257" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:55:58.494381" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.424140" elapsed="0.070267"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.519383" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.519004" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.520160" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.519929" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.520323" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.519593" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.520912" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.520529" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.521240" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.521394" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.521102" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.521840" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;64496&lt;/source-as&gt;
    &lt;/inter-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.521598" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:55:58.522263" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.521965" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.522876" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.522509" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.522346" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.521946" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.523598" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.523125" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.523679" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.518345" elapsed="0.005462"/>
</kw>
<msg time="2026-05-01T00:55:58.523863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.505552" elapsed="0.018360"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.536739" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.549544" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.562199" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.562417" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.562614" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.563107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.562939" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.562919" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.563336" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.563522" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.563693" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.562879" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.562739" elapsed="0.001033"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.563922" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.563999" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:58.564147" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.504680" elapsed="0.059498"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.565579" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.565272" elapsed="0.000383">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.565749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.564894" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.566099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.565845" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.566702" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.566365" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.566179" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.565827" elapsed="0.000967"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.569128" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.566950" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:58.569249" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:55:58.569409" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:58.564542" elapsed="0.004891"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.571082" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.570781" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.571543" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;64496&lt;/source-as&gt;
    &lt;/inter-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.571287" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.571992" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.571749" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.572425" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.572187" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:58.573294" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:55:58.573096" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:55:58.573705" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:55:58.573528" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.573888" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.574516" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.574256" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:55:58.574603" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:58.574790" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:55:58.572690" elapsed="0.002127"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:58.588426" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '690', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AgwAAQECAwQBAgAA+/A=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;64496&lt;/source-as&gt;
    &lt;/inter-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:55:58.588514" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AgwAAQECAwQBAgAA%2B%2FA%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:58.588623" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:58.578367" elapsed="0.010281"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.574888" elapsed="0.013807"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.588885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.588721" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.574870" elapsed="0.014138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.593543" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.590070" elapsed="0.003574"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.589845" elapsed="0.003878"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.589824" elapsed="0.003956"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.599824" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.594409" elapsed="0.005484"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.593905" elapsed="0.006031"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.593868" elapsed="0.006095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.600560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.600143" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.600906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.600659" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.601466" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.601154" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.600987" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.600641" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.602089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.601716" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.602422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.602185" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.603044" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.602684" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.602519" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.602167" elapsed="0.000965"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.603288" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:58.604112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.603819" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.604294" elapsed="0.002463"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:58.589380" elapsed="0.017453"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:58.607191" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:55:58.607063" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.606899" elapsed="0.000388"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.607441" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.607527" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:58.609802" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:55:58.569782" elapsed="0.040047"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.609899" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:58.610052" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:55:58.410702" elapsed="0.199375"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.610427" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.610182" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.610165" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.610616" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:55:58.406148" elapsed="0.204620"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.614503" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.611760" elapsed="0.002773"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.614759" elapsed="0.002749"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:55:58.617580" elapsed="0.000042"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:55:58.611482" elapsed="0.006279"/>
</kw>
<msg time="2026-05-01T00:55:58.617867" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:58.610986" elapsed="0.006917"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.619199" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:55:58.619305" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:58.618779" elapsed="0.000560"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.619951" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:55:58.620053" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:58.619587" elapsed="0.000499"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.620309" elapsed="0.000450"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.621235" level="INFO">${sum_1} = 1385</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:58.620983" elapsed="0.000287"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.621751" level="INFO">${sum_2} = 1385</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:58.621502" elapsed="0.000284"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.622008" elapsed="0.000425"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:55:58.618208" elapsed="0.004329"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:58.622807" elapsed="0.002040"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.671231" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.670805" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.672087" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.671817" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.672263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.671466" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.672862" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.672474" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.673199" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.673366" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.673055" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.673907" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.673657" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.675310" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.674990" elapsed="0.000365"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.675827" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.675550" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.676665" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.676228" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.677805" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.677305" elapsed="0.000583"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.678028" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:55:58.678261" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.676887" elapsed="0.001401"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.678463" elapsed="0.000473"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:58.676087" elapsed="0.002892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.679670" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.679237" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.680796" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.680302" elapsed="0.000576"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.681011" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:58.681234" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.679887" elapsed="0.001374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.681418" elapsed="0.000415"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:58.679098" elapsed="0.002776"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.675906" elapsed="0.006004"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.681954" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:55:58.682111" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:58.674367" elapsed="0.007769"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.674033" elapsed="0.008136"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.682345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.682193" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.674010" elapsed="0.008411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.683209" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.682585" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.683288" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.670047" elapsed="0.013366"/>
</kw>
<msg time="2026-05-01T00:55:58.683485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.657243" elapsed="0.026294"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.696192" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.708959" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.721658" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.721868" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.722049" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.722441" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.722290" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.722275" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.722683" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.722901" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.723103" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.722241" elapsed="0.000916"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.722130" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.723336" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.723412" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:58.723561" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.652825" elapsed="0.070764"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.724735" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.724466" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:58.735492" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:58.735562" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:58.735694" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:55:58.727151" elapsed="0.008580"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.724851" elapsed="0.010939"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.736049" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.735828" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.724833" elapsed="0.011429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.741209" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.737740" elapsed="0.003531"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.737397" elapsed="0.003923"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.737372" elapsed="0.003983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.745198" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.741767" elapsed="0.003496"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.741434" elapsed="0.003884"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.741410" elapsed="0.003945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.746240" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.745645" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.746747" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.746382" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.747632" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.747191" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.746951" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.746356" elapsed="0.001394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.748507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.747984" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.748975" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.748643" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.749749" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.749317" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.749088" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.748618" elapsed="0.001247"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.750084" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:58.751347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.750870" elapsed="0.000514"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.751631" elapsed="0.002386"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:55:58.736814" elapsed="0.017272"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:58.754141" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:55:58.756434" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:55:58.723861" elapsed="0.032613"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.756532" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:55:58.625866" elapsed="0.130795"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.625422" elapsed="0.131296"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:55:58.625032" elapsed="0.131749"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.760325" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.757748" elapsed="0.002606"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.760556" elapsed="0.002113"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:55:58.762721" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:55:58.757445" elapsed="0.005445"/>
</kw>
<msg time="2026-05-01T00:55:58.762974" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:58.756959" elapsed="0.006040"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.763981" level="INFO">Length is 128.</msg>
<msg time="2026-05-01T00:55:58.764057" level="INFO">${len_1} = 128</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:58.763705" elapsed="0.000376"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.764505" level="INFO">Length is 128.</msg>
<msg time="2026-05-01T00:55:58.764580" level="INFO">${len_2} = 128</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:55:58.764238" elapsed="0.000365"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.764761" elapsed="0.000311"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.765413" level="INFO">${sum_1} = 1234</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:58.765232" elapsed="0.000206"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:55:58.765789" level="INFO">${sum_2} = 1234</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:55:58.765615" elapsed="0.000198"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:55:58.765967" elapsed="0.000303"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:55:58.763315" elapsed="0.003015"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.811513" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.811077" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.812434" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.812076" elapsed="0.000452">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:58.812624" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:58.811732" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.813206" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.812819" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.813558" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.813723" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.813399" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.814158" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.813912" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.815332" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.815041" elapsed="0.000336"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.815832" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.815558" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.816806" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.816227" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.818077" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.817588" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.818257" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:55:58.818532" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.817052" elapsed="0.001508"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.818792" elapsed="0.000599"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:55:58.816087" elapsed="0.003348"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.820237" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:58.819712" elapsed="0.000553"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:58.821598" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.821125" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:58.821760" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:58.821991" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:58.820473" elapsed="0.001544"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.822173" elapsed="0.000518"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:58.819572" elapsed="0.003161"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.815911" elapsed="0.006857"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:58.822812" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:55:58.823012" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:58.814632" elapsed="0.008411"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.814282" elapsed="0.008799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.823279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.823112" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.814258" elapsed="0.009106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.824247" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.823612" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.824323" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.810294" elapsed="0.014175"/>
</kw>
<msg time="2026-05-01T00:55:58.824528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.797049" elapsed="0.027544"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.837472" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.850129" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.862832" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.863185" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.863373" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.863792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.863640" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:58.863623" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.864019" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.864188" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.864355" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:58.863587" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.863471" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.864600" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.864678" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:55:58.864818" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:58.792458" elapsed="0.072387"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.866188" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.865767" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:58.873440" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:58.873608" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:58.873757" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:55:58.873801" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.868576" elapsed="0.005782">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:58.866303" elapsed="0.008187">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.874761" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.874541" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-05-01T00:55:58.866285" elapsed="0.008595">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.880124" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.876394" elapsed="0.003833">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:58.876083" elapsed="0.004237">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:55:58.876058" elapsed="0.004309">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.883994" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.880805" elapsed="0.003223">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:58.880486" elapsed="0.003603">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:55:58.880442" elapsed="0.003679">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.884754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.884319" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.885099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.884853" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.885671" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.885351" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.885181" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.884835" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.886284" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.885922" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.886633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.886381" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.887226" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:58.886877" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.886713" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.886363" elapsed="0.000948"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.887483" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:55:58.888298" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:58.888001" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:55:58.890744" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.888500" elapsed="0.002276">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.875474" elapsed="0.015437">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:55:58.891059" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:55:58.893427" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:55:58.893472" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:55:58.865117" elapsed="0.028386">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:55:58.893571" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.767742" elapsed="0.126003">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.767028" elapsed="0.126783"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:55:58.766578" elapsed="0.127338"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:55:58.400739" elapsed="0.493231"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.313211" elapsed="0.580879"/>
</test>
<test id="s1-s16-t7" name="Play_To_Odl_inter_as_ipmsi_ad" line="82">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:55:58.897343" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:55:58.897070" elapsed="0.000582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.898705" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.898584" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.898562" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.903775" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.903668" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.903650" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.904854" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:58.904467" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.905334" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:55:58.905044" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:55:58.905404" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:58.905581" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:55:58.904074" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.911084" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.910973" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.910939" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.912342" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:58.912234" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.912217" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:55:58.912901" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.912587" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.913318" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:58.913093" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.942752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:55:58.913873" elapsed="0.029006"/>
</kw>
<msg time="2026-05-01T00:55:58.943083" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:55:58.943131" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.913528" elapsed="0.029640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:55:58.969814" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "e "r "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:55:58.943987" elapsed="0.025949"/>
</kw>
<msg time="2026-05-01T00:55:58.970105" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:55:58.970150" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.943361" elapsed="0.026826"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.970587" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.970289" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.970258" elapsed="0.000415"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.971243" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "e "r "_ "a "s "_ "i "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:58.970902" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.971624" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.971386" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.971367" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:55:58.971740" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:55:58.974326" elapsed="0.000170"/>
</kw>
<msg time="2026-05-01T00:55:58.974560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:58.973290" elapsed="0.001407"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.974975" elapsed="0.000112"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.975350" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:55:58.972653" elapsed="0.002905"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:55:58.972072" elapsed="0.003550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:55:58.911936" elapsed="0.063782"/>
</kw>
<msg time="2026-05-01T00:55:58.975812" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:58.975856" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.911308" elapsed="0.064586"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:55:58.976079" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:55:58.975972" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.975954" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.976591" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.976936" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:55:58.977006" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:55:58.910613" elapsed="0.066502"/>
</kw>
<msg time="2026-05-01T00:55:58.977209" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:55:58.977254" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.905988" elapsed="0.071303"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:58.977633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:58.977367" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:58.977350" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:55:58.905841" elapsed="0.071893"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:55:58.905663" elapsed="0.072103"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:55:58.903292" elapsed="0.074531"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:55:58.898266" elapsed="0.079618"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:55:58.897810" elapsed="0.080121"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:55:58.894772" elapsed="0.083213"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.979125" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.978637" elapsed="0.000516"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.979831" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.979359" elapsed="0.000504"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:58.980404" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:58.980031" elapsed="0.000399"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.980815" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/announce_inter_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/announce_inter_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.980989" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.980611" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:58.981361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/withdraw_inter_as_ipmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/withdraw_inter_as_ipmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:58.981515" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:58.981172" elapsed="0.000370"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:55:58.981696" elapsed="0.002564"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:55:58.984420" elapsed="0.001855"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.036574" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:59.036147" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:59.037414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:59.037135" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:59.037608" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:59.036790" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.038193" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:59.037803" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:55:59.038543" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:55:59.038721" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:55:59.038385" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.039172" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:59.038910" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.040326" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:59.040013" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.040842" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:55:59.040569" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.041669" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:59.041240" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:59.042992" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:59.042415" elapsed="0.000725"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:59.043223" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:55:59.043556" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:59.041893" elapsed="0.001690"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:59.043744" elapsed="0.000395"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:55:59.041101" elapsed="0.003081"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.045066" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:55:59.044436" elapsed="0.000656"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:55:59.046314" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:55:59.045771" elapsed="0.000644"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:55:59.046516" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:55:59.046815" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:55:59.045286" elapsed="0.001558"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:55:59.047003" elapsed="0.000385"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:55:59.044300" elapsed="0.003131"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:55:59.040921" elapsed="0.006580"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:55:59.047548" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:55:59.047708" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:55:59.039678" elapsed="0.008055"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:59.039301" elapsed="0.008464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.047950" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:59.047794" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:59.039276" elapsed="0.008750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.048802" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:55:59.048175" elapsed="0.000655"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:55:59.048880" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:55:59.035485" elapsed="0.013521"/>
</kw>
<msg time="2026-05-01T00:55:59.049062" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:55:59.022614" elapsed="0.026501"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.061760" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.074299" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.086755" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.087020" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.087235" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.087686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:59.087531" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:59.087513" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.087919" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.088089" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.088256" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:55:59.087469" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.087322" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.088503" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.088585" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:55:59.088743" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:55:59.018170" elapsed="0.070602"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:59.090224" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:59.089913" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:59.090394" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:59.089509" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.090774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:59.090508" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.091379" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:55:59.091041" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:59.090855" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:59.090488" elapsed="0.000992"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.094045" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:55:59.091636" elapsed="0.002438"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:55:59.094129" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:55:59.094295" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:59.089131" elapsed="0.005189"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:55:59.095659" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:55:59.095375" elapsed="0.000418">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:55:59.095890" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:55:59.095010" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:55:59.096130" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:55:59.095990" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:55:59.095971" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.096368" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.096562" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.096630" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:55:59.098557" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:55:59.094668" elapsed="0.003916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.100063" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:59.099806" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:55:59.100519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:55:59.100264" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:55:59.108704" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:55:59.108898" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:55:59.109043" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:55:59.102700" elapsed="0.006873">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:55:59.100631" elapsed="0.009061">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.109963" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:59.109740" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-05-01T00:55:59.100612" elapsed="0.009473">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.110648" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.110836" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:55:59.110783" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:59.110760" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.111157" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.111258" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:55:59.098910" elapsed="0.012497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.111636" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.995651" elapsed="0.116124">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:55:59.112168" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:55:59.111911" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:55:59.111888" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:55:59.112347" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:55:58.991211" elapsed="0.121296">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.169006" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.168551" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.169837" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.169579" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.170049" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.169222" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.170878" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.170322" elapsed="0.000594"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.171340" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.171577" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.171143" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.172180" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.171834" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.173712" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.173263" elapsed="0.000513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.174375" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.174001" elapsed="0.000410"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.175549" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.174957" elapsed="0.000630"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.177265" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.176524" elapsed="0.000896"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.177520" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:01.177822" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.175858" elapsed="0.001993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.178019" elapsed="0.000392"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:01.174764" elapsed="0.003710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.179153" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.178734" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.180579" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.180008" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.180794" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:01.181109" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.179544" elapsed="0.001591"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.181293" elapsed="0.000392"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.178596" elapsed="0.003131"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.174515" elapsed="0.007249"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.181808" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:01.181968" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:01.172812" elapsed="0.009182"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.172347" elapsed="0.009679"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.182206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.182053" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.172315" elapsed="0.009969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.183042" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.182434" elapsed="0.000636"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.183120" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.167905" elapsed="0.015341"/>
</kw>
<msg time="2026-05-01T00:56:01.183300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.154863" elapsed="0.028488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.195962" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.208326" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.220768" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.220969" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.221149" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.221542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.221374" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.221360" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.221766" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.221937" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.222111" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.221330" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.221225" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.222338" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.222414" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:01.222560" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.150550" elapsed="0.072038"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.223880" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.223634" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.224040" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.223248" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.224384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.224135" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.225000" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.224664" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.224482" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.224117" elapsed="0.000966"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.227608" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.225238" elapsed="0.002398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:01.227689" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:01.227846" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.222919" elapsed="0.004952"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.229122" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.228886" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.229319" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.228525" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:01.229571" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:01.229416" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.229398" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.229809" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.229984" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.230050" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.231957" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.228182" elapsed="0.003802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.233423" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.233171" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.233888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.233645" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:01.242423" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:01.242823" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '311'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:56:01.242938" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:01.236056" elapsed="0.006908"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.233998" elapsed="0.009009"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.243190" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.243033" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.233980" elapsed="0.009295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.246779" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.244305" elapsed="0.002523"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.244082" elapsed="0.002781"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.244065" elapsed="0.002823"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.249654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.247172" elapsed="0.002530"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.246945" elapsed="0.002794"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.246927" elapsed="0.002839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.250555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.249952" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.251066" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.250703" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.251903" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.251436" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.251189" elapsed="0.000856"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.250676" elapsed="0.001404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.252965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.252327" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.253494" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.253117" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.254192" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.253863" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.253618" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.253090" elapsed="0.001186"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.254431" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:01.255258" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.254967" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.255442" elapsed="0.002372"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:01.243658" elapsed="0.014221"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.258056" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:01.257949" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.257931" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.261133" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.258274" elapsed="0.002889"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:01.261216" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.261377" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:01.232303" elapsed="0.029101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.261485" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:01.261638" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:01.127734" elapsed="0.133931"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.291392" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.290922" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.292242" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.291956" elapsed="0.000411">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.292574" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.291616" elapsed="0.000983"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.293253" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.292769" elapsed="0.000558"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.293687" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.293863" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.293521" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.294319" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "inter-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "source-as": 64496
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.294052" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:01.294864" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.294436" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.295630" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.295104" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.294956" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.294417" elapsed="0.001298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.296351" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.295865" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.296429" elapsed="0.000053"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.290278" elapsed="0.006305"/>
</kw>
<msg time="2026-05-01T00:56:01.296640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.276963" elapsed="0.019726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.309324" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.321770" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.334144" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.334340" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.334570" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.334960" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.334812" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.334797" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.335182" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.335356" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.335540" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.334766" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.334656" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.335774" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.335850" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:01.335987" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.273402" elapsed="0.062612"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.336193" elapsed="0.002394"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.339765" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.339329" elapsed="0.000465"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.340342" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.339950" elapsed="0.000420"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.340543" elapsed="0.000361"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.338916" elapsed="0.002048"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.338669" elapsed="0.002328"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.341176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.341024" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.338650" elapsed="0.002603"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:01.262802" elapsed="0.078500"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:01.261991" elapsed="0.079387"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.261748" elapsed="0.079675"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.261731" elapsed="0.079730"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.341498" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:01.123215" elapsed="0.218412"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:55:58.986489" elapsed="2.355198"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.391257" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.390872" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.392085" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.391824" elapsed="0.000335">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.392254" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.391481" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.392854" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.392466" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.393209" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.393492" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.393067" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.393931" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.393685" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.395218" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.394698" elapsed="0.000567"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.395735" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.395433" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.396571" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.396144" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.397864" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.397287" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.398048" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:01.398351" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.396793" elapsed="0.001585"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.398553" elapsed="0.000386"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:01.396002" elapsed="0.002979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.399656" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.399237" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.400931" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.400330" elapsed="0.000709"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.401117" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.401416" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.399875" elapsed="0.001568"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.401618" elapsed="0.000377"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.399098" elapsed="0.002940"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.395815" elapsed="0.006259"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.402175" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:01.402338" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:01.394355" elapsed="0.008009"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.394051" elapsed="0.008345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.402592" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.402422" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.394030" elapsed="0.008641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.403395" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.402816" elapsed="0.000608"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.403490" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.390237" elapsed="0.013380"/>
</kw>
<msg time="2026-05-01T00:56:01.403672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.377480" elapsed="0.026241"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.416247" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.428598" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.440983" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.441180" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.441357" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.441742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.441594" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.441579" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.441965" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.442134" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.442303" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.441550" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.441432" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.442585" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.442664" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.442788" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.373156" elapsed="0.069660"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.444079" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.443834" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.444242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.443488" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.444602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.444337" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.445196" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.444867" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.444683" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.444318" elapsed="0.000961"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.447849" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.445433" elapsed="0.002443"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:01.447929" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:01.448085" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.443145" elapsed="0.004965"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.449388" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.449154" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.449562" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.448767" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:01.449794" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:01.449658" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.449640" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.450028" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.450201" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.450266" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.452182" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.448423" elapsed="0.003786"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.453671" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.453404" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.454113" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.453874" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:01.462340" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:01.462502" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '311'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:56:01.462603" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:01.456338" elapsed="0.006292"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.454262" elapsed="0.008412"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.462858" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.462701" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.454242" elapsed="0.008721"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.468063" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.464416" elapsed="0.003716"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.464107" elapsed="0.004075"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.464081" elapsed="0.004137"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.471827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.468631" elapsed="0.003261"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.468296" elapsed="0.003644"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.468273" elapsed="0.003702"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.472777" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.472217" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.473293" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.472914" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.474082" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.473663" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.473408" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.472888" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.474706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.474329" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.475039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.474803" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.475593" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.475283" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.475120" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.474785" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.475829" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:01.476641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.476337" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.476824" elapsed="0.002384"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:01.463515" elapsed="0.015756"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.479554" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:01.479427" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.479407" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.482621" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.479777" elapsed="0.002874"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:01.482705" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:01.482868" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:01.452546" elapsed="0.030348"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.482958" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:01.483108" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:01.350616" elapsed="0.132518"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.511513" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.511037" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.512332" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.512048" elapsed="0.000421">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.512648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.511707" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.513325" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.512842" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.513696" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.513859" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.513536" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.514312" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "inter-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "source-as": 64496
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.514045" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:01.514850" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.514429" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.515612" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.515089" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.514935" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.514411" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.516325" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.515846" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.516466" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.510402" elapsed="0.006199"/>
</kw>
<msg time="2026-05-01T00:56:01.516659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.497585" elapsed="0.019124"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.529258" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.541634" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.553944" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.554139" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.554313" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.554702" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.554557" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.554543" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.554924" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.555092" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.555258" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.554511" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.554392" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.555499" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.555577" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.555711" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.494855" elapsed="0.060882"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.555952" elapsed="0.002358"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.559488" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.559064" elapsed="0.000453"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.560070" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.559673" elapsed="0.000425"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.560257" elapsed="0.000341"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.558651" elapsed="0.002007"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.558391" elapsed="0.002302"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.560870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.560719" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.558373" elapsed="0.002573"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:01.484340" elapsed="0.076676"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:01.483483" elapsed="0.077628"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.483216" elapsed="0.077942"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.483199" elapsed="0.077984"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.561217" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:01.346189" elapsed="0.215156"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:01.341903" elapsed="0.219502"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.610884" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.610511" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.611659" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.611423" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.611818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.611086" elapsed="0.000756"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.612407" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.612009" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.612748" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.612877" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.612614" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.613363" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.613117" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.614670" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.614195" elapsed="0.000523"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.615155" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.614884" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.615981" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.615564" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.617248" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.616672" elapsed="0.000685"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.617439" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:56:01.617751" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.616201" elapsed="0.001586"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.617947" elapsed="0.000374"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.615403" elapsed="0.002960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.619043" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.618643" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.620277" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.619730" elapsed="0.000646"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.620472" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.620781" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.619260" elapsed="0.001546"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.620962" elapsed="0.000385"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.618496" elapsed="0.002893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.615230" elapsed="0.006194"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.621485" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:01.621645" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:01.613857" elapsed="0.007813"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.613548" elapsed="0.008154"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.621878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.621727" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.613529" elapsed="0.008426"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.622672" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.622099" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.622749" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.609861" elapsed="0.013014"/>
</kw>
<msg time="2026-05-01T00:56:01.622928" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.596946" elapsed="0.026029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.635522" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.647903" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.660192" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.660394" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.660586" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.660956" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.660809" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.660795" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.661212" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.661387" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.661573" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.660765" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.660661" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.661802" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.661878" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.661999" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.592686" elapsed="0.069339"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.663282" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.663046" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.663439" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.662700" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.663799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.663550" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.664351" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.664059" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.663881" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.663532" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.667965" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.664605" elapsed="0.003388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:01.668078" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:01.668237" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.662355" elapsed="0.005907"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.669533" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.669282" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.669690" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.668920" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:01.669922" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:01.669786" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.669768" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.670157" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.670331" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.670397" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:01.672313" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.668588" elapsed="0.003752"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.673783" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.673533" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.674233" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.673987" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:01.681585" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:01.681711" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '311'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:56:01.681818" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:01.676419" elapsed="0.005426"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.674346" elapsed="0.007544"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.682156" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.681923" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.674327" elapsed="0.007949"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.687115" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.683726" elapsed="0.003459"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.683390" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.683365" elapsed="0.003905"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.690847" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.687687" elapsed="0.003207"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.687347" elapsed="0.003582"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.687324" elapsed="0.003631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.691522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.691125" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.691907" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.691661" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.692473" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.692158" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.691990" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.691642" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.693110" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.692724" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.693476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.693220" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.694026" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.693727" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.693559" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.693202" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.694265" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:01.695073" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.694795" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.695256" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:01.682804" elapsed="0.014846"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.697827" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:01.697721" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.697703" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.700803" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.698048" elapsed="0.002785"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:01.700884" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:01.701048" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:01.672674" elapsed="0.028402"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.701153" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:01.701304" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:01.570197" elapsed="0.131134"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.729751" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.729276" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.730581" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.730282" elapsed="0.000421">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.730941" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.729947" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.731615" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.731137" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.731970" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.732200" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.731808" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.732682" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "inter-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "source-as": 64496
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.732390" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:01.733235" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.732800" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.734004" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.733489" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.733322" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.732782" elapsed="0.001308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.734753" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.734241" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.734833" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.728618" elapsed="0.006344"/>
</kw>
<msg time="2026-05-01T00:56:01.735020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.715796" elapsed="0.019273"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.747552" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.759999" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.772445" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.772697" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.772880" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.773312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.773127" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.773113" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.773555" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.773730" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.773899" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.773082" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.772963" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.774128" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.774205" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:01.774346" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AgwAAQECAwQBAgAA+/A=",
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.713160" elapsed="0.061213"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.774572" elapsed="0.002348"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.778149" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.777725" elapsed="0.000452"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.778749" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.778333" elapsed="0.000444"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.778935" elapsed="0.000330"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:01.777291" elapsed="0.002034"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.777008" elapsed="0.002352"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.779551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.779385" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.776989" elapsed="0.002639"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:01.702482" elapsed="0.077196"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:01.701669" elapsed="0.078086"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.701413" elapsed="0.078388"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.701396" elapsed="0.078430"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.779859" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:01.565877" elapsed="0.214112"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:01.561600" elapsed="0.218486"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:01.780258" elapsed="0.002509"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.834470" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.834083" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.835235" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.835002" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.835396" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.834666" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.835991" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.835605" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.836321" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.836485" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.836183" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.836916" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.836673" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.838158" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.837867" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.838671" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.838372" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.839477" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.839058" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.840715" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.840154" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.840894" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.841226" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.839698" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.841428" elapsed="0.000466"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.838919" elapsed="0.003018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.842613" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.842191" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:01.843849" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.843278" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:01.844028" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.844325" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:01.842827" elapsed="0.001525"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.844525" elapsed="0.000370"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:01.842053" elapsed="0.002918"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.838746" elapsed="0.006264"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:01.845055" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:01.845237" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:01.837355" elapsed="0.007913"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.837029" elapsed="0.008272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.845497" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.845326" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.837010" elapsed="0.008569"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.846324" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.845737" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.846402" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.833464" elapsed="0.013081"/>
</kw>
<msg time="2026-05-01T00:56:01.846600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.820810" elapsed="0.025838"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.859694" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.872091" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.884507" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.884714" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.884897" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.885326" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.885129" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.885113" elapsed="0.000302"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.885587" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.885760" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.885928" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.885080" elapsed="0.000902"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.884974" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.886208" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.886287" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.886416" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.816550" elapsed="0.069892"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.887766" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.887504" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.887929" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.887126" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.888278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.888025" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.889080" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.888561" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.888359" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.888006" elapsed="0.001162"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.891548" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.889349" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:01.891628" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:01.891788" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.886789" elapsed="0.005024"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.893011" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.892817" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T00:56:01.893148" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.892475" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.893437" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:01.893290" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.893263" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.893840" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.893981" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.893673" elapsed="0.000333"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:01.894401" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.894167" elapsed="0.000260"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:01.894490" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:01.894648" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:01.892131" elapsed="0.002544"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.896068" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.895821" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.896574" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.896311" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:01.903962" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:01.904380" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '456'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:01.904501" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:01.898807" elapsed="0.005722"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.896687" elapsed="0.007886"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.904758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.904599" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.896668" elapsed="0.008177"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.908333" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AgwAAQECAwQBAgAA+/A=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":64496}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.905930" elapsed="0.002454"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.905705" elapsed="0.002714"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.905687" elapsed="0.002758"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.911185" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.908744" elapsed="0.002489"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.908517" elapsed="0.002751"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.908500" elapsed="0.002794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.911877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.911481" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.912224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.911978" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.912787" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.912488" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.912307" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.911959" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.913427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.913037" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.913785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.913543" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.914534" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.914095" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.913866" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.913525" elapsed="0.001126"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.914865" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:01.916000" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.915606" elapsed="0.000431"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:01.916320" elapsed="0.003279"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:01.905218" elapsed="0.014472"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.919940" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:01.919789" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.919763" elapsed="0.000275"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:01.923864" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:01.920247" elapsed="0.003648"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:01.923948" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:01.924109" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:01.894991" elapsed="0.029145"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.924200" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:01.924353" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:01.794014" elapsed="0.130365"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.952778" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.952296" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.953675" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.953371" elapsed="0.000423">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:01.953972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:01.952977" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.954622" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:01.954167" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:01.954971" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:01.955109" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:01.954814" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.955572" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:01.955293" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:01.956087" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.955686" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.956844" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:01.956322" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:01.956172" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:01.955667" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:01.957631" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:01.957112" elapsed="0.000548"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:01.957710" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:01.951675" elapsed="0.006163"/>
</kw>
<msg time="2026-05-01T00:56:01.957891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.938800" elapsed="0.019140"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.970371" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.982792" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.995162" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.995358" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.995549" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.995923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:01.995777" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:01.995762" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.996147" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.996321" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.996506" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:01.995733" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.995628" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:01.996738" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:01.996815" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:01.996932" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:01.936130" elapsed="0.060830"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:01.997182" elapsed="0.002377"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:02.000602" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:02.000303" elapsed="0.000328"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:02.001384" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:02.000789" elapsed="0.000625"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:02.001914" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "inter-as-i-pmsi-a-d": {
       "route-distinguisher": "1.2.3.4:258",
       "source-as": 64496
      },
      "path-id": 0,
      "route-key": "AgwAAQECAwQBAgAA+/A="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:02.002097" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:02.001598" elapsed="0.000566">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.999885" elapsed="0.002421">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:01.999641" elapsed="0.002745">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:02.002591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:02.002421" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:01.999623" elapsed="0.003049">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.925556" elapsed="0.077238">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.924721" elapsed="0.078247">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:01.924479" elapsed="0.078578">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:01.924446" elapsed="0.078645">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:02.003140" elapsed="0.000016"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:01.787882" elapsed="0.215379">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "inter-as-i-pmsi-a-d": {
+       "route-distinguisher": "1.2.3.4:258",
+       "source-as": 64496
+      },
+      "path-id": 0,
+      "route-key": "AgwAAQECAwQBAgAA+/A="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.063922" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.063375" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.065030" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.064629" elapsed="0.000511">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.065283" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.064179" elapsed="0.001130"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.065951" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.065506" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.066383" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.066665" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.066189" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.067352" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.067054" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.068751" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.068336" elapsed="0.000461"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.069301" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.068971" elapsed="0.000357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.070306" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.069833" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.071907" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.071202" elapsed="0.000810"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.072104" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:56:04.072517" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.070619" elapsed="0.001925"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.072752" elapsed="0.000480"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.069680" elapsed="0.003595"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.074054" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.073594" elapsed="0.000486"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.075549" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.074880" elapsed="0.000775"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.075738" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:04.076089" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.074274" elapsed="0.001844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.076278" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.073400" elapsed="0.003363"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.069396" elapsed="0.007440"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.076891" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:04.077056" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:04.067957" elapsed="0.009125"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.067527" elapsed="0.009589"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.077346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.077149" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.067489" elapsed="0.009937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.078652" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.077604" elapsed="0.001080"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.078763" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.062616" elapsed="0.016281"/>
</kw>
<msg time="2026-05-01T00:56:04.078996" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.048329" elapsed="0.030726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.092945" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.106696" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.120154" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.120496" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.120711" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.121275" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.121101" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.121077" elapsed="0.000330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.121588" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.121801" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.121974" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.121015" elapsed="0.001011"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.120850" elapsed="0.001209"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.122252" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.122341" elapsed="0.000023"/>
</return>
<msg time="2026-05-01T00:56:04.122582" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.043142" elapsed="0.079474"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.124660" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.124168" elapsed="0.000610">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.124925" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.123602" elapsed="0.001351"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.125335" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.125030" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.126031" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.125686" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.125419" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.125009" elapsed="0.001108"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.128804" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.126309" elapsed="0.002524"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:04.128887" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:04.129212" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:04.123082" elapsed="0.006158"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.130684" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.130402" elapsed="0.000339"/>
</kw>
<msg time="2026-05-01T00:56:04.130866" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.130011" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.131147" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.130962" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.130943" elapsed="0.000274"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.131593" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.131872" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.131367" elapsed="0.000531"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:04.132361" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.132062" elapsed="0.000325"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:04.132434" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:04.132612" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:04.129614" elapsed="0.003058"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.134251" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.133991" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.134757" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.134508" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:04.145428" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:04.145861" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:04.146225" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:04.137669" elapsed="0.008622"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.134904" elapsed="0.011530"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.147169" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.146567" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.134885" elapsed="0.012426"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.153130" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.149288" elapsed="0.003911"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.148919" elapsed="0.004328"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.148880" elapsed="0.004403"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.156895" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.153701" elapsed="0.003259"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.153360" elapsed="0.003649"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.153337" elapsed="0.003711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.157922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.157317" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.158545" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.158174" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.159314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.158932" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.158662" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.158146" elapsed="0.001252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.159947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.159578" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.160280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.160043" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.160835" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.160540" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.160361" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.160025" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.161088" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:04.161950" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.161624" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.162134" elapsed="0.002333"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:04.148082" elapsed="0.016456"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.164732" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.164615" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.164596" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:04.167682" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.164964" elapsed="0.002747"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:04.167763" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:04.167946" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:04.133019" elapsed="0.034954"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.168040" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:04.168198" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:04.019397" elapsed="0.148828"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.198335" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.197856" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.199265" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.198933" elapsed="0.000468">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.199633" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.198563" elapsed="0.001096"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.200293" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.199827" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.200688" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.200872" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.200505" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.201332" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.201060" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:04.201872" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.201462" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.202656" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.202112" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.201958" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.201428" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.203436" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.202933" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.203539" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.197219" elapsed="0.006451"/>
</kw>
<msg time="2026-05-01T00:56:04.203726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.184617" elapsed="0.019158"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.216271" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.228708" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.241389" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.241764" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.241959" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.242421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.242263" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.242244" elapsed="0.000288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.242683" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.242887" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.243062" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.242199" elapsed="0.000917"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.242056" elapsed="0.001092"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.243302" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.243385" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:04.243567" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.181821" elapsed="0.061777"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.243783" elapsed="0.002326"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:04.247304" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.246949" elapsed="0.000384"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:04.247786" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.247506" elapsed="0.000308"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.247973" elapsed="0.000341"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.246477" elapsed="0.001897"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.246194" elapsed="0.002214"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.248602" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.248434" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.246174" elapsed="0.002505"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:04.169395" elapsed="0.079335"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:04.168583" elapsed="0.080228"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.168313" elapsed="0.080545"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.168295" elapsed="0.080588"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.248918" elapsed="0.000038"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:04.011982" elapsed="0.237081"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:01.782976" elapsed="2.466189"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:04.249393" elapsed="0.002581"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:55:58.978244" elapsed="5.273792"/>
</kw>
<status status="PASS" start="2026-05-01T00:55:58.894307" elapsed="5.357886"/>
</test>
<test id="s1-s16-t8" name="Odl_To_Play_spmsi_ad" line="86">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:04.255503" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:04.255220" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.256823" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.256708" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.256689" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.262027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.261920" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.261901" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.263140" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.262725" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.263705" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:04.263332" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:04.263776" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:04.263935" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.262330" elapsed="0.001631"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.269501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.269377" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.269358" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.270762" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.270655" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.270637" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:04.271327" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.271015" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.271764" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:04.271538" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.300665" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:04.272288" elapsed="0.028615"/>
</kw>
<msg time="2026-05-01T00:56:04.301153" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:04.301201" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.271951" elapsed="0.029287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.326565" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:04.302040" elapsed="0.024669"/>
</kw>
<msg time="2026-05-01T00:56:04.326945" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:04.327007" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.301551" elapsed="0.025504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.327537" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.327204" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.327151" elapsed="0.000571"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.328233" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.327876" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.328610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.328372" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.328352" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:04.328730" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:04.331508" elapsed="0.000387"/>
</kw>
<msg time="2026-05-01T00:56:04.331968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.330391" elapsed="0.001738"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.332418" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.332779" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:04.329717" elapsed="0.003255"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:04.329100" elapsed="0.003936"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:04.270323" elapsed="0.062809"/>
</kw>
<msg time="2026-05-01T00:56:04.333224" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:04.333269" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.269726" elapsed="0.063579"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:04.333504" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:04.333381" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.333362" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.334021" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.334367" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.334438" elapsed="0.000035"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:04.269041" elapsed="0.065528"/>
</kw>
<msg time="2026-05-01T00:56:04.334661" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:04.334705" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.264346" elapsed="0.070398"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.335091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.334819" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.334802" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:04.264196" elapsed="0.070996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:04.264016" elapsed="0.071211"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:04.261557" elapsed="0.073728"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:04.256384" elapsed="0.078960"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.255934" elapsed="0.079459"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:04.253057" elapsed="0.082405"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.336390" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/announce_spmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/announce_spmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.336599" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.336181" elapsed="0.000446"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:04.337005" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.336787" elapsed="0.000245"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.337382" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/withdraw_spmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/withdraw_spmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.337525" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.337191" elapsed="0.000361"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:04.337910" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.337709" elapsed="0.000227"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:04.338221" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.338006" elapsed="0.002818"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.337989" elapsed="0.002860"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.379282" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.378851" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.380151" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.379850" elapsed="0.000408">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.380392" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.379507" elapsed="0.000919"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.381227" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.380684" elapsed="0.000582"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.381844" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.382091" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.381587" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.382847" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.382434" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.384363" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.383998" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.385057" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.384678" elapsed="0.000416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.386058" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.385642" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.387502" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.386831" elapsed="0.000712"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.387672" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:56:04.387906" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.386358" elapsed="0.001583"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.388124" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:04.385423" elapsed="0.002990"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.388980" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.388683" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.389937" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.389526" elapsed="0.000438"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.390015" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:04.390168" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.389193" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.390346" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.388546" elapsed="0.002081"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.385170" elapsed="0.005492"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.390706" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:04.390862" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:04.383541" elapsed="0.007346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.383085" elapsed="0.007834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.391120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.390962" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.383050" elapsed="0.008146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.391965" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.391343" elapsed="0.000651"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.392042" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.378212" elapsed="0.013956"/>
</kw>
<msg time="2026-05-01T00:56:04.392223" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.365437" elapsed="0.026837"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.404976" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.417384" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.429759" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.430001" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.430182" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.430574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.430408" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.430392" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.430801" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.431002" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.431177" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.430363" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.430259" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.431407" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.431498" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:04.431621" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.360762" elapsed="0.070885"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.456487" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.456088" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.457278" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.457028" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.457468" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.456687" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.458053" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.457665" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.458385" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.458569" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.458246" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.459019" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;s-pmsi-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;multicast-source&gt;10.0.0.10&lt;/multicast-source&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;c-g-address&gt;12.0.0.12&lt;/c-g-address&gt;
    &lt;/s-pmsi-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.458759" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:04.459514" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.459193" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.460043" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.459750" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.459602" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.459168" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.460774" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.460280" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.460857" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.455471" elapsed="0.005517"/>
</kw>
<msg time="2026-05-01T00:56:04.461050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.442657" elapsed="0.018440"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.473712" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.486079" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.498473" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.498670" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.498844" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.499274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.499111" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.499096" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.499515" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.499687" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.499854" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.499064" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.498921" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.500081" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.500191" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:04.500322" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.441748" elapsed="0.058602"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.501643" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.501380" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.501799" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.501040" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.502141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.501894" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.502712" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.502406" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.502221" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.501876" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.505166" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.502947" elapsed="0.002246"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:04.505243" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:04.505398" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:04.500708" elapsed="0.004714"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.506962" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.506717" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.507416" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;s-pmsi-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;multicast-source&gt;10.0.0.10&lt;/multicast-source&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;c-g-address&gt;12.0.0.12&lt;/c-g-address&gt;
    &lt;/s-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.507182" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.507880" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.507639" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.508316" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.508079" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:04.509188" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:04.508985" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:04.509559" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:04.509369" elapsed="0.000216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.509736" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.510340" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.510096" elapsed="0.000323"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:04.510478" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:04.510639" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:04.508581" elapsed="0.002082"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:04.523689" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '752', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;s-pmsi-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;multicast-source&gt;10.0.0.10&lt;/multicast-source&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;c-g-address&gt;12.0.0.12&lt;/c-g-address&gt;
    &lt;/s-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:04.523849" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:04.524125" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:04.513057" elapsed="0.011134"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.510734" elapsed="0.013571"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.524805" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.524373" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.510716" elapsed="0.014310"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.532116" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.527946" elapsed="0.004232"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.527350" elapsed="0.004879"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.527303" elapsed="0.004962"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.535977" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.532680" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.532345" elapsed="0.003728"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.532320" elapsed="0.003779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.536697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.536275" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.537036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.536794" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.537601" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.537285" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.537118" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.536776" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.538209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.537848" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.538558" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.538305" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.539122" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.538804" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.538640" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.538288" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.539359" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:04.540236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.539940" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.540417" elapsed="0.002303"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:04.525950" elapsed="0.016834"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:04.542964" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-05-01T00:56:04.542858" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.542839" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.543250" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.543320" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:04.545654" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:04.505774" elapsed="0.039906"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.545751" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:04.545909" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:04.345847" elapsed="0.200088"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.546292" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.546046" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.546026" elapsed="0.000358"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.546418" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:04.341130" elapsed="0.205433"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.550049" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.547531" elapsed="0.002548"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.550257" elapsed="0.002511"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:04.552839" elapsed="0.000043"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:04.547242" elapsed="0.005779"/>
</kw>
<msg time="2026-05-01T00:56:04.553127" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:04.546740" elapsed="0.006422"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.554385" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:04.554512" level="INFO">${len_1} = 160</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:04.554000" elapsed="0.000547"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.555153" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:04.555259" level="INFO">${len_2} = 160</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:04.554768" elapsed="0.000524"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.555536" elapsed="0.000428"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.556444" level="INFO">${sum_1} = 1045</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:04.556187" elapsed="0.000313"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.557035" level="INFO">${sum_2} = 1045</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:04.556715" elapsed="0.000356"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.557344" elapsed="0.000451"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:04.553488" elapsed="0.004391"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:04.558092" elapsed="0.001808"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.602914" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.602538" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.603739" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.603489" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.603909" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.603138" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.604503" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.604102" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.604834" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.604981" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.604696" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.605408" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.605166" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.606675" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.606347" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.607190" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.606886" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.608045" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.607627" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.609184" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.608709" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.609405" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:04.609654" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.608265" elapsed="0.001414"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.609837" elapsed="0.000404"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:04.607482" elapsed="0.002801"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.610965" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.610555" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.612111" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.611642" elapsed="0.000550"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.612328" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:04.612572" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.611206" elapsed="0.001392"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.612795" elapsed="0.000397"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.610401" elapsed="0.002834"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.607274" elapsed="0.005996"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.613314" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:04.613497" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:04.605856" elapsed="0.007668"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.605546" elapsed="0.008010"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.613734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.613581" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.605523" elapsed="0.008287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.614552" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.613955" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.614629" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.601908" elapsed="0.012846"/>
</kw>
<msg time="2026-05-01T00:56:04.614809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.589277" elapsed="0.025580"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.627378" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.639755" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.652562" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.652810" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.653000" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.653425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.653273" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.653254" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.653673" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.653840" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.654091" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.653214" elapsed="0.000932"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.653086" elapsed="0.001088"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.654328" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.654407" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:04.654577" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.584994" elapsed="0.069611"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.655882" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.655580" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:04.665482" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:04.665532" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:04.665625" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:04.658084" elapsed="0.007566"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.656001" elapsed="0.009689"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.665872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.665715" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.655983" elapsed="0.009971"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.670622" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.667342" elapsed="0.003341"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.667007" elapsed="0.003723"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.666982" elapsed="0.003783"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.674485" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.671185" elapsed="0.003365"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.670842" elapsed="0.003756"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.670819" elapsed="0.003814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.675504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.674881" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.675982" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.675644" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.676560" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.676246" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.676079" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.675618" elapsed="0.001027"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.677163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.676806" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.677508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.677258" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.678083" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.677753" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.677590" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.677240" elapsed="0.000927"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.678324" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:04.679192" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.678866" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.679378" elapsed="0.002413"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:04.666424" elapsed="0.015429"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:04.681900" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:04.684164" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:04.654893" elapsed="0.029298"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.684244" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:04.560972" elapsed="0.123397"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.560549" elapsed="0.123875"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:04.560156" elapsed="0.124351"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.687628" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.685429" elapsed="0.002227"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.687837" elapsed="0.002077"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:04.689964" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:04.685158" elapsed="0.004933"/>
</kw>
<msg time="2026-05-01T00:56:04.690168" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:04.684682" elapsed="0.005510"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.691057" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:04.691133" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:04.690791" elapsed="0.000593"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.692557" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:04.692694" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:04.691893" elapsed="0.000837"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.692982" elapsed="0.000525"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.694050" level="INFO">${sum_1} = 894</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:04.693756" elapsed="0.000333"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:04.694618" level="INFO">${sum_2} = 894</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:04.694324" elapsed="0.000332"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:04.694890" elapsed="0.000512"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:04.690409" elapsed="0.005118"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.744975" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.744597" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.745952" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.745626" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.746132" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.745258" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.746734" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.746325" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.747086" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.747301" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.746930" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.747750" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.747505" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.748817" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.748553" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.749306" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.749026" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.750287" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.749737" elapsed="0.000576"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.751550" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.751037" elapsed="0.000555"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.751716" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:04.751960" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.750532" elapsed="0.001454"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.752147" elapsed="0.000531"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:04.749591" elapsed="0.003129"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.753512" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.752980" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.754679" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.754214" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.754839" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:04.755063" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.753734" elapsed="0.001355"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.755274" elapsed="0.000661"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.752840" elapsed="0.003138"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.749387" elapsed="0.006646"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.756090" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:04.756288" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:04.748182" elapsed="0.008132"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.747877" elapsed="0.008469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.756547" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.756372" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.747849" elapsed="0.008777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.757384" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.756776" elapsed="0.000669"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.757512" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.743930" elapsed="0.013710"/>
</kw>
<msg time="2026-05-01T00:56:04.757694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.731115" elapsed="0.026642"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.770698" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.783095" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.795575" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.795776" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.795954" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.796325" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.796176" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:04.796162" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.796563" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.796735" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.796903" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:04.796132" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.796029" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.797145" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.797221" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:04.797349" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.724641" elapsed="0.072735"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.798576" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.798310" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:04.805738" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:04.805897" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:04.806048" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:04.806091" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.800821" elapsed="0.005665">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:04.798690" elapsed="0.007881">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.806765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.806605" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:04.798672" elapsed="0.008178">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.811526" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.807935" elapsed="0.003642">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:04.807711" elapsed="0.003959">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:04.807693" elapsed="0.004025">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.815817" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.812150" elapsed="0.003716">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:04.811820" elapsed="0.004141">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:04.811795" elapsed="0.004214">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.816625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.816217" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.816970" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.816725" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.817543" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.817225" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.817058" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.816706" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.818155" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.817791" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.818503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.818251" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.819088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.818787" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.818618" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.818233" elapsed="0.000938"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.819350" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:04.820179" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.819886" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:04.822629" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.820364" elapsed="0.002297">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.807258" elapsed="0.015542">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:04.822861" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:04.825238" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:04.825268" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:04.797696" elapsed="0.027600">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.825361" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.697267" elapsed="0.128283">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.696605" elapsed="0.129006"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:04.695948" elapsed="0.129722"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:04.335770" elapsed="0.489948"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.252576" elapsed="0.573266"/>
</test>
<test id="s1-s16-t9" name="Play_To_Odl_spmsi_ad" line="90">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:04.828964" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:04.828697" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.830235" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.830125" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.830106" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.835400" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.835292" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.835274" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.836488" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.836093" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.836975" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:04.836681" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:04.837046" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:04.837202" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.835713" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.842741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.842633" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.842613" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.843989" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:04.843882" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.843864" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:04.844519" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.844207" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.844930" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:04.844710" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.878037" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:04.845476" elapsed="0.032671"/>
</kw>
<msg time="2026-05-01T00:56:04.878316" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:04.878362" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.845123" elapsed="0.033274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:04.903371" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:04.878964" elapsed="0.024534"/>
</kw>
<msg time="2026-05-01T00:56:04.903660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:04.903706" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.878615" elapsed="0.025127"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.904047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.903820" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.903800" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.904582" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "p "m "s "i "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.904270" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.904935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.904718" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.904700" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:04.905045" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:04.907645" elapsed="0.000279"/>
</kw>
<msg time="2026-05-01T00:56:04.907986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.906501" elapsed="0.001618"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.908400" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.908766" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:04.905863" elapsed="0.003086"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:04.905315" elapsed="0.003699"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:04.843579" elapsed="0.065532"/>
</kw>
<msg time="2026-05-01T00:56:04.909202" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:04.909246" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.842966" elapsed="0.066317"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:04.909522" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:04.909393" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.909373" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.910009" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.910341" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:04.910412" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:04.842281" elapsed="0.068255"/>
</kw>
<msg time="2026-05-01T00:56:04.910629" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:04.910673" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.837612" elapsed="0.073097"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.911035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.910784" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.910767" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:04.837464" elapsed="0.073671"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:04.837280" elapsed="0.073884"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:04.834910" elapsed="0.076307"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:04.829838" elapsed="0.081433"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:04.829390" elapsed="0.081946"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:04.826542" elapsed="0.084846"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.912516" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.912027" elapsed="0.000517"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.913159" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.912714" elapsed="0.000473"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.913748" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.913354" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.914132" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/announce_spmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/announce_spmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.914268" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.913937" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.914660" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/withdraw_spmsi_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/withdraw_spmsi_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.914781" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.914469" elapsed="0.000338"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:04.914961" elapsed="0.002245"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:04.917367" elapsed="0.001715"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.972547" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:04.972155" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.973349" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.973121" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:04.973528" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:04.972782" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.974109" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:04.973722" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:04.974436" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:04.974583" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:04.974302" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.975013" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.974770" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.976078" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:04.975798" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.976570" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.976285" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.977357" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.976952" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.978610" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.978047" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.978788" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:04.979084" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.977598" elapsed="0.001513"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.979267" elapsed="0.000409"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:04.976814" elapsed="0.002903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.980373" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:04.979969" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:04.981610" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.981057" elapsed="0.000654"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:04.981787" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:04.982078" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:04.980607" elapsed="0.001496"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:04.982259" elapsed="0.000384"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:04.979833" elapsed="0.002852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.976645" elapsed="0.006075"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:04.982763" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:04.982921" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:04.975471" elapsed="0.007475"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.975129" elapsed="0.007849"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.983162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:04.983003" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:04.975109" elapsed="0.008167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:04.984248" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:04.983491" elapsed="0.000786"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:04.984328" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:04.971491" elapsed="0.012978"/>
</kw>
<msg time="2026-05-01T00:56:04.984525" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:04.958514" elapsed="0.026059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:04.997065" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.009523" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.021807" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.022004" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.022180" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.022561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:05.022398" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:05.022384" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.022785" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.022953" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.023119" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:05.022356" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.022253" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.023344" elapsed="0.000048"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.023462" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:05.023588" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:04.954139" elapsed="0.069475"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:05.025029" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:05.024780" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:05.025186" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:05.024421" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.025543" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:05.025280" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:05.026088" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:05.025793" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:05.025626" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:05.025262" elapsed="0.000908"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:05.028544" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:05.026323" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:05.028622" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:05.028777" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:05.023990" elapsed="0.004811"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:05.030025" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:05.029787" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:05.030185" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:05.029436" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:05.030415" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:05.030281" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:05.030261" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.030669" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.030841" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.030905" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:05.033026" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:05.029114" elapsed="0.003938"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:05.034472" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:05.034209" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:05.034920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:05.034677" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:05.042006" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:05.042123" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:05.042251" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:05.037125" elapsed="0.005496">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:05.035030" elapsed="0.007671">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.042892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:05.042735" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:05.035012" elapsed="0.007967">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.043358" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.043533" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:05.043497" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:05.043478" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.043748" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.043817" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:05.033376" elapsed="0.010548">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.043999" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.930394" elapsed="0.113699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:05.044366" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:05.044185" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:05.044169" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:05.044510" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:04.923758" elapsed="0.120849">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.101381" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.100989" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.102320" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.102020" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.102507" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.101677" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.103087" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.102703" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.103422" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.103594" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.103280" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.104026" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.103781" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.105192" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.104878" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.105699" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.105403" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.106512" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.106088" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.107760" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.107186" elapsed="0.000676"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.107942" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:07.108246" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.106732" elapsed="0.001541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.108431" elapsed="0.000449"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:07.105950" elapsed="0.002973"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.109602" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.109178" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.110835" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.110271" elapsed="0.000666"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.111014" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:07.111408" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.109821" elapsed="0.001616"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.111617" elapsed="0.000381"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.109040" elapsed="0.003002"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.105775" elapsed="0.006306"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.112128" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:07.112295" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:07.104473" elapsed="0.007849"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.104150" elapsed="0.008206"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.112598" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.112384" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.104127" elapsed="0.008583"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.113708" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.112869" elapsed="0.000870"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.113791" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.100265" elapsed="0.013658"/>
</kw>
<msg time="2026-05-01T00:56:07.113979" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.087489" elapsed="0.026540"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.126860" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.140129" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.152836" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.153115" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.153307" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.153763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.153607" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.153589" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.153995" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.154167" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.154333" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.153548" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.153393" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.154581" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.154664" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:07.154836" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.083213" elapsed="0.071660"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.156676" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.156133" elapsed="0.000630">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.156862" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.155720" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.157237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.156959" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.157825" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.157529" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.157319" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.156940" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.160245" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.158063" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:07.160324" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:07.160501" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.155339" elapsed="0.005188"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.161796" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.161559" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.161952" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.161203" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:07.162184" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:07.162046" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.162028" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.162417" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.162608" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.162675" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:07.164792" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.160874" elapsed="0.003945"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.166240" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.165981" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.166702" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.166442" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:07.174549" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:07.174941" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '379'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:07.175110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:07.168893" elapsed="0.006244"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.166813" elapsed="0.008371"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.175383" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.175214" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.166795" elapsed="0.008696"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.179049" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.176574" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.176329" elapsed="0.002807"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.176310" elapsed="0.002853"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.181812" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.179443" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.179218" elapsed="0.002675"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.179202" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.182511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.182099" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.182852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.182610" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.183401" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.183099" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.182933" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.182593" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.184023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.183664" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.184356" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.184120" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.185052" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.184753" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.184435" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.184102" elapsed="0.001033"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.185293" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:07.186125" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.185823" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.186306" elapsed="0.002524"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:07.175885" elapsed="0.013011"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.189074" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:07.188966" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.188947" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.192107" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.189295" elapsed="0.002841"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:07.192187" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:07.192354" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:07.165142" elapsed="0.027238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.192522" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:07.192707" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:07.059764" elapsed="0.132971"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.220988" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.220430" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.221924" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.221588" elapsed="0.000471">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.222244" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.221189" elapsed="0.001083"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.222929" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.222470" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.223295" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.223493" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.223129" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.223959" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "s-pmsi-a-d": {
          "orig-route-ip": "1.0.0.1",
          "multicast-source": "10.0.0.10",
          "route-distinguisher": "1.2.3.4:258",
          "c-g-address": "12.0.0.12"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.223687" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:07.224516" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.224083" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.225420" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.224804" elapsed="0.000678"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.224607" elapsed="0.000929"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.224063" elapsed="0.001506"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.226509" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.225784" elapsed="0.000769"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.226624" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.219810" elapsed="0.006997"/>
</kw>
<msg time="2026-05-01T00:56:07.226886" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.207090" elapsed="0.019924"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.242830" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.255215" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.267628" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.267828" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.268009" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.268390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.268242" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.268227" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.268657" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.268833" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.269002" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.268197" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.268089" elapsed="0.000995"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.269265" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.269341" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:07.269479" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.204432" elapsed="0.065076"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.269687" elapsed="0.002203"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.273169" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.272688" elapsed="0.000511"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.273849" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.273401" elapsed="0.000478"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.274042" elapsed="0.000369"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.272217" elapsed="0.002276"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.271971" elapsed="0.002559"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.274714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.274557" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.271952" elapsed="0.002842"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:07.193910" elapsed="0.080933"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:07.193076" elapsed="0.081844"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.192821" elapsed="0.082146"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.192804" elapsed="0.082187"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.275025" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:07.052703" elapsed="0.222453"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:04.919277" elapsed="2.355939"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.325422" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.325016" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.326260" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.325993" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.326429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.325646" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.327023" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.326640" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.327350" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.327537" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.327213" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.327968" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.327725" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.329057" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.328753" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.329561" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.329265" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.330417" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.330011" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.331683" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.331115" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.331865" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:07.332170" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.330658" elapsed="0.001538"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.332355" elapsed="0.000458"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:07.329869" elapsed="0.002988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.333535" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.333112" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.334777" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.334208" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.334983" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:07.335282" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.333753" elapsed="0.001555"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.335482" elapsed="0.000374"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.332975" elapsed="0.002923"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.329639" elapsed="0.006295"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.335978" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:07.336141" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:07.328402" elapsed="0.007766"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.328087" elapsed="0.008113"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.336382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.336227" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.328066" elapsed="0.008409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.337520" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.336626" elapsed="0.000989"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.337670" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.324337" elapsed="0.013460"/>
</kw>
<msg time="2026-05-01T00:56:07.337853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.311535" elapsed="0.026369"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.351331" elapsed="0.000093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.364029" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.376756" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.377039" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.377239" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.377713" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.377547" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.377527" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.377949" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.378120" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.378291" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.377474" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.377325" elapsed="0.001047"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.378545" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.378628" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:07.378845" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.307090" elapsed="0.071792"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.380401" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.380061" elapsed="0.000429">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.380586" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.379630" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.380968" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.380684" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.381568" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.381242" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.381049" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.380666" elapsed="0.000985"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.383996" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.381806" elapsed="0.002216"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:07.384074" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:07.384242" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.379240" elapsed="0.005026"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.385584" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.385326" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.385814" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.384988" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:07.386047" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:07.385910" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.385891" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.386284" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.386476" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.386544" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:07.388669" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.384603" elapsed="0.004110"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.390134" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.389881" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.390601" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.390342" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:07.398281" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:07.398436" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '379'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:07.398586" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:07.392843" elapsed="0.005770"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.390713" elapsed="0.007943"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.398845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.398684" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.390694" elapsed="0.008236"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.402481" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.399985" elapsed="0.002548"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.399756" elapsed="0.002811"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.399738" elapsed="0.002854"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.405633" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.402876" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.402649" elapsed="0.003116"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.402632" elapsed="0.003170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.406690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.406081" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.407203" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.406835" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.408032" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.407591" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.407324" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.406808" elapsed="0.001479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.409204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.408598" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.409739" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.409355" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.410595" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.410112" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.409863" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.409327" elapsed="0.001395"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.410973" elapsed="0.000629"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:07.412316" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.411863" elapsed="0.000494"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.412632" elapsed="0.002537"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:07.399310" elapsed="0.015928"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.415435" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:07.415322" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.415301" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.418589" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.415681" elapsed="0.002939"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:07.418674" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:07.418845" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:07.389042" elapsed="0.029830"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.418937" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:07.419094" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:07.283993" elapsed="0.135129"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.447812" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.447288" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.448701" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.448369" elapsed="0.000499">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.449051" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.448024" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.449720" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.449253" elapsed="0.000562"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.450157" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.450349" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.449986" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.450829" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "s-pmsi-a-d": {
          "orig-route-ip": "1.0.0.1",
          "multicast-source": "10.0.0.10",
          "route-distinguisher": "1.2.3.4:258",
          "c-g-address": "12.0.0.12"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.450555" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:07.451396" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.450959" elapsed="0.000517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.452172" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.451657" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.451503" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.450935" elapsed="0.001324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.452972" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.452411" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.453055" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.446632" elapsed="0.006563"/>
</kw>
<msg time="2026-05-01T00:56:07.453253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.433842" elapsed="0.019462"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.465933" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.478368" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.492114" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.492391" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.492697" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.493164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.493011" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.492993" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.493393" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.493583" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.493756" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.492954" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.492826" elapsed="0.001015"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.493992" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.494072" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:07.494224" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.431118" elapsed="0.063135"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.494434" elapsed="0.002361"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.498051" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.497592" elapsed="0.000488"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.498667" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.498240" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.498852" elapsed="0.000337"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.497139" elapsed="0.002110"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.496881" elapsed="0.002401"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.499471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.499308" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.496862" elapsed="0.002687"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:07.420311" elapsed="0.079286"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:07.419495" elapsed="0.080178"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.419206" elapsed="0.080514"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.419189" elapsed="0.080555"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.499780" elapsed="0.000084"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:07.279690" elapsed="0.220283"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:07.275393" elapsed="0.224641"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.550799" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.550377" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.551633" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.551346" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.551802" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.551009" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.552385" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.551995" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.552733" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.552974" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.552591" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.553588" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.553173" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.554726" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.554392" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.555202" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.554935" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.556054" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.555631" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.557365" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.556757" elapsed="0.000727"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.557568" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:07.557882" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.556281" elapsed="0.001627"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.558066" elapsed="0.000411"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.555490" elapsed="0.003031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.559181" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.558776" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.560416" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.559867" elapsed="0.000668"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.560612" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:07.560931" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.559397" elapsed="0.001560"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.561111" elapsed="0.000389"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.558640" elapsed="0.002902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.555283" elapsed="0.006294"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.561623" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:07.561861" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:07.554066" elapsed="0.007820"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.553718" elapsed="0.008201"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.562103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.561948" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.553692" elapsed="0.008487"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.563229" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.562327" elapsed="0.000930"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.563307" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.549708" elapsed="0.013724"/>
</kw>
<msg time="2026-05-01T00:56:07.563505" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.536521" elapsed="0.027038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.576166" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.588478" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.600884" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.601112" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.601306" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.601748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.601592" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.601573" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.601981" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.602154" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.602322" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.601529" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.601390" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.602570" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.602753" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:56:07.602924" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.531745" elapsed="0.071207"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.604381" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.604086" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.604569" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.603679" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.604974" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.604667" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.605562" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.605247" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.605059" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.604648" elapsed="0.000998"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.607964" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.605800" elapsed="0.002191"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:07.608043" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:07.608206" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.603293" elapsed="0.004938"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.609501" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.609239" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.609660" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.608897" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:07.609891" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:07.609756" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.609737" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.610126" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.610299" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.610364" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:07.612463" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.608557" elapsed="0.003934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.613930" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.613677" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.614374" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.614132" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:07.621998" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:07.622186" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '379'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:07.622303" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:07.616547" elapsed="0.005783"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.614500" elapsed="0.007873"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.622581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.622400" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.614481" elapsed="0.008187"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.626461" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.623707" elapsed="0.002813"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.623484" elapsed="0.003072"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.623465" elapsed="0.003116"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.629158" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.626872" elapsed="0.002332"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.626642" elapsed="0.002596"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.626621" elapsed="0.002642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.629836" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.629436" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.630170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.629933" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.630726" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.630415" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.630251" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.629915" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.631325" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.630971" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.631672" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.631419" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.632205" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.631915" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.631752" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.631402" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.632437" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:07.633295" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.632997" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.633494" elapsed="0.002281"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:07.623042" elapsed="0.012796"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.636016" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:07.635910" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.635891" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.639035" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.636234" elapsed="0.002883"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:07.639173" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:07.639337" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:07.612831" elapsed="0.026533"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.639428" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:07.639601" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:07.509080" elapsed="0.130548"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.668057" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.667570" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.668958" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.668632" elapsed="0.000454">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.669425" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.668262" elapsed="0.001204"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.670082" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.669638" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.670436" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/spmsi_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.670614" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.670275" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.671068" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "s-pmsi-a-d": {
          "orig-route-ip": "1.0.0.1",
          "multicast-source": "10.0.0.10",
          "route-distinguisher": "1.2.3.4:258",
          "c-g-address": "12.0.0.12"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.670801" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:07.671643" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.671197" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.672389" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.671880" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.671730" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.671175" elapsed="0.001315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.673170" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.672640" elapsed="0.000559"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.673250" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.666936" elapsed="0.006448"/>
</kw>
<msg time="2026-05-01T00:56:07.673512" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.654223" elapsed="0.019342"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.686062" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.698344" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.710942" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.711140" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.711319" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.711716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.711567" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.711552" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.711942" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.712114" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.712285" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.711521" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.711400" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.712529" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.712607" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:07.712731" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.651497" elapsed="0.061261"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.712956" elapsed="0.002185"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.716374" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.715935" elapsed="0.000469"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.717022" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.716580" elapsed="0.000470"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.717210" elapsed="0.000340"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:07.715517" elapsed="0.002094"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.715258" elapsed="0.002387"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.717823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.717671" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.715238" elapsed="0.002662"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:07.640778" elapsed="0.077170"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:07.639959" elapsed="0.078066"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.639713" elapsed="0.078359"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.639696" elapsed="0.078400"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.718131" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:07.504571" elapsed="0.213690"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:07.500252" elapsed="0.218070"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:07.718505" elapsed="0.003210"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.776211" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.775813" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.777045" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.776769" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.777230" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.776419" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.777822" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.777421" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.778157" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.778320" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.778014" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.778765" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.778521" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.779917" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.779616" elapsed="0.000347"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.780394" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.780126" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.781246" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.780813" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.782509" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.781938" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.782691" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:07.782992" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.781483" elapsed="0.001535"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.783176" elapsed="0.000405"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.780673" elapsed="0.002951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.784276" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.783877" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:07.785540" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.784982" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:07.785718" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:07.786012" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:07.784508" elapsed="0.001530"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.786193" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:07.783740" elapsed="0.002877"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.780496" elapsed="0.006157"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:07.786698" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:07.786856" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:07.779269" elapsed="0.007612"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.778957" elapsed="0.007957"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.787092" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.786940" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.778935" elapsed="0.008235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.789250" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.787316" elapsed="0.001964"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.789331" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.775181" elapsed="0.014343"/>
</kw>
<msg time="2026-05-01T00:56:07.789582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.762443" elapsed="0.027188"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.802193" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.814713" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.827048" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.827250" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.827429" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.827819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.827672" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.827656" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.828043" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.828217" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.828384" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.827626" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.827522" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.828627" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.828703" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:07.828822" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.757901" elapsed="0.070947"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.830155" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.829899" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.830320" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.829545" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.830679" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.830415" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.831229" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.830939" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.830759" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.830397" elapsed="0.000916"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.833677" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.831483" elapsed="0.002221"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:07.833756" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:07.833946" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.829197" elapsed="0.004774"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.835144" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.834959" elapsed="0.000237"/>
</kw>
<msg time="2026-05-01T00:56:07.835280" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.834623" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.835525" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:07.835374" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.835356" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.835904" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.836046" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.835740" elapsed="0.000331"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:07.836475" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.836229" elapsed="0.000273"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:07.836549" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:07.836703" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:07.834281" elapsed="0.002446"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.838149" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.837894" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.838607" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.838350" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:07.846573" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:07.847026" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '524'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:07.847137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:07.841037" elapsed="0.006127"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.838717" elapsed="0.008495"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.847397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.847239" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.838698" elapsed="0.008802"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.851674" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"s-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"10.0.0.10","c-g-address":"12.0.0.12","orig-route-ip":"1.0.0.1"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.848519" elapsed="0.003227"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.848282" elapsed="0.003513"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.848264" elapsed="0.003626"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.855580" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.852302" elapsed="0.003344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.851976" elapsed="0.003720"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.851952" elapsed="0.003779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.856527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.855972" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.857042" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.856666" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.857655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.857335" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.857165" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.856641" elapsed="0.001099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.858271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.857904" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.858621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.858367" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.859171" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.858870" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.858703" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.858350" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.859408" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:07.860223" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.859937" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:07.860406" elapsed="0.002314"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:07.847862" elapsed="0.014921"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.862960" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:07.862854" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.862835" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.866126" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.863178" elapsed="0.002978"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:07.866208" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:07.866366" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:07.837069" elapsed="0.029324"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.866471" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:07.866626" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:07.734246" elapsed="0.132406"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.894895" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.894425" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.895793" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.895500" elapsed="0.000413">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:07.896086" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:07.895137" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.896735" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:07.896279" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:07.897113" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:07.897247" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:07.896929" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.897714" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:07.897433" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:07.898230" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.897827" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.898983" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:07.898481" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:07.898316" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:07.897808" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.899726" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:07.899223" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:07.899805" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:07.893815" elapsed="0.006117"/>
</kw>
<msg time="2026-05-01T00:56:07.899986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.881199" elapsed="0.018836"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.912526" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.925007" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.937656" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.937855" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.938036" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.938415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.938266" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:07.938251" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.938658" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.938831" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.939000" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:07.938221" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.938114" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.939235" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.939311" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:07.939430" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:07.878563" elapsed="0.060909"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:07.939654" elapsed="0.002200"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.942889" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.942606" elapsed="0.000312"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:07.943681" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:07.943075" elapsed="0.000635"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:07.944184" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "path-id": 0,
      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
      "s-pmsi-a-d": {
       "c-g-address": "12.0.0.12",
       "multicast-source": "10.0.0.10",
       "orig-route-ip": "1.0.0.1",
       "route-distinguisher": "1.2.3.4:258"
      }
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:07.944372" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.943871" elapsed="0.000619">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.942177" elapsed="0.002461">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:07.941934" elapsed="0.002785">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:07.944907" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:07.944755" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:07.941915" elapsed="0.003099">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.867786" elapsed="0.077358">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.866975" elapsed="0.078317">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:07.866735" elapsed="0.078648">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:07.866718" elapsed="0.078700">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:07.945509" elapsed="0.000018"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:07.726629" elapsed="0.219008">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,34 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "AxYAAQECAwQBAiAKAAAKIAwAAAwBAAAB",
+      "s-pmsi-a-d": {
+       "c-g-address": "12.0.0.12",
+       "multicast-source": "10.0.0.10",
+       "orig-route-ip": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.000439" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.000045" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.001305" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.001045" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.001500" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.000677" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.002124" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.001697" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.002481" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.002644" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.002322" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.003075" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.002831" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.004148" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.003845" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.004706" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.004364" elapsed="0.000369"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.005542" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.005107" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.006853" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.006271" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.007037" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:10.007343" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.005766" elapsed="0.001604"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.007546" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.004965" elapsed="0.003016"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.008688" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.008241" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.009956" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.009380" elapsed="0.000701"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.010217" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:10.010546" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.008919" elapsed="0.001655"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.010734" elapsed="0.000392"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.008100" elapsed="0.003069"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.004786" elapsed="0.006420"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.011251" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:10.011416" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:10.003518" elapsed="0.007925"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.003197" elapsed="0.008297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.011677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.011520" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.003174" elapsed="0.008584"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.012696" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.011906" elapsed="0.000821"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.012777" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:09.999406" elapsed="0.013499"/>
</kw>
<msg time="2026-05-01T00:56:10.012959" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:09.986686" elapsed="0.026324"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.025632" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.037957" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.050246" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.050446" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.050644" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.051010" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.050864" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.050849" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.051230" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.051437" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.051628" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.050820" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.050718" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.051857" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.051933" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:10.052053" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:09.982382" elapsed="0.069697"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.053326" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.053089" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.053527" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.052747" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.053922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.053660" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.054738" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.054253" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.054008" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.053633" elapsed="0.001228"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.058273" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.055079" elapsed="0.003233"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:10.058386" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:10.058635" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:10.052405" elapsed="0.006265"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.060035" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.059842" elapsed="0.000245"/>
</kw>
<msg time="2026-05-01T00:56:10.060170" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.059502" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.060560" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.060265" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.060246" elapsed="0.000382"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.060939" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.061086" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.060774" elapsed="0.000337"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:10.061521" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.061271" elapsed="0.000276"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:10.061594" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:10.061750" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:10.059107" elapsed="0.002706"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.063247" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.063002" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.063703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.063462" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:10.072018" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:10.072197" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:10.072330" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:10.066102" elapsed="0.006263"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.063811" elapsed="0.008614"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.072728" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.072501" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.063793" elapsed="0.009055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.077669" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.074321" elapsed="0.003414"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.073979" elapsed="0.003803"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.073945" elapsed="0.003872"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.081569" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.078244" elapsed="0.003391"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.077895" elapsed="0.003788"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.077872" elapsed="0.003846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.082565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.081950" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.083037" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.082702" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.083668" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.083353" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.083151" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.082677" elapsed="0.001073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.084299" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.083918" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.084717" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.084411" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.085326" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.085008" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.084810" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.084390" elapsed="0.001018"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.085586" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:10.086441" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.086134" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.086680" elapsed="0.002303"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:10.073352" elapsed="0.015694"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.089222" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.089116" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.089098" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:10.092086" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.089444" elapsed="0.002671"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:10.092167" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:10.092330" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:10.062166" elapsed="0.030190"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.092418" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:10.092587" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:09.959176" elapsed="0.133438"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.120813" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.120341" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.121652" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.121339" elapsed="0.000442">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.121961" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.121007" elapsed="0.000980"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.122709" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.122230" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.123061" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.123191" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.122905" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.123660" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.123377" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:10.124174" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.123772" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.124927" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.124414" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.124260" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.123754" elapsed="0.001258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.125731" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.125199" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.125811" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.119728" elapsed="0.006212"/>
</kw>
<msg time="2026-05-01T00:56:10.125993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.107092" elapsed="0.018950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.140857" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.153137" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.165603" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.165819" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.166002" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.166437" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.166286" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.166269" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.166679" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.166847" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.167012" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.166233" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.166085" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.167237" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.167315" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:10.167468" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.104432" elapsed="0.063066"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.167737" elapsed="0.002251"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:10.171102" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.170791" elapsed="0.000340"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:10.171573" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.171286" elapsed="0.000314"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.171757" elapsed="0.000331"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.170348" elapsed="0.001804"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.170069" elapsed="0.002116"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.172362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.172211" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.170050" elapsed="0.002387"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:10.093748" elapsed="0.078751"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:10.092943" elapsed="0.079631"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.092701" elapsed="0.079918"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.092684" elapsed="0.079959"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.172677" elapsed="0.000031"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:09.954750" elapsed="0.218060"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:07.721901" elapsed="2.450970"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:10.173092" elapsed="0.002810"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:04.911652" elapsed="5.264317"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:04.826076" elapsed="5.350015"/>
</test>
<test id="s1-s16-t10" name="Odl_To_Play_leaf_ad" line="94">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:10.179763" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:10.179488" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.181129" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.181012" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.180993" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.188056" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.187896" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.187870" elapsed="0.000289"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.189670" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.189079" elapsed="0.000632"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.190425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:10.189952" elapsed="0.000531"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:10.190551" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:56:10.190856" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.188521" elapsed="0.002372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.196463" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.196343" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.196324" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.197806" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.197685" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.197665" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:10.198434" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.198044" elapsed="0.000444"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.198890" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:10.198661" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.228586" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:10.199504" elapsed="0.029292"/>
</kw>
<msg time="2026-05-01T00:56:10.229027" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:10.229076" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.199087" elapsed="0.030026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.259150" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "e "a "f "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:10.229836" elapsed="0.029516"/>
</kw>
<msg time="2026-05-01T00:56:10.259607" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:10.259655" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.229363" elapsed="0.030328"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.260131" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.259810" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.259775" elapsed="0.000444"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.260760" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "e "a "f "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.260370" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.261130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.260905" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.260887" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:10.261249" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:10.264185" elapsed="0.000387"/>
</kw>
<msg time="2026-05-01T00:56:10.264650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.262984" elapsed="0.001811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.265082" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.265526" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:10.262286" elapsed="0.003439"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:10.261629" elapsed="0.004163"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:10.197307" elapsed="0.068587"/>
</kw>
<msg time="2026-05-01T00:56:10.266048" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:10.266094" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.196689" elapsed="0.069446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:10.266432" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-05-01T00:56:10.266305" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.266277" elapsed="0.000275"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.266986" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.267329" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.267401" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:10.196004" elapsed="0.071525"/>
</kw>
<msg time="2026-05-01T00:56:10.267624" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:10.267668" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.191386" elapsed="0.076319"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.268036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.267782" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.267765" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:10.191234" elapsed="0.076904"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:10.190973" elapsed="0.077199"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:10.187341" elapsed="0.080886"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:10.180716" elapsed="0.087575"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.180211" elapsed="0.088127"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:10.177049" elapsed="0.091343"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.269303" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/announce_leaf_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/announce_leaf_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.269554" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.269088" elapsed="0.000499"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:10.269968" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.269753" elapsed="0.000242"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.270386" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/withdraw_leaf_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/withdraw_leaf_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.270580" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.270154" elapsed="0.000453"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:10.270966" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.270764" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:10.271286" elapsed="0.002827"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.271063" elapsed="0.003107"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.271044" elapsed="0.003212"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.319055" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.318589" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.319956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.319648" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.320133" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.319276" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.320729" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.320326" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.321066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.321241" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.320925" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.321701" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.321435" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.322834" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.322574" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.323315" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.323044" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.324036" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.323731" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.325042" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.324591" elapsed="0.000478"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.325123" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:10.325293" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.324253" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.325504" elapsed="0.000246"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:10.323590" elapsed="0.002201"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.326377" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.326045" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.327341" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.326932" elapsed="0.000437"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.327421" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:10.327594" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.326611" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.327773" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.325908" elapsed="0.002131"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.323395" elapsed="0.004680"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.328119" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:10.328276" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:10.322225" elapsed="0.006077"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.321834" elapsed="0.006500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.328529" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.328361" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.321808" elapsed="0.006844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.330803" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.328801" elapsed="0.002032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.330883" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.317716" elapsed="0.013294"/>
</kw>
<msg time="2026-05-01T00:56:10.331065" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.300102" elapsed="0.031011"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.343656" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.356072" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.368545" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.368745" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.368924" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.369320" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.369148" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.369134" elapsed="0.000298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.369605" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.369778" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.369946" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.369104" elapsed="0.000895"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.369000" elapsed="0.001025"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.370174" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.370266" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:10.370390" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.294659" elapsed="0.075812"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.394913" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.394536" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.395676" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.395439" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.395838" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.395105" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.396408" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.396029" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.396750" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.396893" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.396616" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.397325" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;leaf-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;1&lt;/source-as&gt;
      &lt;/inter-as-i-pmsi-a-d&gt;
    &lt;/leaf-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.397080" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:10.397757" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.397462" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.398311" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.397988" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.397839" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.397429" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.399002" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.398561" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.399081" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.393896" elapsed="0.005312"/>
</kw>
<msg time="2026-05-01T00:56:10.399264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.381324" elapsed="0.017988"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.461730" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.474261" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.486667" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.486897" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.487085" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.487516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.487347" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.487330" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.487747" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.487915" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.488079" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.487289" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.487168" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.488312" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.488391" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:10.488580" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.380465" elapsed="0.108147"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.490081" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.489761" elapsed="0.000394">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.490249" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.489321" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.490654" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.490368" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.491292" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.490981" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.490796" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.490349" elapsed="0.001027"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.493724" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.491547" elapsed="0.002204"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:10.493802" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:10.493959" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:10.488960" elapsed="0.005023"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.495549" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.495283" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.495986" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;leaf-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;1&lt;/source-as&gt;
      &lt;/inter-as-i-pmsi-a-d&gt;
    &lt;/leaf-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.495753" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.496432" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.496192" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.496879" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.496643" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:10.497741" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:10.497544" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:10.498092" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:10.497921" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.498269" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.499069" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.498821" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:10.499155" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:10.499311" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:10.497126" elapsed="0.002210"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:10.510927" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '740', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BBICDAABAQIDBAECAAAAAQEAAAE=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;leaf-a-d&gt;
      &lt;orig-route-ip&gt;1.0.0.1&lt;/orig-route-ip&gt;
      &lt;inter-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;1&lt;/source-as&gt;
      &lt;/inter-as-i-pmsi-a-d&gt;
    &lt;/leaf-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:10.511016" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=BBICDAABAQIDBAECAAAAAQEAAAE%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:10.511216" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:10.501593" elapsed="0.009661"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.499405" elapsed="0.011910"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.511600" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.511352" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.499388" elapsed="0.012337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.516486" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.513157" elapsed="0.003391"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.512848" elapsed="0.003749"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.512823" elapsed="0.003809"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.520220" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.517018" elapsed="0.003265"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.516710" elapsed="0.003622"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.516687" elapsed="0.003680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.521157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.520619" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.521650" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.521292" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.522472" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.521992" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.521764" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.521268" elapsed="0.001323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.523323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.522818" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.523686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.523433" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.524217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.523929" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.523766" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.523415" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.524467" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:10.525256" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.524975" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.525437" elapsed="0.002313"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:10.512221" elapsed="0.015590"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:10.527988" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:10.527884" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.527866" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.528225" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.528292" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:10.530571" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:10.494333" elapsed="0.036265"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.530668" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:10.530822" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:10.282285" elapsed="0.248595"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.531228" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.530987" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.530970" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.531352" elapsed="0.000025"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:10.274870" elapsed="0.256622"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.534878" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.532392" elapsed="0.002515"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.535141" elapsed="0.002252"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:10.537445" elapsed="0.000045"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:10.532124" elapsed="0.005464"/>
</kw>
<msg time="2026-05-01T00:56:10.537664" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:10.531665" elapsed="0.006025"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.538639" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:56:10.538714" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:10.538342" elapsed="0.000396"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.539155" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:56:10.539243" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:10.538895" elapsed="0.000381"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.539476" elapsed="0.000331"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.540166" level="INFO">${sum_1} = 937</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:10.539973" elapsed="0.000222"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.540564" level="INFO">${sum_2} = 937</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:10.540355" elapsed="0.000237"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.540786" elapsed="0.000325"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:10.537944" elapsed="0.003231"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:10.541336" elapsed="0.002045"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.589158" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.588780" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.589964" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.589712" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.590135" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.589361" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.590755" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.590327" elapsed="0.000561"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.591198" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.591347" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.591057" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.591790" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.591546" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.593043" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.592736" elapsed="0.000353"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.593554" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.593255" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.594402" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.593952" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.595567" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.595075" elapsed="0.000575"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.595789" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:10.596020" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.594651" elapsed="0.001395"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.596205" elapsed="0.000430"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:10.593812" elapsed="0.002865"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.597348" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.596939" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.598520" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.597996" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.598737" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:10.598958" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.597578" elapsed="0.001406"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.599140" elapsed="0.000407"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.596802" elapsed="0.002787"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.593632" elapsed="0.005993"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.599668" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:10.599826" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:10.592223" elapsed="0.007629"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.591912" elapsed="0.007972"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.600061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.599909" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.591890" elapsed="0.008248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.600878" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.600284" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.600956" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.588141" elapsed="0.012941"/>
</kw>
<msg time="2026-05-01T00:56:10.601169" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.575534" elapsed="0.025686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.613856" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.626418" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.638967" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.639167" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.639346" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.639733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.639584" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.639569" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.639954" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.640124" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.640295" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.639539" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.639421" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.640538" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.640616" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:10.640737" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.571130" elapsed="0.069634"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.641864" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.641615" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:10.651098" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:10.651247" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:10.651383" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:10.644018" elapsed="0.007401"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.641976" elapsed="0.009531"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.651762" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.651545" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.641958" elapsed="0.009919"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.656614" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.653268" elapsed="0.003407"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.652959" elapsed="0.003764"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.652933" elapsed="0.003825"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.660355" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.657145" elapsed="0.003275"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.656834" elapsed="0.003653"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.656811" elapsed="0.003713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.661371" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.660767" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.661872" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.661530" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.662706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.662226" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.661990" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.661504" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.663516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.663059" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.663861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.663617" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.664399" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.664107" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.663943" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.663598" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.664657" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:10.665474" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.665172" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.665659" elapsed="0.002423"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:10.652375" elapsed="0.015771"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:10.668192" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:10.670486" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:10.641027" elapsed="0.029487"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.670569" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:10.544854" elapsed="0.125839"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.544209" elapsed="0.126538"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:10.543696" elapsed="0.127110"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.674480" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.671741" elapsed="0.002770"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.674690" elapsed="0.002072"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:10.676812" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:10.671468" elapsed="0.005470"/>
</kw>
<msg time="2026-05-01T00:56:10.677014" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:10.670975" elapsed="0.006064"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.677902" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:56:10.677977" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:10.677639" elapsed="0.000362"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.678445" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:56:10.678541" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:10.678158" elapsed="0.000406"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.678722" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.679474" level="INFO">${sum_1} = 786</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:10.679185" elapsed="0.000331"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:10.680039" level="INFO">${sum_2} = 786</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:10.679731" elapsed="0.000351"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:10.680308" elapsed="0.000452"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:10.677254" elapsed="0.003590"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.726924" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.726347" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.728044" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.727686" elapsed="0.000457">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.728272" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.727199" elapsed="0.001107"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.729096" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.728560" elapsed="0.000573"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.729571" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.729771" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.729360" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.730365" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.730031" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.731736" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.731481" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.732210" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.731941" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.733286" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.732744" elapsed="0.000568"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.734492" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.734007" elapsed="0.000529"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.734657" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:10.734885" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.733530" elapsed="0.001381"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.735067" elapsed="0.000653"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:10.732598" elapsed="0.003165"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.736532" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.736013" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.737675" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.737219" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.737832" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:10.738049" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.736746" elapsed="0.001330"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.738230" elapsed="0.000560"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.735879" elapsed="0.002954"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.732287" elapsed="0.006582"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.738913" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:10.739070" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:10.731009" elapsed="0.008087"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.730590" elapsed="0.008537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.739303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.739152" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.730560" elapsed="0.008819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.740270" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.739541" elapsed="0.000764"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.740366" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.725415" elapsed="0.015102"/>
</kw>
<msg time="2026-05-01T00:56:10.740578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.712627" elapsed="0.028013"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.753161" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.765554" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.778019" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.778217" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.778392" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.778808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.778661" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:10.778646" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.779029" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.779198" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.779368" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:10.778618" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.778511" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.779680" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.779762" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:10.779883" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.707990" elapsed="0.071919"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.781045" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.780798" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:10.788498" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:10.788639" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:10.788773" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:10.788816" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.783198" elapsed="0.005994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:10.781157" elapsed="0.008131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.789601" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.789346" elapsed="0.000385"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:10.781139" elapsed="0.008627">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.794781" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.791255" elapsed="0.003573">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:10.790937" elapsed="0.003978">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:10.790911" elapsed="0.004049">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.798640" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.795377" elapsed="0.003309">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:10.795056" elapsed="0.003717">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:10.795033" elapsed="0.003785">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.799596" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.799078" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.799937" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.799696" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.800502" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.800190" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.800025" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.799677" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.801109" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.800751" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.801443" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.801205" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.801993" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.801703" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.801539" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.801187" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.802228" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:10.803042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.802765" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:10.805494" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.803223" elapsed="0.002304">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.790288" elapsed="0.015373">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:10.805721" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:10.808092" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:10.808121" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:10.780174" elapsed="0.027976">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.808249" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.682312" elapsed="0.126110">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.681729" elapsed="0.126771"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:10.681155" elapsed="0.127403"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:10.268700" elapsed="0.539908"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.176604" elapsed="0.632118"/>
</test>
<test id="s1-s16-t11" name="Play_To_Odl_leaf_ad" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:10.812034" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:10.811766" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.813291" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.813181" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.813162" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.818313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.818207" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.818190" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.819389" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.819014" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.819885" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:10.819593" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:10.819956" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:10.820109" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.818640" elapsed="0.001493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.825601" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.825493" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.825473" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.826857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:10.826750" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.826732" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:10.827368" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.827075" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.827788" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:10.827572" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.858862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:10.828306" elapsed="0.030669"/>
</kw>
<msg time="2026-05-01T00:56:10.859146" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:10.859192" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.827975" elapsed="0.031253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:10.882777" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "e "a "f "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:10.859800" elapsed="0.023082"/>
</kw>
<msg time="2026-05-01T00:56:10.883043" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:10.883088" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.859415" elapsed="0.023759"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.883530" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.883262" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.883236" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.884059" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "e "a "f "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.883759" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.884410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.884191" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.884173" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:10.884543" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:10.887146" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:56:10.887352" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.886017" elapsed="0.001486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.887784" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.888120" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:10.885369" elapsed="0.002936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:10.884830" elapsed="0.003540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:10.826398" elapsed="0.062086"/>
</kw>
<msg time="2026-05-01T00:56:10.888577" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:10.888621" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.825821" elapsed="0.062836"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:10.888841" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:10.888734" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.888716" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.889328" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.889681" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:10.889754" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:10.825144" elapsed="0.064717"/>
</kw>
<msg time="2026-05-01T00:56:10.889954" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:10.889998" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.820520" elapsed="0.069513"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.890359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.890109" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.890092" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:10.820359" elapsed="0.070123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:10.820184" elapsed="0.070346"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:10.817842" elapsed="0.072745"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:10.812894" elapsed="0.077757"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:10.812464" elapsed="0.078268"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:10.809517" elapsed="0.081271"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.891903" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.891417" elapsed="0.000515"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.892574" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.892101" elapsed="0.000501"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.893150" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.892771" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.893555" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/announce_leaf_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/announce_leaf_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.893709" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.893341" elapsed="0.000395"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.894081" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/withdraw_leaf_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/withdraw_leaf_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.894202" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.893894" elapsed="0.000334"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:10.894381" elapsed="0.002560"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:10.897121" elapsed="0.001550"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.950849" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:10.950424" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.951651" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.951377" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:10.951823" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:10.951045" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.952399" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:10.952015" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:10.952744" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:10.952890" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:10.952604" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.953318" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.953077" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.954373" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:10.954079" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.954940" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.954667" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.955764" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.955338" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.957000" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.956436" elapsed="0.000667"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.957184" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:10.957498" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.955984" elapsed="0.001542"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.957686" elapsed="0.000381"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:10.955193" elapsed="0.002917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.960113" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:10.958363" elapsed="0.001778"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:10.961352" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.960812" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:10.961549" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:10.961843" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:10.960336" elapsed="0.001534"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:10.962027" elapsed="0.000365"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:10.958226" elapsed="0.004209"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.955018" elapsed="0.007468"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:10.962550" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:10.962713" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:10.953752" elapsed="0.008986"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.953437" elapsed="0.009334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.962948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:10.962797" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:10.953415" elapsed="0.009610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:10.963770" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:10.963170" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:10.963850" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:10.949801" elapsed="0.014174"/>
</kw>
<msg time="2026-05-01T00:56:10.964029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:10.936925" elapsed="0.027154"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.976727" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:10.989385" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.001846" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.002056" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.002239" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.002683" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:11.002506" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:11.002489" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.002913" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.003081" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.003248" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:11.002437" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.002326" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.003492" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.003570" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:11.003712" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:10.932666" elapsed="0.071073"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:11.005081" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:11.004800" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:11.005248" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:11.004410" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.005620" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:11.005345" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:11.006177" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:11.005884" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:11.005703" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:11.005327" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:11.008811" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:11.006421" elapsed="0.002417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:11.008890" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:11.009046" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:11.004070" elapsed="0.005001"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:11.010342" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:11.010104" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:11.010512" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:11.009765" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:11.010775" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:11.010639" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:11.010620" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.011010" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.011186" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.011252" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:11.013171" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:11.009422" elapsed="0.003776"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:11.014656" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:11.014370" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:11.015096" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:11.014857" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:11.022320" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:11.022482" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:11.022608" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:11.017265" elapsed="0.005713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:11.015205" elapsed="0.007856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.023251" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:11.023096" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:11.015187" elapsed="0.008157">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.023746" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.023879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:11.023842" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:11.023824" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.024093" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.024195" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:11.013555" elapsed="0.010749">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.024378" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.909802" elapsed="0.114689">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:11.024773" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:11.024587" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:11.024570" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:11.024903" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:10.903714" elapsed="0.121288">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.086680" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.086267" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.087525" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.087232" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.087733" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.086894" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.088317" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.087930" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.088704" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.088979" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.088532" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.089584" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.089237" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.090776" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.090424" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.091264" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.090987" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.092200" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.091778" elapsed="0.000518"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.093600" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.092995" elapsed="0.000710"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.093790" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:13.094112" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.092527" elapsed="0.001612"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.094300" elapsed="0.000426"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:13.091576" elapsed="0.003194"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.095689" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.095026" elapsed="0.000692"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.096964" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.096376" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.097148" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:13.097588" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.095915" elapsed="0.001702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.097782" elapsed="0.000384"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.094889" elapsed="0.003320"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.091342" elapsed="0.006905"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.098292" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:13.098524" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:13.090085" elapsed="0.008468"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.089750" elapsed="0.008839"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.098776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.098617" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.089722" elapsed="0.009134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.099666" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.099007" elapsed="0.000689"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.099746" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.085638" elapsed="0.014238"/>
</kw>
<msg time="2026-05-01T00:56:13.099933" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.070234" elapsed="0.029751"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.112598" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.124959" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.137397" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.137612" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.137793" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.138168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.138020" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.138004" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.138391" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.138578" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.138747" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.137973" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.137870" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.138976" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.139052" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:13.139180" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.065844" elapsed="0.073363"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.140562" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.140280" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.140732" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.139925" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.141081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.140828" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.141656" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.141345" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.141162" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.140809" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.144262" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.141892" elapsed="0.002398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:13.144344" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:13.144520" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.139557" elapsed="0.004990"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.145776" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.145542" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.145972" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.145186" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:13.146207" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:13.146070" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.146051" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.146445" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.146780" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.146848" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:13.148813" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.144858" elapsed="0.003982"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.150238" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.149989" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.150699" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.150441" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:13.158174" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:13.158569" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '354'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:13.158670" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:13.152886" elapsed="0.005810"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.150810" elapsed="0.007929"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.158922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.158766" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.150792" elapsed="0.008216"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.163579" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.160067" elapsed="0.003583"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.159845" elapsed="0.003874"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.159827" elapsed="0.003929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.167341" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.164149" elapsed="0.003257"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.163835" elapsed="0.003638"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.163812" elapsed="0.003699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.168316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.167781" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.168687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.168427" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.169237" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.168938" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.168770" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.168409" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.169906" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.169541" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.170241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.170004" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.170801" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.170505" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.170323" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.169986" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.171040" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:13.171886" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.171572" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.172074" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:13.159376" elapsed="0.015098"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.174660" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:13.174551" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.174531" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.177733" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.174888" elapsed="0.002875"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:13.177816" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:13.177979" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:13.149157" elapsed="0.028849"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.178069" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:13.178222" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:13.042797" elapsed="0.135453"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.206773" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.206292" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.207615" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.207302" elapsed="0.000473">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.207955" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.206967" elapsed="0.001013"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.208609" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.208150" elapsed="0.000532"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.209013" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.209174" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.208851" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.209646" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "leaf-a-d": {
          "orig-route-ip": "1.0.0.1",
          "inter-as-i-pmsi-a-d": {
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 1
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.209361" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:13.210169" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.209763" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.210927" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.210409" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.210254" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.209745" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.211671" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.211162" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.211767" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.205676" elapsed="0.006220"/>
</kw>
<msg time="2026-05-01T00:56:13.211953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.192855" elapsed="0.019146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.224481" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.236847" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.249367" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.249581" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.249799" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.250190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.250040" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.250024" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.250418" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.250609" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.250778" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.249994" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.249883" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.251010" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.251086" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:13.251224" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.190024" elapsed="0.061227"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.251434" elapsed="0.002254"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.255096" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.254470" elapsed="0.000654"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.255734" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.255282" elapsed="0.000480"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.255922" elapsed="0.000336"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.254028" elapsed="0.002290"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.253772" elapsed="0.002578"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.256542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.256376" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.253753" elapsed="0.002865"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:13.179406" elapsed="0.077259"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:13.178601" elapsed="0.078140"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.178334" elapsed="0.078454"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.178317" elapsed="0.078495"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.256847" elapsed="0.000033"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:13.035515" elapsed="0.221469"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:10.898867" elapsed="2.358177"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.312503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.311935" elapsed="0.000604"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.313374" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.313109" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.313565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.312738" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.314164" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.313764" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.314528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.314698" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.314364" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.315142" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.314891" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.316302" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.315982" elapsed="0.000368"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.316832" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.316541" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.317673" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.317233" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.318956" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.318361" elapsed="0.000698"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.319142" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:13.319481" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.317895" elapsed="0.001614"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.319670" elapsed="0.000439"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:13.317091" elapsed="0.003061"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.320881" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.320409" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.322146" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.321587" elapsed="0.000667"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.322336" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:13.322656" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.321104" elapsed="0.001579"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.322840" elapsed="0.000381"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.320271" elapsed="0.002992"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.316912" elapsed="0.006388"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.323415" elapsed="0.000064"/>
</return>
<msg time="2026-05-01T00:56:13.323620" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:13.315626" elapsed="0.008021"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.315270" elapsed="0.008410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.323889" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.323710" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.315246" elapsed="0.008724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.324983" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.324118" elapsed="0.000896"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.325065" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.310885" elapsed="0.014309"/>
</kw>
<msg time="2026-05-01T00:56:13.325251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.293343" elapsed="0.031961"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.337972" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.350408" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.363281" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.363516" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.363704" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.364135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.363983" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.363966" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.364363" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.364554" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.364725" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.363929" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.363813" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.364954" elapsed="0.000080"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.365095" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:13.365241" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.288617" elapsed="0.076653"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.366653" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.366351" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.366821" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.365969" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.367182" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.366917" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.367787" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.367465" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.367265" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.366899" elapsed="0.000975"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.370212" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.368029" elapsed="0.002210"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:13.370291" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:13.370462" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.365619" elapsed="0.004871"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.371717" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.371483" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.371902" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.371126" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:13.372134" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:13.371998" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.371980" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.372371" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.372568" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.372635" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:13.374857" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.370801" elapsed="0.004083"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.376315" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.376063" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.376782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.376540" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:13.384356" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:13.384530" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '354'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:13.384638" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:13.378948" elapsed="0.005717"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.376892" elapsed="0.007819"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.384908" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.384740" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.376874" elapsed="0.008121"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.388615" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.386052" elapsed="0.002633"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.385825" elapsed="0.002907"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.385807" elapsed="0.002961"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.392390" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.389156" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.388845" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.388822" elapsed="0.003743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.393376" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.392823" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.393875" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.393536" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.394666" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.394224" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.393990" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.393510" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.395532" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.395011" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.396038" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.395668" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.396892" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.396478" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.396152" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.395642" elapsed="0.001342"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.397144" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:13.397981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.397675" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.398167" elapsed="0.002495"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:13.385374" elapsed="0.015356"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.400985" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:13.400872" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.400853" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.404107" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.401207" elapsed="0.002929"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:13.404190" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:13.404363" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:13.375200" elapsed="0.029193"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.404473" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:13.404629" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:13.265955" elapsed="0.138701"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.432837" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.432344" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.433699" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.433372" elapsed="0.000457">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.434008" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.433034" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.434669" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.434205" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.435027" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.435186" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.434863" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.435665" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "leaf-a-d": {
          "orig-route-ip": "1.0.0.1",
          "inter-as-i-pmsi-a-d": {
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 1
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.435377" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:13.436221" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.435783" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.436989" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.436477" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.436306" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.435764" elapsed="0.001311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.437725" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.437226" elapsed="0.000567"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.437846" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.431712" elapsed="0.006263"/>
</kw>
<msg time="2026-05-01T00:56:13.438032" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.419157" elapsed="0.018924"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.451867" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.464317" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.476898" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.477175" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.477371" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.477842" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.477684" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.477666" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.478079" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.478250" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.478423" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.477623" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.477476" elapsed="0.001046"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.478675" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.478756" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:13.478943" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.416534" elapsed="0.062439"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.479232" elapsed="0.002359"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.482861" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.482373" elapsed="0.000517"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.483481" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.483049" elapsed="0.000462"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.483671" elapsed="0.000366"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.481937" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.481673" elapsed="0.002461"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.484313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.484159" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.481654" elapsed="0.002739"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:13.405854" elapsed="0.078590"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:13.405014" elapsed="0.079528"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.404741" elapsed="0.079848"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.404723" elapsed="0.079891"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.484650" elapsed="0.000034"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:13.261621" elapsed="0.223163"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:13.257274" elapsed="0.227570"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.535230" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.534827" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.536179" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.535916" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.536353" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.535528" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.536949" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.536564" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.537285" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.537463" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.537144" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.537901" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.537654" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.539084" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.538777" elapsed="0.000353"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.539591" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.539293" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.540411" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.540006" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.541688" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.541112" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.541870" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:13.542172" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.540652" elapsed="0.001546"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.542358" elapsed="0.000403"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.539868" elapsed="0.002936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.543475" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.543059" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.544742" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.544169" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.544922" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:13.545215" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.543696" elapsed="0.001546"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.545399" elapsed="0.000388"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.542922" elapsed="0.002909"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.539670" elapsed="0.006197"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.545914" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:13.546075" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:13.538433" elapsed="0.007668"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.538100" elapsed="0.008034"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.546317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.546161" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.538075" elapsed="0.008320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.547344" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.546559" elapsed="0.000814"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.547423" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.534156" elapsed="0.013414"/>
</kw>
<msg time="2026-05-01T00:56:13.547624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.521296" elapsed="0.026379"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.560329" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.572991" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.585392" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.585604" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.585785" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.586167" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.586018" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.586003" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.586389" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.586575" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.586745" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.585971" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.585863" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.586974" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.587050" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:13.587175" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.516712" elapsed="0.070489"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.588551" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.588257" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.588719" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.587905" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.589063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.588813" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.589638" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.589326" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.589145" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.588795" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.592093" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.589873" elapsed="0.002247"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:13.592172" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:13.592390" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.587547" elapsed="0.004869"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.593719" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.593465" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.593879" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.593084" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:13.594112" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:13.593975" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.593957" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.594348" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.594539" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.594608" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:13.596860" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.592750" elapsed="0.004137"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.598292" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.598039" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.598765" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.598518" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:13.606380" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:13.606543" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '354'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:13.606656" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:13.600983" elapsed="0.005700"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.598877" elapsed="0.007849"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.606911" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.606753" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.598859" elapsed="0.008139"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.611367" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.608072" elapsed="0.003363"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.607804" elapsed="0.003701"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.607787" elapsed="0.003755"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.615148" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.611958" elapsed="0.003254"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.611620" elapsed="0.003640"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.611597" elapsed="0.003697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.616125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.615558" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.616594" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.616310" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.617145" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.616846" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.616677" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.616284" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.617779" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.617398" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.618112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.617876" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.618668" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.618357" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.618193" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.617858" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.618904" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:13.619727" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.619414" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.619998" elapsed="0.002298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:13.607366" elapsed="0.014992"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.622552" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:13.622429" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.622410" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.625707" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.622769" elapsed="0.002968"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:13.625789" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:13.625946" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:13.597206" elapsed="0.028767"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.626035" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:13.626187" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:13.493770" elapsed="0.132444"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.654626" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.654131" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.655426" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.655161" elapsed="0.000402">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.655788" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.654823" elapsed="0.000992"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.656465" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.656007" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.656822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.656971" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.656663" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.657426" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "leaf-a-d": {
          "orig-route-ip": "1.0.0.1",
          "inter-as-i-pmsi-a-d": {
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 1
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.657160" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:13.657961" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.657562" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.658719" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.658197" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.658047" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.657543" elapsed="0.001262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.659444" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.658955" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.659545" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.653514" elapsed="0.006161"/>
</kw>
<msg time="2026-05-01T00:56:13.659733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.640856" elapsed="0.018926"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.672272" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.684681" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.697280" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.697533" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.697715" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.698098" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.697951" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.697937" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.698320" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.698505" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.698675" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.697906" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.697797" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.698904" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.698980" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:13.699119" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.638174" elapsed="0.060972"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.699328" elapsed="0.002250"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.702773" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.702315" elapsed="0.000517"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.703409" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.702990" elapsed="0.000447"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.703611" elapsed="0.000341"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:13.701903" elapsed="0.002110"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.701660" elapsed="0.002388"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.704225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.704073" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.701641" elapsed="0.002661"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:13.627361" elapsed="0.076989"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:13.626561" elapsed="0.077868"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.626297" elapsed="0.078196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.626280" elapsed="0.078238"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.704553" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:13.489369" elapsed="0.215310"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:13.485022" elapsed="0.219786"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:13.704977" elapsed="0.002781"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.761090" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.760715" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.761863" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.761635" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.762027" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.761286" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.762615" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.762218" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.762941" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.763081" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.762806" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.763520" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.763265" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.764565" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.764261" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.765045" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.764776" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.765854" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.765429" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.767085" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.766544" elapsed="0.000642"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.767264" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:13.767586" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.766072" elapsed="0.001540"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.767772" elapsed="0.000416"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.765291" elapsed="0.002940"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.768908" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.768504" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:13.770136" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.769595" elapsed="0.000642"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:13.770314" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:13.770624" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:13.769124" elapsed="0.001527"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.770809" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:13.768345" elapsed="0.002911"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.765120" elapsed="0.006175"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:13.771339" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:13.771523" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:13.763925" elapsed="0.007624"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.763634" elapsed="0.007948"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.771761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.771608" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.763615" elapsed="0.008224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.772751" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.772003" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.772832" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.760086" elapsed="0.012873"/>
</kw>
<msg time="2026-05-01T00:56:13.773013" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.747237" elapsed="0.025825"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.785792" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.798213" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.810720" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.810928" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.811109" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.811505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.811342" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.811326" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.811731" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.811901" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.812092" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.811294" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.811186" elapsed="0.001051"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.812394" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.812489" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:13.812621" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.742832" elapsed="0.069815"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.813997" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.813726" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.814164" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.813324" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.814531" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.814261" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.815091" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.814798" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.814615" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.814243" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.817546" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.815328" elapsed="0.002244"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:13.817625" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:13.817782" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.812985" elapsed="0.004821"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.818991" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.818802" elapsed="0.000241"/>
</kw>
<msg time="2026-05-01T00:56:13.819127" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.818461" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.819355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:13.819221" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.819203" elapsed="0.000219"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.819751" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.819896" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.819585" elapsed="0.000336"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:13.820345" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.820109" elapsed="0.000262"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:13.820418" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:13.820588" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:13.818118" elapsed="0.002496"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.822008" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.821763" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.822507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.822246" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:13.830245" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:13.830874" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '499'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:13.831035" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:13.824898" elapsed="0.006175"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.822618" elapsed="0.008517"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.831396" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.831173" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.822599" elapsed="0.008940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.836641" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BBICDAABAQIDBAECAAAAAQEAAAE=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"leaf-a-d":{"inter-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","source-as":1},"orig-route-ip":"1.0.0.1"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.833072" elapsed="0.003640"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.832762" elapsed="0.003999"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.832737" elapsed="0.004060"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.840410" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.837191" elapsed="0.003303"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.836876" elapsed="0.003667"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.836853" elapsed="0.003726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.841340" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.840813" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.841834" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.841498" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.842615" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.842175" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.841946" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.841470" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.843489" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.842960" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.843962" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.843626" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.844667" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.844347" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.844112" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.843602" elapsed="0.001148"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.844903" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:13.845714" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.845412" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:13.845932" elapsed="0.002305"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:13.832135" elapsed="0.016164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.848492" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:13.848369" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.848351" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.851722" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.848710" elapsed="0.003041"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:13.851803" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:13.851961" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:13.820935" elapsed="0.031053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.852083" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:13.852237" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:13.719932" elapsed="0.132331"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.880441" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.879952" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.881258" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.880997" elapsed="0.000392">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:13.881584" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:13.880661" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.882219" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:13.881782" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:13.882584" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:13.882713" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:13.882411" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.883159" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:13.882897" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:13.883688" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.883274" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.884438" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:13.883922" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:13.883773" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:13.883255" elapsed="0.001322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.885214" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:13.884733" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:13.885293" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:13.879326" elapsed="0.006095"/>
</kw>
<msg time="2026-05-01T00:56:13.885506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.866761" elapsed="0.018795"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.898023" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.910405" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.922963" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.923162" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.923342" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.923728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.923582" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:13.923567" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.923948" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.924139" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.924308" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:13.923536" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.923418" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.924548" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.924626" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:13.924743" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:13.864114" elapsed="0.060656"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:13.924984" elapsed="0.002181"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.928214" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.927915" elapsed="0.000327"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:13.928998" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:13.928398" elapsed="0.000629"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:13.929522" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "leaf-a-d": {
       "inter-as-i-pmsi-a-d": {
        "route-distinguisher": "1.2.3.4:258",
        "source-as": 1
       },
       "orig-route-ip": "1.0.0.1"
      },
      "path-id": 0,
      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:13.929712" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.929183" elapsed="0.000598">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.927504" elapsed="0.002424">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:13.927244" elapsed="0.002763">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:13.930193" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:13.930042" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:13.927226" elapsed="0.003046">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.853397" elapsed="0.077027">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.852608" elapsed="0.077984">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:13.852348" elapsed="0.078333">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:13.852330" elapsed="0.078386">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:13.930765" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:13.713877" elapsed="0.217011">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,35 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "leaf-a-d": {
+       "inter-as-i-pmsi-a-d": {
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 1
+       },
+       "orig-route-ip": "1.0.0.1"
+      },
+      "path-id": 0,
+      "route-key": "BBICDAABAQIDBAECAAAAAQEAAAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.987600" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:15.987084" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:15.988647" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:15.988312" elapsed="0.000429">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:15.988861" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:15.987875" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.989660" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:15.989155" elapsed="0.000539"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:15.990171" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:15.990365" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:15.989990" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.990949" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:15.990640" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.992315" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:15.991940" elapsed="0.000433"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.992958" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:15.992619" elapsed="0.000372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.994032" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:15.993526" elapsed="0.000539"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:15.995638" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:15.994920" elapsed="0.000841"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:15.995863" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:15.996242" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:15.994318" elapsed="0.001957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:15.996507" elapsed="0.000494"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:15.993313" elapsed="0.003741"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:15.997936" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:15.997408" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:15.999522" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:15.998822" elapsed="0.000828"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:15.999748" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:16.000116" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:15.998218" elapsed="0.001931"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.000357" elapsed="0.002160"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:15.997220" elapsed="0.005360"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:15.993056" elapsed="0.009570"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.002683" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:16.002886" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:15.991522" elapsed="0.011395"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:15.991103" elapsed="0.011853"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.003191" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.002989" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:15.991075" elapsed="0.012216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.004242" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.003504" elapsed="0.000774"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.004341" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:15.986260" elapsed="0.018258"/>
</kw>
<msg time="2026-05-01T00:56:16.004590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:15.972440" elapsed="0.032212"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.022134" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.039325" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.056583" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.056858" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.057103" elapsed="0.000027"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.057659" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.057432" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.057412" elapsed="0.000351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.057962" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.058192" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.058419" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.057370" elapsed="0.001134"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.057228" elapsed="0.001312"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.058741" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.058839" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:56:16.059005" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:15.968178" elapsed="0.090861"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.060779" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.060401" elapsed="0.000470">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.060998" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.059925" elapsed="0.001106"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.061529" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.061123" elapsed="0.000537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.062314" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.061938" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.061694" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.061099" elapsed="0.001321"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.065778" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.062649" elapsed="0.003163"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:16.065878" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:16.066079" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:16.059486" elapsed="0.006627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.067663" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.067401" elapsed="0.000332"/>
</kw>
<msg time="2026-05-01T00:56:16.067837" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.066961" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.068133" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.067962" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.067938" elapsed="0.000282"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.068643" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.068832" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.068416" elapsed="0.000448"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:16.069422" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.069075" elapsed="0.000398"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:16.069534" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:16.069730" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:16.066540" elapsed="0.003222"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.071593" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.071263" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.072161" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.071860" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:16.081435" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:16.081632" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:16.081774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:16.075475" elapsed="0.006331"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.072299" elapsed="0.009562"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.082103" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.081895" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.072276" elapsed="0.009940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.086876" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.083559" elapsed="0.003436"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.083249" elapsed="0.003791"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.083225" elapsed="0.003848"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.090607" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.087444" elapsed="0.003221"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.087145" elapsed="0.003564"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.087124" elapsed="0.003617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.091490" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.090977" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.091938" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.091619" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.092651" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.092260" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.092041" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.091595" elapsed="0.001163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.093492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.092976" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.093929" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.093619" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.094644" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.094251" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.094032" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.093596" elapsed="0.001153"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.094956" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:16.095996" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.095628" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.096234" elapsed="0.003180"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:16.082724" elapsed="0.016796"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.099757" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.099616" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.099591" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:16.103702" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.100052" elapsed="0.003687"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:16.103805" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:16.104013" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:16.070177" elapsed="0.033871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.104136" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:16.104334" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:15.945567" elapsed="0.158802"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.145723" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.144493" elapsed="0.001280"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.147062" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.146604" elapsed="0.000650">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.147542" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.146049" elapsed="0.001531"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.148561" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.147836" elapsed="0.000778"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.149124" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.149389" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.148870" elapsed="0.000562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.150105" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.149699" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:16.151038" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.150300" elapsed="0.000834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.152190" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.151400" elapsed="0.000831"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.151177" elapsed="0.001109"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.150263" elapsed="0.002058"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.153372" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.152570" elapsed="0.000845"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.153515" elapsed="0.000056"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.142875" elapsed="0.010853"/>
</kw>
<msg time="2026-05-01T00:56:16.153809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.124354" elapsed="0.029530"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.167731" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.180138" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.193065" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.193318" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.193520" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.193928" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.193778" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.193761" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.194148" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.194315" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.194495" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.193727" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.193610" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.194727" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.194803" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:16.194933" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.120761" elapsed="0.074199"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.195141" elapsed="0.002255"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:16.198556" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.198214" elapsed="0.000371"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:16.199012" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.198741" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.199200" elapsed="0.000370"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.197785" elapsed="0.001845"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.197506" elapsed="0.002157"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.199838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.199688" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.197483" elapsed="0.002432"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:16.105904" elapsed="0.094059"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:16.104829" elapsed="0.095211"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.104501" elapsed="0.095655"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.104476" elapsed="0.095706"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.200218" elapsed="0.000031"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:15.940415" elapsed="0.259939"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:13.707989" elapsed="2.492427"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:16.200656" elapsed="0.002652"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:10.891042" elapsed="5.312327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:10.809051" elapsed="5.394487"/>
</test>
<test id="s1-s16-t12" name="Odl_To_Play_source_active_ad" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:16.206991" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:16.206721" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.208377" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.208243" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.208220" elapsed="0.000254"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.213763" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.213647" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.213627" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.214886" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.214475" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.215378" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:16.215081" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:16.215466" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:16.215637" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.214075" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.221344" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.221149" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.221130" elapsed="0.000290"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.222681" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.222571" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.222553" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:16.223218" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.222903" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.223659" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:16.223413" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.255630" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:16.224185" elapsed="0.031610"/>
</kw>
<msg time="2026-05-01T00:56:16.256054" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:16.256128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.223847" elapsed="0.032333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.295169" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "o "u "r "c "e "_ "a "c "t "i "v "e "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:16.257024" elapsed="0.038271"/>
</kw>
<msg time="2026-05-01T00:56:16.295570" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:16.295618" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.256482" elapsed="0.039172"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.296020" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.295765" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.295739" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.296587" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "o "u "r "c "e "_ "a "c "t "i "v "e "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.296249" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.296974" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.296748" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.296730" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:16.297091" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:16.299868" elapsed="0.000339"/>
</kw>
<msg time="2026-05-01T00:56:16.300272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.298708" elapsed="0.001701"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.300739" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.301089" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:16.298038" elapsed="0.003277"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:16.297446" elapsed="0.003940"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:16.222238" elapsed="0.079264"/>
</kw>
<msg time="2026-05-01T00:56:16.301597" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:16.301643" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.221601" elapsed="0.080078"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:16.301870" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:16.301758" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.301739" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.302375" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.302742" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.302814" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:16.220797" elapsed="0.082129"/>
</kw>
<msg time="2026-05-01T00:56:16.303020" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:16.303066" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.216055" elapsed="0.087048"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.303439" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.303180" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.303162" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:16.215906" elapsed="0.087667"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:16.215721" elapsed="0.087885"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:16.213208" elapsed="0.090456"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:16.207938" elapsed="0.095828"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.207471" elapsed="0.096342"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:16.204420" elapsed="0.099450"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.304889" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/announce_source_active_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/announce_source_active_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.305088" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.304666" elapsed="0.000450"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:16.305599" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.305342" elapsed="0.000287"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.305998" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/withdraw_source_active_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/withdraw_source_active_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.306135" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.305803" elapsed="0.000359"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:16.306549" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.306324" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:16.306871" elapsed="0.002466"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.306650" elapsed="0.002723"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.306631" elapsed="0.002768"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.346116" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.345740" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.346917" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.346671" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.347092" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.346312" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.347690" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.347287" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.348015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.348146" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.347880" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.348591" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.348331" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.349631" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.349356" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.350152" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.349839" elapsed="0.000339"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.350861" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.350560" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.351825" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.351397" elapsed="0.000455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.351904" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:16.352061" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.351078" elapsed="0.001007"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.352243" elapsed="0.000267"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:16.350405" elapsed="0.002147"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.353099" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.352803" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.354071" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.353668" elapsed="0.000430"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.354149" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:16.354302" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.353331" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.354497" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:16.352667" elapsed="0.002095"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.350229" elapsed="0.004569"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.354842" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:16.354997" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:16.349003" elapsed="0.006018"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.348705" elapsed="0.006348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.355230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.355079" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.348686" elapsed="0.006620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.356207" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.355467" elapsed="0.000769"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.356287" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.345093" elapsed="0.011319"/>
</kw>
<msg time="2026-05-01T00:56:16.356482" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.332361" elapsed="0.024170"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.369077" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.381816" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.394380" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.394598" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.394781" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.395158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.395009" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.394994" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.395381" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.395568" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.395738" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.394964" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.394858" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.395966" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.396042" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:16.396162" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.327955" elapsed="0.068233"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.423053" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.422681" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.423823" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.423596" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.423986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.423246" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.424573" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.424178" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.424899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.425038" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.424764" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.425497" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-active-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
      &lt;multicast-group&gt;2.0.0.2&lt;/multicast-group&gt;
    &lt;/source-active-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.425227" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:16.425959" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.425660" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.426502" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.426191" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.426042" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.425641" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.427181" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.426736" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.427261" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.422052" elapsed="0.005337"/>
</kw>
<msg time="2026-05-01T00:56:16.427445" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.409421" elapsed="0.018090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.440077" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.452527" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.464872" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.465070" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.465249" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.465646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.465498" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.465483" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.465869" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.466039" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.466206" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.465440" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.465323" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.466486" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.466566" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:16.466695" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ip...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.408558" elapsed="0.058166"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.468009" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.467753" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.468167" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.467391" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.468525" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.468261" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.469075" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.468787" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.468607" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.468243" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.471565" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.469312" elapsed="0.002280"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:16.471644" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:16.471798" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:16.467064" elapsed="0.004759"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.473346" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.473099" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.473815" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-active-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
      &lt;multicast-group&gt;2.0.0.2&lt;/multicast-group&gt;
    &lt;/source-active-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.473577" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.474266" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.474024" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.474713" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.474473" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:16.475582" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:16.475365" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:16.475935" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:16.475762" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.476108" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.476776" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.476526" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:16.476862" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:16.477020" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:16.474961" elapsed="0.002084"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:16.500582" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '721', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BRIAAQECAwQBAiABAAABIAIAAAI=&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-active-a-d&gt;
      &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
      &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
      &lt;multicast-group&gt;2.0.0.2&lt;/multicast-group&gt;
    &lt;/source-active-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:16.500725" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=BRIAAQECAwQBAiABAAABIAIAAAI%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:16.500934" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:16.479384" elapsed="0.021606"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.477115" elapsed="0.023978"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.501596" elapsed="0.000822"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.501153" elapsed="0.001689"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.477097" elapsed="0.025827"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.511195" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.505791" elapsed="0.005447"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.505212" elapsed="0.006061"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.505171" elapsed="0.006128"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.513918" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.511591" elapsed="0.002373"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.511355" elapsed="0.002644"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.511338" elapsed="0.002686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.514606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.514191" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.514945" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.514705" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.515514" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.515191" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.515026" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.514686" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.516120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.515762" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.516466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.516216" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.517004" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.516715" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.516548" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.516198" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.517235" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:16.518172" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.517882" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.518353" elapsed="0.002310"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:16.504114" elapsed="0.016612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:16.520905" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:56:16.520799" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.520781" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.521150" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.521218" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:16.523544" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:16.472155" elapsed="0.051417"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.523642" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:16.523797" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:16.314263" elapsed="0.209558"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.524170" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.523925" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.523908" elapsed="0.000355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.524297" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:16.309704" elapsed="0.214718"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.527910" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.525358" elapsed="0.002589"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.528122" elapsed="0.002276"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:16.530463" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:16.525088" elapsed="0.005508"/>
</kw>
<msg time="2026-05-01T00:56:16.530678" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:16.524613" elapsed="0.006091"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.531573" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:56:16.531648" level="INFO">${len_1} = 152</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:16.531293" elapsed="0.000379"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.532080" level="INFO">Length is 152.</msg>
<msg time="2026-05-01T00:56:16.532154" level="INFO">${len_2} = 152</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:16.531829" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.532333" elapsed="0.000321"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.532995" level="INFO">${sum_1} = 991</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:16.532813" elapsed="0.000209"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.533429" level="INFO">${sum_2} = 991</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:16.533216" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.533633" elapsed="0.000308"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:16.530923" elapsed="0.003077"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:16.534153" elapsed="0.001953"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.581084" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.580713" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.581926" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.581653" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.582092" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.581277" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.582680" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.582284" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.583007" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.583157" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.582870" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.583604" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.583341" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.584830" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.584523" elapsed="0.000353"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.585315" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.585042" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.586187" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.585758" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.587318" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.586842" elapsed="0.000560"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.587558" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:16.587788" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.586406" elapsed="0.001408"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.587973" elapsed="0.000409"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:16.585616" elapsed="0.002807"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.589104" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.588692" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.590262" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.589788" elapsed="0.000555"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.590500" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:16.590768" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.589320" elapsed="0.001475"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.590952" elapsed="0.000401"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:16.588555" elapsed="0.002840"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.585392" elapsed="0.006038"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.591493" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:16.591654" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:16.584019" elapsed="0.007660"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.583719" elapsed="0.007993"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.591887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.591737" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.583699" elapsed="0.008264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.592689" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.592107" elapsed="0.000610"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.592766" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.580085" elapsed="0.012805"/>
</kw>
<msg time="2026-05-01T00:56:16.592944" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.567445" elapsed="0.025548"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.605567" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.618092" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.632164" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.632387" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.632592" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.632979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.632829" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.632813" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.633206" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.633421" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.633644" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.632778" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.632671" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.633877" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.633953" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:16.634087" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.563155" elapsed="0.070960"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.635250" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.634978" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:16.653992" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:16.654100" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:16.654324" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:16.637411" elapsed="0.016972"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.635364" elapsed="0.019143"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.654924" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.654570" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.635346" elapsed="0.019762"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.662632" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.657370" elapsed="0.005324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.656872" elapsed="0.005871"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.656832" elapsed="0.005947"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.666379" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.663168" elapsed="0.003275"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.662856" elapsed="0.003654"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.662833" elapsed="0.003712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.667318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.666790" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.667816" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.667475" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.668601" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.668164" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.667931" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.667430" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.669499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.668948" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.669978" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.669642" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.670725" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.670378" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.670142" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.669616" elapsed="0.001193"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.670964" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:16.671784" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.671497" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.671971" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:16.655936" elapsed="0.018533"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:16.674523" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:16.676779" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:16.634385" elapsed="0.042421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.676860" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:16.537611" elapsed="0.139374"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.536945" elapsed="0.140093"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:16.536398" elapsed="0.140699"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.680212" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.678042" elapsed="0.002207"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.680427" elapsed="0.002132"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:16.682611" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:16.677772" elapsed="0.004966"/>
</kw>
<msg time="2026-05-01T00:56:16.682814" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:16.677265" elapsed="0.005574"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.683700" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:56:16.683774" level="INFO">${len_1} = 140</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:16.683416" elapsed="0.000381"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.684206" level="INFO">Length is 140.</msg>
<msg time="2026-05-01T00:56:16.684279" level="INFO">${len_2} = 140</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:16.683955" elapsed="0.000347"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.684477" elapsed="0.000309"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.685120" level="INFO">${sum_1} = 840</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:16.684943" elapsed="0.000203"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:16.685505" level="INFO">${sum_2} = 840</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:16.685299" elapsed="0.000233"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:16.685687" elapsed="0.000303"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:16.683053" elapsed="0.002997"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.730029" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.729653" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.730896" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.730637" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.731059" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.730280" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.731657" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.731251" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.731985" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.732121" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.731849" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.732566" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.732306" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.733607" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.733327" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.734078" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.733813" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.735007" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.734475" elapsed="0.000558"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.736175" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.735728" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.736340" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:16.736582" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.735225" elapsed="0.001383"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.736766" elapsed="0.000496"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:16.734324" elapsed="0.002980"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.738122" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.737605" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.739283" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.738838" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.739444" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:16.739686" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.738341" elapsed="0.001370"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.739867" elapsed="0.000487"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:16.737422" elapsed="0.002974"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.734154" elapsed="0.006279"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.740514" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:16.740675" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:16.732978" elapsed="0.007722"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.732682" elapsed="0.008050"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.740910" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.740758" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.732662" elapsed="0.008323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.741783" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.741172" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.741862" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.728969" elapsed="0.013018"/>
</kw>
<msg time="2026-05-01T00:56:16.742041" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.716068" elapsed="0.026034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.755165" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.767664" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.780132" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.780335" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.780530" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.780913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.780762" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:16.780746" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.781139" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.781309" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.781490" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:16.780714" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.780609" elapsed="0.000974"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.781735" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.781812" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:16.781938" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.711523" elapsed="0.070442"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.783172" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.782909" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:16.791380" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:16.791553" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:16.791694" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:16.791736" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.785336" elapsed="0.006794">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:16.783285" elapsed="0.008925">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.792401" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.792244" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:16.783268" elapsed="0.009236">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.796756" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.793593" elapsed="0.003210">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:16.793319" elapsed="0.003572">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:16.793301" elapsed="0.003636">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.800646" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.797351" elapsed="0.003342">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:16.797036" elapsed="0.003745">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:16.797012" elapsed="0.003815">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.801690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.801090" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.802165" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.801829" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.802841" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.802536" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.802280" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.801803" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.803464" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.803088" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.803798" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.803562" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.804387" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.804091" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.803924" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.803544" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.804649" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:16.805468" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.805165" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:16.807919" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.805668" elapsed="0.002283">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.792883" elapsed="0.015205">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:16.808150" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:16.810530" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:16.810560" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:16.782277" elapsed="0.028312">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.810655" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.687097" elapsed="0.123727">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.686683" elapsed="0.124204"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:16.686276" elapsed="0.124670"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:16.304172" elapsed="0.506824"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.203913" elapsed="0.607196"/>
</test>
<test id="s1-s16-t13" name="Play_To_Odl_source_active_ad" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:16.814569" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:16.814286" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.815830" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.815720" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.815702" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.820828" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.820723" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.820706" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.821923" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.821517" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.822405" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:16.822112" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:16.822588" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:16.822751" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.821125" elapsed="0.001651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.828278" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.828170" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.828151" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.829577" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:16.829417" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.829400" elapsed="0.000248"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:16.830098" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.829797" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.830523" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:16.830287" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.861685" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:16.831050" elapsed="0.030777"/>
</kw>
<msg time="2026-05-01T00:56:16.862024" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:16.862084" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.830712" elapsed="0.031434"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:16.888525" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "o "u "r "c "e "_ "a "c "t "i "v "e "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:16.862921" elapsed="0.025715"/>
</kw>
<msg time="2026-05-01T00:56:16.888795" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:16.888842" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.862370" elapsed="0.026509"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.889197" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.888963" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.888941" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.889804" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "o "u "r "c "e "_ "a "c "t "i "v "e "_ "a "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.889426" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.890197" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.889949" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.889930" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:16.890317" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:16.892970" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:56:16.893178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.891862" elapsed="0.001459"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.893656" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.894000" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:16.891200" elapsed="0.002987"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:16.890647" elapsed="0.003605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:16.829116" elapsed="0.065234"/>
</kw>
<msg time="2026-05-01T00:56:16.894442" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:16.894514" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.828518" elapsed="0.066035"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:16.894796" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:16.894685" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.894665" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.895291" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.895673" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:16.895748" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:16.827831" elapsed="0.068028"/>
</kw>
<msg time="2026-05-01T00:56:16.895953" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:16.896006" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.823150" elapsed="0.072898"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.896382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.896126" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.896108" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:16.823003" elapsed="0.073513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:16.822831" elapsed="0.073717"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:16.820354" elapsed="0.076250"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:16.815418" elapsed="0.081243"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:16.814991" elapsed="0.081715"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:16.812007" elapsed="0.084753"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.897959" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.897423" elapsed="0.000565"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.898639" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.898162" elapsed="0.000506"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.899223" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.898840" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.899640" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/announce_source_active_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/announce_source_active_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.899836" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.899417" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.900214" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/withdraw_source_active_ad.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/withdraw_source_active_ad.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.900336" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.900025" elapsed="0.000337"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:16.900615" elapsed="0.005413"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:16.906210" elapsed="0.001926"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.961971" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:16.961535" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.962771" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.962523" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:16.962944" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:16.962170" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.963550" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:16.963135" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:16.963955" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:16.964110" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:16.963790" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.964676" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.964343" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.965873" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:16.965531" elapsed="0.000388"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.966361" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.966082" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.967189" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.966784" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.968521" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.967883" elapsed="0.000748"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.968713" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:16.969020" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.967409" elapsed="0.001637"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.969207" elapsed="0.000460"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:16.966643" elapsed="0.003069"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.970570" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:16.969971" elapsed="0.000626"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:16.971833" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.971263" elapsed="0.000671"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:16.972012" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:16.972321" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:16.970790" elapsed="0.001558"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:16.972532" elapsed="0.000377"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:16.969830" elapsed="0.003123"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.966441" elapsed="0.006548"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:16.973033" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:16.973195" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:16.965179" elapsed="0.008042"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.964821" elapsed="0.008432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.973485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:16.973313" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:16.964795" elapsed="0.008769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:16.974308" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:16.973728" elapsed="0.000609"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:16.974386" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:16.960847" elapsed="0.013682"/>
</kw>
<msg time="2026-05-01T00:56:16.974591" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:16.947965" elapsed="0.026674"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.987189" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:16.999574" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.012952" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.013153" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.013332" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.013745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:17.013570" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:17.013556" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.013970" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.014144" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.014312" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:17.013526" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.013408" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.014555" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.014632" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:17.014756" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:16.943728" elapsed="0.071087"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:17.016114" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:17.015844" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:17.016277" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:17.015496" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.016638" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:17.016371" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:17.017190" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:17.016900" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:17.016720" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:17.016353" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:17.019812" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:17.017423" elapsed="0.002416"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:17.019891" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:17.020045" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:17.015151" elapsed="0.004919"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:17.021288" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:17.021052" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:17.021444" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:17.020717" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:17.021715" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:17.021556" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:17.021538" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.021949" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.022121" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.022185" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:17.024098" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:17.020378" elapsed="0.003746"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:17.025563" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:17.025300" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:17.026032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:17.025791" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:17.033759" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:17.033956" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:17.034057" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:17.028193" elapsed="0.006232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:17.026140" elapsed="0.008390">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.034723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:17.034565" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:17.026122" elapsed="0.008690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.035197" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.035329" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:17.035292" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:17.035275" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.035560" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.035632" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:17.024439" elapsed="0.011300">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.035815" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.920327" elapsed="0.115585">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:17.036192" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:17.036007" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:17.035990" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:17.036325" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:16.914072" elapsed="0.122353">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.094261" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.093856" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.095231" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.094965" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.095404" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.094592" elapsed="0.000838"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.096005" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.095618" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.096340" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.096517" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.096197" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.096957" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.096706" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.098068" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.097757" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.098585" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.098279" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.099513" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.099049" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.100771" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.100194" elapsed="0.000678"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.100954" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:19.101261" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.099735" elapsed="0.001553"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.101461" elapsed="0.000391"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:19.098907" elapsed="0.002988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.102778" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.102150" elapsed="0.000654"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.104020" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.103471" elapsed="0.000650"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.104198" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:19.104512" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.102999" elapsed="0.001591"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.104751" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.102013" elapsed="0.003147"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.098663" elapsed="0.006534"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.105240" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:19.105399" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:19.097408" elapsed="0.008016"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.097081" elapsed="0.008390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.105656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.105499" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.097058" elapsed="0.008716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.106528" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.105927" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.106606" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.093203" elapsed="0.013566"/>
</kw>
<msg time="2026-05-01T00:56:19.106826" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.080297" elapsed="0.026579"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.119426" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.131801" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.144168" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.144377" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.144576" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.144973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.144822" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.144804" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.145200" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.145370" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.145559" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.144770" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.144659" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.145791" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.145868" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:19.146006" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.075791" elapsed="0.070243"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.147505" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.147207" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.147679" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.146827" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.148034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.147775" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.148616" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.148306" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.148116" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.147756" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.152905" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.148855" elapsed="0.004078"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:19.152987" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:19.153145" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.146425" elapsed="0.006744"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.154404" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.154169" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.154587" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.153827" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:19.154856" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:19.154683" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.154665" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.155094" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.155268" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.155335" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:19.157400" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.153496" elapsed="0.003932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.158900" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.158605" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.159346" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.159104" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:19.168168" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:19.168557" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:19.168713" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:19.161541" elapsed="0.007199"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.159472" elapsed="0.009313"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.168972" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.168812" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.159439" elapsed="0.009621"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.172638" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.170088" elapsed="0.002631"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.169863" elapsed="0.002895"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.169845" elapsed="0.002940"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.175555" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.173076" elapsed="0.002552"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.172844" elapsed="0.002834"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.172826" elapsed="0.002888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.176664" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.175959" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.177158" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.176814" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.177957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.177532" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.177276" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.176787" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.179005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.178305" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.179514" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.179153" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.180292" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.179871" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.179638" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.179127" elapsed="0.001282"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.180659" elapsed="0.000494"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:19.181911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.181484" elapsed="0.000464"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.182169" elapsed="0.002912"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:19.169420" elapsed="0.015728"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.185329" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:19.185220" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.185201" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.188483" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.185567" elapsed="0.002947"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:19.188626" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:19.188837" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:19.157769" elapsed="0.031102"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.188936" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:19.189092" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:19.052244" elapsed="0.136874"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.218277" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.217809" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.219150" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.218869" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.219466" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.218498" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.220103" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.219663" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.220470" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.220631" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.220296" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.221084" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-active-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "multicast-source": "1.0.0.1",
          "multicast-group": "2.0.0.2"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.220819" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:19.221624" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.221201" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.222362" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.221861" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.221710" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.221182" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.223113" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.222616" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.223192" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.217174" elapsed="0.006147"/>
</kw>
<msg time="2026-05-01T00:56:19.223410" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.203959" elapsed="0.019523"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.235989" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.248393" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.260878" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.261077" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.261254" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.261656" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.261503" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.261488" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.261876" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.262043" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.262210" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.261442" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.261333" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.262440" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.262532" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:19.262668" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.201281" elapsed="0.061413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.262908" elapsed="0.002361"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.266510" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.266069" elapsed="0.000470"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.267294" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.266697" elapsed="0.000630"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.267513" elapsed="0.000329"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.265654" elapsed="0.002249"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.265384" elapsed="0.002552"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.268115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.267963" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.265365" elapsed="0.002827"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:19.190277" elapsed="0.077964"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:19.189466" elapsed="0.078851"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.189202" elapsed="0.079160"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.189184" elapsed="0.079201"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.268419" elapsed="0.000050"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:19.045551" elapsed="0.223020"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:16.908345" elapsed="2.360284"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.322359" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.321353" elapsed="0.001080"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.324312" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.323749" elapsed="0.000753">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.324720" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.322929" elapsed="0.001846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.326049" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.325152" elapsed="0.000958"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.326857" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.327184" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.326510" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.328189" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.327640" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.331501" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.330200" elapsed="0.001396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.332045" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.331767" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.332882" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.332475" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.334143" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.333583" elapsed="0.000661"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.334324" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:19.334651" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.333106" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.334853" elapsed="0.000390"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:19.332316" elapsed="0.002969"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.335955" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.335555" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.337191" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.336648" elapsed="0.000643"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.337368" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:19.337686" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.336169" elapsed="0.001545"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.337870" elapsed="0.000365"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.335402" elapsed="0.002876"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.332128" elapsed="0.006186"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.338360" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:19.338542" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:19.329431" elapsed="0.009138"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.328660" elapsed="0.009941"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.338781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.338628" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.328603" elapsed="0.010290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.339661" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.339045" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.339738" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.319545" elapsed="0.020320"/>
</kw>
<msg time="2026-05-01T00:56:19.339920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.305522" elapsed="0.034447"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.352683" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.365440" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.378898" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.379121" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.379313" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.379735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.379579" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.379562" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.379965" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.380138" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.380311" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.379528" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.379394" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.380563" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.380653" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:19.380795" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.301062" elapsed="0.079762"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.382162" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.381894" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.382338" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.381523" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.382713" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.382435" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.383325" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.383023" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.382799" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.382416" elapsed="0.000994"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.386058" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.383585" elapsed="0.002501"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:19.386182" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:19.386350" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.381166" elapsed="0.005210"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.387687" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.387434" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.387845" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.387090" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:19.388080" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:19.387942" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.387923" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.388322" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.388529" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.388603" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:56:19.390549" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.386721" elapsed="0.003856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.392040" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.391785" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.392504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.392246" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:19.400533" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:19.400699" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:19.400806" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:19.394734" elapsed="0.006100"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.392625" elapsed="0.008259"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.401089" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.400919" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.392601" elapsed="0.008576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.405505" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.402251" elapsed="0.003329"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.402019" elapsed="0.003615"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.402000" elapsed="0.003671"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.409355" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.406074" elapsed="0.003347"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.405751" elapsed="0.003742"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.405727" elapsed="0.003805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.410408" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.409847" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.411017" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.410615" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.411756" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.411372" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.411137" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.410586" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.412381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.412008" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.412773" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.412499" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.413340" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.413041" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.412870" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.412479" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.413624" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:19.414523" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.414167" elapsed="0.000384"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.414732" elapsed="0.002449"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:19.401581" elapsed="0.015672"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.417439" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:19.417326" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.417308" elapsed="0.000232"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.420699" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.417702" elapsed="0.003033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:19.420810" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:19.420989" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:19.390941" elapsed="0.030076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.421083" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:19.421247" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:19.277611" elapsed="0.143664"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.450343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.449828" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.451307" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.450984" elapsed="0.000541">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.451719" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.450594" elapsed="0.001153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.452390" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.451923" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.452798" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.452964" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.452624" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.453431" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-active-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "multicast-source": "1.0.0.1",
          "multicast-group": "2.0.0.2"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.453156" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:19.454030" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.453585" elapsed="0.000509"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.454814" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.454275" elapsed="0.000568"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.454122" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.453560" elapsed="0.001368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.455612" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.455085" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.455694" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.449129" elapsed="0.006709"/>
</kw>
<msg time="2026-05-01T00:56:19.455896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.436098" elapsed="0.019849"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.468918" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.481894" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.494533" elapsed="0.000093"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.494835" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.495105" elapsed="0.000026"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.495563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.495381" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.495365" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.495797" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.495969" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.496138" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.495329" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.495203" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.496372" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.496464" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:19.496627" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.433180" elapsed="0.063477"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.496841" elapsed="0.002441"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.500552" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.500059" elapsed="0.000525"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.501151" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.500745" elapsed="0.000434"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.501338" elapsed="0.000366"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.499631" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.499364" elapsed="0.002433"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.501973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.501823" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.499346" elapsed="0.002704"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:19.422473" elapsed="0.079628"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:19.421636" elapsed="0.080544"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.421364" elapsed="0.080903"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.421347" elapsed="0.080946"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.502330" elapsed="0.000032"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:19.273068" elapsed="0.229420"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:19.268805" elapsed="0.233747"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.552221" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.551822" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.553106" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.552812" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.553285" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.552433" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.553890" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.553500" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.554229" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.554397" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.554084" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.554852" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.554605" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.556211" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.555690" elapsed="0.000567"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.556722" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.556423" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.557553" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.557126" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.558814" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.558240" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.559013" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:19.559320" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.557780" elapsed="0.001565"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.559521" elapsed="0.000385"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.556986" elapsed="0.002961"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.560619" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.560201" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.561844" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.561281" elapsed="0.000666"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.562026" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:19.562374" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.560833" elapsed="0.001568"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.562581" elapsed="0.000393"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.560065" elapsed="0.002952"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.556802" elapsed="0.006252"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.563099" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:19.563258" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:19.555334" elapsed="0.007950"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.555015" elapsed="0.008300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.563511" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.563341" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.554991" elapsed="0.008599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.564331" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.563738" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.564408" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.551165" elapsed="0.013384"/>
</kw>
<msg time="2026-05-01T00:56:19.564610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.538317" elapsed="0.026341"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.577302" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.589901" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.602324" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.602556" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.602745" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.603185" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.603032" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.603010" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.603414" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.603663" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.603834" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.602941" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.602825" elapsed="0.001090"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.604065" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.604142" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:19.604291" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.533996" elapsed="0.070324"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.605729" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.605428" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.605899" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.605035" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.606254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.605994" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.606830" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.606536" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.606334" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.605975" elapsed="0.000938"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.609550" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.607107" elapsed="0.002470"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:19.609630" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:19.609788" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.604682" elapsed="0.005131"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.611059" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.610804" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.611215" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.610464" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:19.611461" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:56:19.611311" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.611292" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.611700" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.611873" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.611938" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:19.613838" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.610125" elapsed="0.003740"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.615330" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.615078" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.615792" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.615547" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:19.624622" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:19.624771" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '356'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:19.624872" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:19.617981" elapsed="0.006917"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.615904" elapsed="0.009037"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.625128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.624969" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.615885" elapsed="0.009328"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.629553" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.626309" elapsed="0.003314"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.626082" elapsed="0.003590"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.626064" elapsed="0.003645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.633513" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.630101" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.629787" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.629763" elapsed="0.003910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.634545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.633941" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.635089" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.634691" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.635807" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.635478" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.635211" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.634664" elapsed="0.001226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.636421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.636052" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.636784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.636535" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.637321" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.637027" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.636865" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.636517" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.637578" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:19.638388" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.638090" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.638645" elapsed="0.002321"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:19.625645" elapsed="0.015387"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.641212" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:19.641103" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.641085" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.644247" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.641436" elapsed="0.002841"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:19.644329" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:19.644516" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:19.614183" elapsed="0.030360"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.644608" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:19.644759" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:19.511460" elapsed="0.133326"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.674472" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.673966" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.675374" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.675057" elapsed="0.000466">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.675703" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.674683" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.676347" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.675901" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.676720" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_active_ad/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.676881" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.676557" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.677334" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-active-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "multicast-source": "1.0.0.1",
          "multicast-group": "2.0.0.2"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.677068" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:19.677881" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.677468" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.678689" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.678165" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.678010" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.677433" elapsed="0.001343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.679442" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.678928" elapsed="0.000565"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.679545" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.673327" elapsed="0.006348"/>
</kw>
<msg time="2026-05-01T00:56:19.679732" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.659201" elapsed="0.020579"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.692272" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.704894" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.717262" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.717481" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.717669" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.718061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.717907" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.717893" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.718285" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.718469" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.718641" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.717862" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.717753" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.718871" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.718948" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:19.719148" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
        "attributes": {
          "ipv4-next-hop": {
    ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.656539" elapsed="0.062636"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.719356" elapsed="0.002367"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.722914" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.722477" elapsed="0.000466"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.723563" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.723140" elapsed="0.000451"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.723748" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:19.722048" elapsed="0.002087"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.721805" elapsed="0.002364"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.724345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.724194" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.721786" elapsed="0.002635"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:19.645951" elapsed="0.078533"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:19.645120" elapsed="0.079442"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.644869" elapsed="0.079738"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.644853" elapsed="0.079777"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.724663" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:19.507077" elapsed="0.217711"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:19.502733" elapsed="0.222113"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:19.725009" elapsed="0.002648"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.779302" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.778888" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.780098" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.779858" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.780262" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.779520" elapsed="0.000766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.780906" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.780518" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.781238" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.781380" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.781101" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.781831" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.781584" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.783098" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.782773" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.783619" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.783315" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.784430" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.784027" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.785717" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.785142" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.785897" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:19.786202" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.784676" elapsed="0.001552"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.786388" elapsed="0.000401"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.783885" elapsed="0.002948"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.787574" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.787132" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:19.788831" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.788253" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:19.789011" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:19.789314" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:19.787793" elapsed="0.001549"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.789520" elapsed="0.000376"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:19.786952" elapsed="0.002989"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.783700" elapsed="0.006279"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:19.790023" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:19.790188" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:19.782243" elapsed="0.007971"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.781946" elapsed="0.008301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.790427" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.790273" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.781926" elapsed="0.008596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.791341" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.790679" elapsed="0.000692"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.791421" elapsed="0.000052"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.778240" elapsed="0.013336"/>
</kw>
<msg time="2026-05-01T00:56:19.791666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.765594" elapsed="0.026123"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.804299" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.816861" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.829316" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.829546" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.829732" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.830109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.829962" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.829946" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.830335" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.830523" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.830694" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.829915" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.829808" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.830922" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.830998" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:19.831161" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.761279" elapsed="0.069909"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.832507" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.832239" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.832673" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.831880" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.833071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.832815" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.833911" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.833341" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.833154" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.832796" elapsed="0.001202"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.836373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.834154" elapsed="0.002246"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:19.836466" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:19.836627" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.831544" elapsed="0.005108"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.837870" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.837647" elapsed="0.000276"/>
</kw>
<msg time="2026-05-01T00:56:19.838008" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.837289" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.838239" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:19.838103" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.838085" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.838636" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.838765" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.838468" elapsed="0.000323"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:19.839211" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.838948" elapsed="0.000288"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:19.839283" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:19.839438" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:19.836964" elapsed="0.002514"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.840869" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.840623" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.841309" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.841070" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:19.848734" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:19.849188" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '501'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:19.849304" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:19.843523" elapsed="0.005807"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.841419" elapsed="0.007955"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.849575" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.849401" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.841401" elapsed="0.008302"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.853379" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BRIAAQECAwQBAiABAAABIAIAAAI=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-active-a-d":{"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","multicast-group":"2.0.0.2"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.850888" elapsed="0.002541"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.850516" elapsed="0.002964"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.850497" elapsed="0.003010"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.856161" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.853797" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.853564" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.853547" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.856845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.856441" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.857187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.856943" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.857752" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.857436" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.857269" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.856925" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.858371" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.858007" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.858724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.858483" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.859286" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.858972" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.858807" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.858465" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.859543" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:19.860348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.860059" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:19.860549" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:19.850077" elapsed="0.013082"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.863341" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:19.863231" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.863212" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.866512" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.863579" elapsed="0.002963"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:19.866596" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:19.866756" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:19.839793" elapsed="0.026990"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.866905" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:19.867066" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:19.738560" elapsed="0.128551"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.895917" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.895433" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.896757" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.896472" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:19.897060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:19.896114" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.897715" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:19.897255" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:19.898066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:19.898206" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:19.897907" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.898681" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:19.898392" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:19.899216" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.898797" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.899977" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:19.899470" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:19.899305" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:19.898778" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.900716" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:19.900209" elapsed="0.000536"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:19.900794" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:19.894776" elapsed="0.006146"/>
</kw>
<msg time="2026-05-01T00:56:19.900977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.881818" elapsed="0.019207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.914045" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.926477" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.938871" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.939068" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.939265" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.939668" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.939517" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:19.939503" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.939890" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.940059" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.940227" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:19.939470" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.939346" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.940469" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.940547" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:19.940667" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:19.879119" elapsed="0.061575"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:19.940875" elapsed="0.002234"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.944199" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.943897" elapsed="0.000330"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:19.944985" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:19.944384" elapsed="0.000630"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:19.945517" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "path-id": 0,
      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
      "source-active-a-d": {
       "multicast-group": "2.0.0.2",
       "multicast-source": "1.0.0.1",
       "route-distinguisher": "1.2.3.4:258"
      }
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:19.945748" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.945174" elapsed="0.000647">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.943478" elapsed="0.002494">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:19.943218" elapsed="0.002833">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:19.946240" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:19.946087" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:19.943199" elapsed="0.003120">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.868274" elapsed="0.078169">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.867462" elapsed="0.079157">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:19.867199" elapsed="0.079510">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:19.867180" elapsed="0.079589">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:19.946823" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:19.732423" elapsed="0.214525">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,33 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BRIAAQECAwQBAiABAAABIAIAAAI=",
+      "source-active-a-d": {
+       "multicast-group": "2.0.0.2",
+       "multicast-source": "1.0.0.1",
+       "route-distinguisher": "1.2.3.4:258"
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.005141" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.004660" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.006072" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.005791" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.006253" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.005385" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.006914" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.006506" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.007260" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.007442" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.007113" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.007904" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.007649" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.009162" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.008810" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.009683" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.009374" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.010579" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.010087" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.011862" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.011282" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.012047" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:22.012394" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.010809" elapsed="0.001613"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.012604" elapsed="0.000397"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.009946" elapsed="0.003098"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.013828" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.013385" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.015304" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.014747" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.015505" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:22.015968" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.014250" elapsed="0.001745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.016154" elapsed="0.000458"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.013243" elapsed="0.003413"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.009766" elapsed="0.006926"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.016739" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:22.016902" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:22.008444" elapsed="0.008484"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.008035" elapsed="0.008925"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.017149" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.016988" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.008009" elapsed="0.009217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.018028" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.017379" elapsed="0.000679"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.018107" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.003892" elapsed="0.014472"/>
</kw>
<msg time="2026-05-01T00:56:22.018429" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:21.990865" elapsed="0.027664"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.031324" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.043815" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.056470" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.056741" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.056938" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.057475" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.057304" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.057287" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.057706" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.057878" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.058048" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.057247" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.057111" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.058281" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.058364" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:22.058552" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:21.986228" elapsed="0.072354"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.060084" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.059775" elapsed="0.000389">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.060302" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.059329" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.060691" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.060401" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.061265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.060969" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.060776" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.060382" elapsed="0.000967"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.063970" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.061521" elapsed="0.002476"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:22.064050" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:22.064246" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:22.058953" elapsed="0.005319"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.065495" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.065281" elapsed="0.000269"/>
</kw>
<msg time="2026-05-01T00:56:22.065633" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.064942" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.065866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.065729" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.065711" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.066246" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.066477" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.066080" elapsed="0.000424"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:22.066910" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.066667" elapsed="0.000270"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:22.066984" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:22.067138" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:22.064610" elapsed="0.002553"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.068636" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.068364" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.069078" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.068839" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:22.077149" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.077344" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:22.077525" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:22.071343" elapsed="0.006222"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.069188" elapsed="0.008443"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.077918" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.077673" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.069170" elapsed="0.008874"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.083179" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.079660" elapsed="0.003587"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.079299" elapsed="0.003997"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.079271" elapsed="0.004060"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.086511" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.083750" elapsed="0.002807"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.083410" elapsed="0.003182"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.083387" elapsed="0.003229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.087204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.086805" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.087563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.087303" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.088113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.087814" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.087646" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.087285" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.088758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.088378" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.089091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.088854" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.089645" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.089336" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.089171" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.088836" elapsed="0.000961"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.089963" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:22.090803" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.090500" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.090989" elapsed="0.002344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:22.078655" elapsed="0.014746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.093598" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.093487" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.093466" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:22.096534" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.093820" elapsed="0.002742"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:22.096615" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:22.096783" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:22.067497" elapsed="0.029312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.096873" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:22.097029" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:21.963688" elapsed="0.133367"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.126562" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.126008" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.127469" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.127133" elapsed="0.000472">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.127793" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.126778" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.128490" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.127990" elapsed="0.000530"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.128856" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.129024" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.128689" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.129495" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.129212" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:22.130160" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.129630" elapsed="0.000593"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.130934" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.130403" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.130252" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.129603" elapsed="0.001417"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.131694" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.131173" elapsed="0.000550"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.131777" elapsed="0.000188"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.125294" elapsed="0.006775"/>
</kw>
<msg time="2026-05-01T00:56:22.132125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.112029" elapsed="0.020147"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.146087" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.158559" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.170884" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.171151" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.171345" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.171812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.171654" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.171636" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.172048" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.172218" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.172423" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.171590" elapsed="0.000902"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.171431" elapsed="0.001091"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.172675" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.172841" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:22.173008" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.108908" elapsed="0.064130"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.173222" elapsed="0.002547"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:22.176949" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.176613" elapsed="0.000364"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:22.177405" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.177133" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.177605" elapsed="0.000344"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.176133" elapsed="0.001876"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.175850" elapsed="0.002192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.178217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.178067" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.175831" elapsed="0.002463"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:22.098265" elapsed="0.080080"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:22.097408" elapsed="0.081015"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.097141" elapsed="0.081345"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.097124" elapsed="0.081388"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.178549" elapsed="0.000033"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:21.956550" elapsed="0.222137"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:19.727838" elapsed="2.450911"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:22.178972" elapsed="0.004149"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:16.897031" elapsed="5.286150"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:16.811535" elapsed="5.371770"/>
</test>
<test id="s1-s16-t14" name="Odl_To_Play_shared_tree_join" line="110">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:22.186648" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:22.186362" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.187927" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.187812" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.187794" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.192964" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.192857" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.192840" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.194102" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.193715" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.194606" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:22.194292" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:22.194678" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:22.194836" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.193320" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.201781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.201670" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.201651" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.203088" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.202970" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.202946" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:22.203668" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.203325" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.204092" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:22.203867" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.233112" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:22.204667" elapsed="0.028659"/>
</kw>
<msg time="2026-05-01T00:56:22.233603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:22.233652" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.204281" elapsed="0.029408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.259993" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "h "a "r "e "d "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:22.234409" elapsed="0.025757"/>
</kw>
<msg time="2026-05-01T00:56:22.260389" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:22.260436" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.233952" elapsed="0.026545"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.260929" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.260617" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.260580" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.261550" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "h "a "r "e "d "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.261173" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.261913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.261692" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.261674" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:22.262032" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:22.264753" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:56:22.264963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.263672" elapsed="0.001429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.265381" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.265817" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:22.262976" elapsed="0.003029"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:22.262373" elapsed="0.003696"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:22.202636" elapsed="0.063534"/>
</kw>
<msg time="2026-05-01T00:56:22.266264" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:22.266309" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.202007" elapsed="0.064341"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:22.266555" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:22.266426" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.266407" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.267063" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.267411" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.267512" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:22.201307" elapsed="0.066317"/>
</kw>
<msg time="2026-05-01T00:56:22.267719" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:22.267763" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.195238" elapsed="0.072562"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.268134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.267878" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.267860" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:22.195092" elapsed="0.073144"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:22.194917" elapsed="0.073355"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:22.192499" elapsed="0.075858"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:22.187521" elapsed="0.080894"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.187066" elapsed="0.081410"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:22.184163" elapsed="0.084370"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.269483" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/announce_shared_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/announce_shared_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.269665" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.269260" elapsed="0.000432"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:22.270069" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.269853" elapsed="0.000243"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.270444" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/withdraw_shared_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/withdraw_shared_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.270587" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.270256" elapsed="0.000356"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:22.271007" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.270771" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:22.271320" elapsed="0.002943"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.271104" elapsed="0.003202"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.271086" elapsed="0.003247"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.318158" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.317652" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.319074" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.318777" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.319253" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.318393" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.319854" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.319464" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.320192" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.320400" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.320048" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.320860" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.320609" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.322002" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.321746" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.322496" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.322211" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.323223" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.322921" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.324260" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.323787" elapsed="0.000501"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.324358" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:22.324561" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.323441" elapsed="0.001146"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.324753" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:22.322762" elapsed="0.002279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.325834" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.325531" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.326811" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.326369" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.326889" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:22.327041" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.326049" elapsed="0.001016"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.327220" elapsed="0.000316"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.325160" elapsed="0.002418"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.322579" elapsed="0.005036"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.327658" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:22.327816" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:22.321398" elapsed="0.006443"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.321000" elapsed="0.006873"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.328054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.327900" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.320969" elapsed="0.007162"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.328916" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.328279" elapsed="0.000666"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.328994" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.316712" elapsed="0.012405"/>
</kw>
<msg time="2026-05-01T00:56:22.329173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.294546" elapsed="0.034676"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.342119" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.354673" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.367178" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.367390" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.367590" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.367985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.367834" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.367818" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.368215" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.368418" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.368607" elapsed="0.000073"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.367784" elapsed="0.000936"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.367670" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.368902" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.368981" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:22.369122" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.290224" elapsed="0.078926"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.394150" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.393769" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.394940" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.394698" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.395112" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.394343" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.395703" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.395303" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.396033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.396193" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.395894" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.396675" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;shared-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;16&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/shared-tree-join&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.396413" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:22.397106" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.396807" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.397648" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.397337" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.397188" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.396787" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.398341" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.397886" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.398471" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.393135" elapsed="0.005473"/>
</kw>
<msg time="2026-05-01T00:56:22.398667" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.380173" elapsed="0.018542"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.411189" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.423586" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.436084" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.436284" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.436487" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.436870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.436721" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.436707" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.437096" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.437266" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.437433" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.436675" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.436565" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.437680" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.437760" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:22.437962" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.379270" elapsed="0.058724"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.439367" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.439081" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.439550" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.438732" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.439898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.439647" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.440559" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.440165" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.439978" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.439628" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.443175" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.440807" elapsed="0.002395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:22.443255" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:22.443412" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:22.438377" elapsed="0.005060"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.445059" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.444806" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.445514" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;shared-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;16&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/shared-tree-join&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.445260" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.445970" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.445725" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.446404" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.446165" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:22.447279" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:22.447081" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:22.447661" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:22.447484" elapsed="0.000203"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.447843" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.448502" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.448213" elapsed="0.000334"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:22.448589" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:22.448751" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:22.446672" elapsed="0.002103"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:22.463550" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '796', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BhYAAQECAwQBAgAAABAgAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;shared-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;16&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/shared-tree-join&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:22.463688" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=BhYAAQECAwQBAgAAABAgAQAAASACAAAC,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.463847" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:22.450950" elapsed="0.012933"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.448846" elapsed="0.015101"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.464198" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.463984" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.448829" elapsed="0.015492"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.471950" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.466549" elapsed="0.005498"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.466017" elapsed="0.006109"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.465978" elapsed="0.006208"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.477469" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.472873" elapsed="0.004645"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.472311" elapsed="0.005243"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.472274" elapsed="0.005306"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.478143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.477752" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.478496" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.478242" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.479044" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.478750" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.478579" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.478223" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.479752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.479343" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.480092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.479852" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.480688" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.480337" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.480174" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.479833" elapsed="0.000938"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.480924" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:22.481745" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.481435" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.481928" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:22.465016" elapsed="0.019346"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:22.484575" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:56:22.484466" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.484416" elapsed="0.000250"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.484823" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.484892" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:22.487173" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:22.443797" elapsed="0.043403"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.487318" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:22.487498" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:22.279165" elapsed="0.208359"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.487891" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.487633" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.487615" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.488019" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:22.274632" elapsed="0.213514"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.491733" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.489149" elapsed="0.002614"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.491941" elapsed="0.002124"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:22.494116" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:22.488869" elapsed="0.005374"/>
</kw>
<msg time="2026-05-01T00:56:22.494320" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:22.488322" elapsed="0.006023"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.495350" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:22.495426" level="INFO">${len_1} = 160</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:22.495081" elapsed="0.000382"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.495874" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:22.495948" level="INFO">${len_2} = 160</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:22.495620" elapsed="0.000351"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.496129" elapsed="0.000352"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.496895" level="INFO">${sum_1} = 1024</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:22.496644" elapsed="0.000286"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.497394" level="INFO">${sum_2} = 1024</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:22.497143" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.497670" elapsed="0.000423"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:22.494580" elapsed="0.003596"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:22.498387" elapsed="0.002119"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.546666" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.546262" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.547483" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.547210" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.547727" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.546870" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.548310" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.547922" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.548681" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.548834" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.548539" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.549266" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.549021" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.550349" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.550042" elapsed="0.000352"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.550851" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.550578" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.551706" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.551257" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.552885" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.552346" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.553105" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:22.553344" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.551926" elapsed="0.001443"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.553545" elapsed="0.000423"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:22.551117" elapsed="0.002892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.554691" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.554261" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.555974" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.555321" elapsed="0.000738"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.556199" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:22.556422" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.554905" elapsed="0.001577"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.556642" elapsed="0.000405"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.554126" elapsed="0.002962"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.550933" elapsed="0.006190"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.557168" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:22.557326" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:22.549717" elapsed="0.007635"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.549390" elapsed="0.007995"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.557581" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.557411" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.549365" elapsed="0.008294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.558396" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.557812" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.558489" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.545639" elapsed="0.012976"/>
</kw>
<msg time="2026-05-01T00:56:22.558707" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.532716" elapsed="0.026041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.571250" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.583683" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.596009" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.596205" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.596381" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.596779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.596632" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.596617" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.597001" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.597169" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.597336" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.596588" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.596468" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.597576" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.597652" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:22.597771" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.528324" elapsed="0.069473"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.598902" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.598650" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:22.607719" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.607767" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.607859" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:22.601107" elapsed="0.006779"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.599052" elapsed="0.008874"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.608107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.607952" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.599034" elapsed="0.009156"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.611737" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.609212" elapsed="0.002569"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.608992" elapsed="0.002824"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.608975" elapsed="0.002866"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.615143" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.612117" elapsed="0.003090"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.611896" elapsed="0.003359"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.611880" elapsed="0.003410"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.616076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.615552" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.616585" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.616211" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.617356" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.616935" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.616700" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.616187" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.618232" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.617727" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.618719" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.618366" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.619493" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.619064" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.618834" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.618341" elapsed="0.001269"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.619821" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:22.620905" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.620584" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.621087" elapsed="0.002283"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:22.608587" elapsed="0.014846"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:22.623495" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:22.625754" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:22.598066" elapsed="0.027714"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.625868" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:22.501930" elapsed="0.124066"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.501308" elapsed="0.124743"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:22.500764" elapsed="0.125346"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.629690" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.627032" elapsed="0.002691"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.629902" elapsed="0.002088"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:22.632043" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:22.626762" elapsed="0.005409"/>
</kw>
<msg time="2026-05-01T00:56:22.632247" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:22.626278" elapsed="0.005995"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.633152" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:22.633227" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:22.632888" elapsed="0.000363"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.633678" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:22.633757" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:22.633409" elapsed="0.000372"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.633940" elapsed="0.000303"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.634601" level="INFO">${sum_1} = 873</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:22.634402" elapsed="0.000225"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:22.634958" level="INFO">${sum_2} = 873</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:22.634781" elapsed="0.000202"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:22.635138" elapsed="0.000303"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:22.632519" elapsed="0.003002"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.679183" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.678814" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.679976" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.679727" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.680138" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.679375" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.680760" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.680329" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.681084" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.681291" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.680952" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.681781" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.681495" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.682810" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.682556" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.683281" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.683017" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.684199" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.683681" elapsed="0.000544"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.685361" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.684921" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.685543" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:22.685765" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.684414" elapsed="0.001377"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.685945" elapsed="0.000484"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:22.683542" elapsed="0.002946"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.687242" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.686741" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.688567" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.687943" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.688729" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:22.688949" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.687472" elapsed="0.001503"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.689130" elapsed="0.000514"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.686605" elapsed="0.003080"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.683356" elapsed="0.006369"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.689769" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:22.689927" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:22.682190" elapsed="0.007762"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.681894" elapsed="0.008089"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.690160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.690009" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.681875" elapsed="0.008361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.690957" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.690381" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.691034" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.678156" elapsed="0.013002"/>
</kw>
<msg time="2026-05-01T00:56:22.691211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.665436" elapsed="0.025834"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.703840" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.716255" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.728647" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.728841" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.729021" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.729381" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.729236" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.729222" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.729619" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.729788" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.730095" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.729194" elapsed="0.000953"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.729094" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.730319" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.730393" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:22.730527" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.661087" elapsed="0.069467"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.731696" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.731434" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:22.739020" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.739178" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:22.739311" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:22.739353" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.733879" elapsed="0.005934">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:22.731812" elapsed="0.008082">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.740084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.739929" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:22.731794" elapsed="0.008375">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.743761" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.741233" elapsed="0.002564">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:22.741013" elapsed="0.002847">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:22.740995" elapsed="0.002898">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.746816" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.744186" elapsed="0.002676">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:22.743962" elapsed="0.002987">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:22.743945" elapsed="0.003049">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.747791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.747245" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.748262" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.747929" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.749065" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.748649" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.748375" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.747904" elapsed="0.001275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.749926" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.749404" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.750388" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.750060" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.751156" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.750752" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.750522" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.750036" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.751500" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:22.752653" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.752205" elapsed="0.000486"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:22.755501" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.752908" elapsed="0.002627">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.740582" elapsed="0.015088">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:22.755767" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:22.758126" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:22.758155" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:22.730831" elapsed="0.027353">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.758250" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.636587" elapsed="0.121831">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.636140" elapsed="0.122355"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:22.635750" elapsed="0.122804"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:22.268868" elapsed="0.489736"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.183689" elapsed="0.575033"/>
</test>
<test id="s1-s16-t15" name="Play_To_Odl_shared_tree_join" line="114">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:22.763346" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:22.763080" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.764628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.764504" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.764485" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.769602" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.769496" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.769477" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.770658" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.770266" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.771137" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:22.770846" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:22.771206" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:22.771359" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.769894" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.776858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.776751" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.776732" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.778061" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.777957" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.777939" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:22.778589" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.778276" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.778995" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:22.778780" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.807128" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:22.779531" elapsed="0.027702"/>
</kw>
<msg time="2026-05-01T00:56:22.807422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:22.807492" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.779181" elapsed="0.028348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:22.832387" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "h "a "r "e "d "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:22.808059" elapsed="0.024501"/>
</kw>
<msg time="2026-05-01T00:56:22.832744" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:22.832790" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.807707" elapsed="0.025120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.833143" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.832911" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.832891" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.833704" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "h "a "r "e "d "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.833372" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.834058" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.833840" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.833821" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:22.834168" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:22.836692" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:56:22.836896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.835636" elapsed="0.001392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.837303" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.837667" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:22.835001" elapsed="0.002852"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:22.834441" elapsed="0.003476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:22.777659" elapsed="0.060354"/>
</kw>
<msg time="2026-05-01T00:56:22.838105" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:22.838148" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.777078" elapsed="0.061105"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:22.838365" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:22.838259" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.838240" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.838869" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.839204" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.839274" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:22.776383" elapsed="0.062997"/>
</kw>
<msg time="2026-05-01T00:56:22.839487" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:22.839532" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.771774" elapsed="0.067794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.839892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.839643" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.839625" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:22.771621" elapsed="0.068369"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:22.771436" elapsed="0.068614"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:22.769124" elapsed="0.070984"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:22.764202" elapsed="0.075959"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:22.763779" elapsed="0.076426"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:22.759369" elapsed="0.080888"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.841389" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.840929" elapsed="0.000488"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.842061" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.841619" elapsed="0.000469"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.842641" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.842254" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.843025" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/announce_shared_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/announce_shared_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.843169" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.842830" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.843555" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/withdraw_shared_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/withdraw_shared_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.843675" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.843352" elapsed="0.000348"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:22.843852" elapsed="0.002722"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:22.846740" elapsed="0.001545"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.900799" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.900358" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.901591" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.901331" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.901765" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.900998" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.902345" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.901967" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.902686" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:22.902822" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:22.902551" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.903286" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.903044" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.904327" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.904041" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.904842" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.904557" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.905672" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.905236" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.906928" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.906351" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.907108" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:22.907407" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.905897" elapsed="0.001537"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.907617" elapsed="0.000392"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:22.905097" elapsed="0.002955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.908761" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:22.908306" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:22.910152" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.909614" elapsed="0.000639"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:22.910330" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:22.910640" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:22.909137" elapsed="0.001529"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:22.910822" elapsed="0.000363"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:22.908169" elapsed="0.003057"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.904921" elapsed="0.006339"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:22.911305" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:22.911477" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:22.903718" elapsed="0.007785"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.903401" elapsed="0.008135"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.911714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.911562" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.903381" elapsed="0.008408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.912545" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:22.911935" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:22.912624" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:22.899742" elapsed="0.013025"/>
</kw>
<msg time="2026-05-01T00:56:22.912823" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:22.887119" elapsed="0.025752"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.925503" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.938188" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.950631" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.950832" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.951009" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.951381" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.951234" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.951219" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.951623" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.951798" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.951965" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:22.951188" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.951086" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.952196" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.952271" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:22.952393" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:22.882859" elapsed="0.069560"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.953721" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.953445" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.953882" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.953103" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.954223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.953976" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.954796" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:22.954499" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.954304" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.953958" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.957502" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:22.955032" elapsed="0.002499"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:22.957628" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:22.957793" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:22.952777" elapsed="0.005041"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:22.959054" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.958814" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:22.959211" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:22.958472" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:22.959443" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:56:22.959307" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:22.959289" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.959701" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.959876" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.959941" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:22.961871" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:22.958129" elapsed="0.003769"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.963296" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.963047" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:22.963755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:22.963512" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:22.971194" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:22.971334" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:22.971467" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.966068" elapsed="0.005769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:22.963865" elapsed="0.008056">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.972110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.971954" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:22.963847" elapsed="0.008350">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.972604" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.972817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:22.972779" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.972760" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.973030" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.973100" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.962214" elapsed="0.010994">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.973283" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.857342" elapsed="0.116035">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:22.973669" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:22.973487" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:22.973469" elapsed="0.000295"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:22.973797" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:22.852995" elapsed="0.120898">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.028484" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.028079" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.029285" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.029035" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.029474" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.028694" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.030107" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.029673" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.030489" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.030664" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.030309" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.031104" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.030855" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.032229" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.031915" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.032838" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.032534" elapsed="0.000338"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.033906" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.033341" elapsed="0.000600"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.035197" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.034639" elapsed="0.000661"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.035382" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:25.035712" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.034157" elapsed="0.001581"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.035904" elapsed="0.000382"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:25.033158" elapsed="0.003172"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.037029" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.036605" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.038522" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.037961" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.038700" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:25.038997" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.037433" elapsed="0.001590"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.039180" elapsed="0.000378"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.036463" elapsed="0.003136"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.032938" elapsed="0.006698"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.039680" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:25.039836" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:25.031573" elapsed="0.008289"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.031229" elapsed="0.008665"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.040072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.039919" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.031206" elapsed="0.008942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.040930" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.040295" elapsed="0.000665"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.041009" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.027444" elapsed="0.013691"/>
</kw>
<msg time="2026-05-01T00:56:25.041191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.014715" elapsed="0.026530"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.054096" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.066769" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.079241" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.079551" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.079747" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.080197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.080041" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.080023" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.080430" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.080617" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.080785" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.079979" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.079837" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.081017" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.081098" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:25.081269" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.010412" elapsed="0.070887"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.082823" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.082518" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.083002" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.082090" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.083370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.083098" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.083959" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.083661" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.083468" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.083079" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.086712" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.084199" elapsed="0.002542"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:25.086795" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:25.087027" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.081683" elapsed="0.005371"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.088309" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.088068" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.088487" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.087724" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:25.088744" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:56:25.088589" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.088569" elapsed="0.000271"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.088990" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.089167" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.089236" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:25.091199" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.087374" elapsed="0.003852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.092664" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.092388" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.093112" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.092870" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:25.100281" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:25.100704" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:25.100814" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:25.095370" elapsed="0.005473"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.093224" elapsed="0.007666"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.101084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.100920" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.093205" elapsed="0.007968"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.104992" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.102318" elapsed="0.002725"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.102086" elapsed="0.002994"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.102065" elapsed="0.003040"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.108217" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.105388" elapsed="0.002896"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.105162" elapsed="0.003173"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.105145" elapsed="0.003227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.109348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.108750" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.109922" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.109518" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.110768" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.110299" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.110048" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.109490" elapsed="0.001407"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.111693" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.111140" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.112185" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.111835" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.113001" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.112570" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.112304" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.111809" elapsed="0.001314"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.113352" elapsed="0.000580"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:25.114642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.114182" elapsed="0.000499"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.114877" elapsed="0.002306"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:25.101593" elapsed="0.015660"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.117437" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:25.117326" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.117307" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.121201" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.117679" elapsed="0.003553"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:25.121287" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:25.121482" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:25.091566" elapsed="0.029945"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.121577" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:25.121734" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:24.987926" elapsed="0.133834"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.150207" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.149700" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.151068" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.150768" elapsed="0.000479">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.151431" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.150405" elapsed="0.001069"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.152090" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.151644" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.152445" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.152678" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.152285" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.153141" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "shared-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 16,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.152870" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:25.153689" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.153262" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.154490" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.153962" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.153776" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.153242" elapsed="0.001336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.155222" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.154729" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.155301" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.149068" elapsed="0.006362"/>
</kw>
<msg time="2026-05-01T00:56:25.155509" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.136278" elapsed="0.019280"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.168083" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.180463" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.193227" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.193432" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.193633" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.194067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.193913" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.193897" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.194298" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.194489" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.194663" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.193860" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.193716" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.194900" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.194977" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:25.195104" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.133600" elapsed="0.061533"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.195314" elapsed="0.003238"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.200304" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.199650" elapsed="0.000698"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.201226" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.200606" elapsed="0.000662"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.201520" elapsed="0.000496"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.199033" elapsed="0.003074"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.198668" elapsed="0.003486"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.202419" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.202190" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.198640" elapsed="0.003920"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:25.123023" elapsed="0.079612"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:25.122167" elapsed="0.080591"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.121892" elapsed="0.080999"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.121873" elapsed="0.081059"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.202985" elapsed="0.000046"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:24.982069" elapsed="0.221114"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:22.848513" elapsed="2.354765"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.272610" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.272173" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.273433" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.273173" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.273621" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.272827" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.274228" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.273818" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.274589" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.274753" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.274426" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.275185" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.274939" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.276595" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.276005" elapsed="0.000638"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.277085" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.276810" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.278008" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.277533" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.279325" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.278729" elapsed="0.000700"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.279529" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:25.279843" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.278241" elapsed="0.001630"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.280034" elapsed="0.000395"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:25.277352" elapsed="0.003136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.281167" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.280751" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.282503" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.281920" elapsed="0.000786"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.282804" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:25.283112" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.281390" elapsed="0.001750"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.283301" elapsed="0.000399"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.280612" elapsed="0.003132"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.277168" elapsed="0.006612"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.283826" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:25.283990" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:25.275672" elapsed="0.008344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.275311" elapsed="0.008738"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.284241" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.284076" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.275287" elapsed="0.009049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.285233" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.284538" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.285315" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.271490" elapsed="0.013955"/>
</kw>
<msg time="2026-05-01T00:56:25.285588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.258562" elapsed="0.027080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.298282" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.310891" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.323317" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.323593" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.323788" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.324217" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.324062" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.324044" elapsed="0.000378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.324589" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.324763" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.324933" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.324002" elapsed="0.000985"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.323870" elapsed="0.001146"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.325168" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.325250" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:25.325426" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.253900" elapsed="0.071571"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.326993" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.326690" elapsed="0.000383">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.327169" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.326247" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.327552" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.327266" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.328119" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.327822" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.327637" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.327247" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.332184" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.328357" elapsed="0.003855"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:25.332268" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:25.332433" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.325848" elapsed="0.006625"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.333751" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.333502" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.333952" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.333139" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:25.334201" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:25.334059" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.334040" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.334436" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.334630" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.334697" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:25.336612" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.332800" elapsed="0.003896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.338170" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.337877" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.338637" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.338375" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:25.346279" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:25.346431" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:25.346572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:25.340839" elapsed="0.005761"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.338750" elapsed="0.007895"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.346868" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.346674" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.338731" elapsed="0.008267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.352300" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.348590" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.348229" elapsed="0.004195"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.348202" elapsed="0.004280"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.356589" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.352902" elapsed="0.003757"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.352569" elapsed="0.004142"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.352545" elapsed="0.004204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.357619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.357019" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.358173" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.357765" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.358940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.358565" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.358297" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.357739" elapsed="0.001286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.359572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.359191" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.359911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.359670" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.360473" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.360161" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.359994" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.359651" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.360833" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:25.361688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.361367" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.361875" elapsed="0.002363"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:25.347584" elapsed="0.016723"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.364515" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:25.364383" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.364363" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.367671" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.364743" elapsed="0.002959"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:25.367757" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:25.367937" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:25.337022" elapsed="0.030941"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.368028" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:25.368182" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:25.215750" elapsed="0.152458"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.396731" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.396236" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.397588" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.397266" elapsed="0.000450">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.397901" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.396926" elapsed="0.001048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.398615" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.398153" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.398975" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.399137" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.398811" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.399614" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "shared-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 16,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.399326" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:25.400207" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.399791" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.400978" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.400464" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.400296" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.399771" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.401726" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.401217" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.401809" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.395614" elapsed="0.006348"/>
</kw>
<msg time="2026-05-01T00:56:25.402020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.382690" elapsed="0.019380"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.414719" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.427490" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.439804" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.440004" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.440183" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.440583" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.440420" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.440406" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.440808" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.440976" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.441143" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.440375" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.440263" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.441415" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.441508" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:25.441635" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.380001" elapsed="0.061661"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.441840" elapsed="0.002386"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.445444" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.444987" elapsed="0.000502"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.446114" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.445648" elapsed="0.000495"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.446303" elapsed="0.000347"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.444566" elapsed="0.002146"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.444306" elapsed="0.002440"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.446925" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.446772" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.444288" elapsed="0.002716"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:25.369416" elapsed="0.077638"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:25.368590" elapsed="0.078541"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.368293" elapsed="0.078884"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.368275" elapsed="0.078926"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.447236" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:25.209399" elapsed="0.237967"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:25.203574" elapsed="0.243851"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.496908" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.496530" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.497685" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.497436" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.497895" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.497102" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.498507" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.498103" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.498838" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.498990" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.498700" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.499424" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.499178" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.500681" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.500185" elapsed="0.000543"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.501171" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.500897" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.502033" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.501587" elapsed="0.000473"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.503291" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.502736" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.503491" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:25.503791" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.502257" elapsed="0.001561"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.503976" elapsed="0.000385"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.501425" elapsed="0.002977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.505085" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.504676" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.506355" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.505784" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.506557" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:25.506855" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.505307" elapsed="0.001574"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.507038" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.504537" elapsed="0.002936"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.501249" elapsed="0.006262"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.507558" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:25.507720" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:25.499859" elapsed="0.007886"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.499557" elapsed="0.008220"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.507959" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.507804" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.499537" elapsed="0.008499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.508781" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.508183" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.508859" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.495897" elapsed="0.013089"/>
</kw>
<msg time="2026-05-01T00:56:25.509087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.483131" elapsed="0.026007"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.521939" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.534560" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.548314" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.548618" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.548873" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.549386" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.549224" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.549204" elapsed="0.000315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.549743" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.550027" elapsed="0.000032"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.550285" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.549157" elapsed="0.001192"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.548986" elapsed="0.001393"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.550610" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.550703" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:25.550892" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.478894" elapsed="0.072041"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.552783" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.552361" elapsed="0.000613">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.553099" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.551881" elapsed="0.001256"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.553623" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.553244" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.554413" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.553989" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.553726" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.553218" elapsed="0.001348"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.557896" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.554784" elapsed="0.003141"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:25.557981" elapsed="0.000082"/>
</return>
<msg time="2026-05-01T00:56:25.558243" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.551386" elapsed="0.006896"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.559886" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.559606" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.560116" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.559184" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:25.560416" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-05-01T00:56:25.560221" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.560202" elapsed="0.000334"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.560712" elapsed="0.000035"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.560944" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.561015" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:25.563438" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.558709" elapsed="0.004782"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.565360" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.565014" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.565972" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.565641" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:25.574679" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:25.574888" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:25.575019" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:25.568696" elapsed="0.006365"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.566160" elapsed="0.009047"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.575494" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.575247" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.566132" elapsed="0.009458"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.580857" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.576927" elapsed="0.004015"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.576641" elapsed="0.004372"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.576613" elapsed="0.004458"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.586289" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.581674" elapsed="0.004717"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.581190" elapsed="0.005300"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.581156" elapsed="0.005395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.587737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.586968" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.588372" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.587879" elapsed="0.000644"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.589550" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.588909" elapsed="0.000698"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.588579" elapsed="0.001083"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.587852" elapsed="0.001843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.590843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.590067" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.591354" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.591005" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.592067" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.591682" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.591447" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.590976" elapsed="0.001220"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.592415" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:25.593555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.593141" elapsed="0.000455"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.593834" elapsed="0.003186"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:25.576081" elapsed="0.021034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.597376" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:25.597230" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.597200" elapsed="0.000309"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.601831" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.597742" elapsed="0.004133"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:25.601953" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T00:56:25.602224" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:25.563897" elapsed="0.038370"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.602479" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:25.602705" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:25.456248" elapsed="0.146499"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.640746" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.640191" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.641650" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.641324" elapsed="0.000455">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.641960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.640968" elapsed="0.001018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.642665" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.642194" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.643032" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.643201" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.642863" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.643681" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "shared-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 16,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.643391" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:25.644270" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.643814" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.645046" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.644529" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.644360" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.643790" elapsed="0.001342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.645804" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.645285" elapsed="0.000549"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.645886" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.639475" elapsed="0.006547"/>
</kw>
<msg time="2026-05-01T00:56:25.646115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.623023" elapsed="0.023145"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.659506" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.671931" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.684366" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.684590" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.684778" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.685188" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.685031" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.685016" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.685413" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.685606" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.685777" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.684981" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.684861" elapsed="0.000995"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.686012" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.686129" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:25.686275" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.619073" elapsed="0.067230"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.686498" elapsed="0.002513"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.690594" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.689940" elapsed="0.000691"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.691433" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.690865" elapsed="0.000714"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.691823" elapsed="0.000473"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:25.689429" elapsed="0.002960"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.689129" elapsed="0.003311"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.692688" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.692497" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.689101" elapsed="0.003705"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:25.604426" elapsed="0.088458"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:25.603260" elapsed="0.089747"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.602868" elapsed="0.090208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.602844" elapsed="0.090260"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.693145" elapsed="0.000048"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:25.451919" elapsed="0.241425"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:25.447621" elapsed="0.245789"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:25.693656" elapsed="0.002869"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.750687" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.750277" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.751550" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.751236" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.751721" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.750895" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.752301" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.751915" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.752652" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.752827" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.752510" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.753259" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.753015" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.754615" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.754275" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.755134" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.754843" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.756009" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.755579" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.757317" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.756767" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.757515" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:25.757818" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.756289" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.758006" elapsed="0.000439"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.755388" elapsed="0.003117"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.759174" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.758763" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:25.760444" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.759891" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:25.760648" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:25.760948" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:25.759394" elapsed="0.001580"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.761132" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:25.758623" elapsed="0.002936"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.755213" elapsed="0.006382"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:25.761639" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:25.761800" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:25.753708" elapsed="0.008117"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.753381" elapsed="0.008478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.762038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.761885" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.753359" elapsed="0.008781"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.762911" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.762290" elapsed="0.000650"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.762992" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.749615" elapsed="0.013506"/>
</kw>
<msg time="2026-05-01T00:56:25.763178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.736703" elapsed="0.026525"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.775826" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.788217" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.800642" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.800880" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.801067" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.801495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.801326" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.801310" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.801726" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.801903" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.802073" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.801272" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.801149" elapsed="0.001031"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.802333" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.802415" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:25.802584" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.732301" elapsed="0.070312"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.804028" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.803736" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.804219" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.803321" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.804610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.804321" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.805510" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.804891" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.804694" elapsed="0.000882"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.804302" elapsed="0.001297"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.808021" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.805759" elapsed="0.002291"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:25.808105" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:25.808267" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.802962" elapsed="0.005331"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.809590" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.809362" elapsed="0.000342"/>
</kw>
<msg time="2026-05-01T00:56:25.809791" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.808967" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.810025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:25.809887" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.809868" elapsed="0.000226"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.810432" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.810602" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.810265" elapsed="0.000361"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:25.811029" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.810785" elapsed="0.000270"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:25.811103" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:25.811260" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:25.808629" elapsed="0.002656"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.812700" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.812434" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.813143" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.812903" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:25.820499" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:25.820982" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '531'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:25.821096" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:25.815357" elapsed="0.005766"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.813254" elapsed="0.007918"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.821382" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.821202" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.813236" elapsed="0.008250"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.825091" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BhYAAQECAwQBAgAAABAgAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"shared-tree-join":{"c-multicast":{"source-as":16,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.822625" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.822373" elapsed="0.002806"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.822353" elapsed="0.002851"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.828017" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.825499" elapsed="0.002565"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.825259" elapsed="0.002841"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.825243" elapsed="0.002882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.828738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.828316" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.829079" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.828837" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.829718" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.829396" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.829224" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.828819" elapsed="0.000984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.830356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.829973" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.830711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.830469" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.831253" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.830959" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.830793" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.830436" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.831511" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:25.832316" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.832025" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:25.832516" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:25.821891" elapsed="0.013027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.835100" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:25.834990" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.834972" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.838264" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.835322" elapsed="0.002973"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:25.838350" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:25.838537" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:25.811617" elapsed="0.026947"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.838630" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:25.838785" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:25.709331" elapsed="0.129480"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.868819" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.868284" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.869723" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.869394" elapsed="0.000457">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:25.870028" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:25.869039" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.870782" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:25.870314" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:25.871141" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:25.871297" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:25.870978" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.871777" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:25.871506" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:25.872377" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.871911" elapsed="0.000528"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.873148" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:25.872637" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:25.872483" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:25.871886" elapsed="0.001348"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.873899" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:25.873385" elapsed="0.000543"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:25.873982" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:25.867370" elapsed="0.006752"/>
</kw>
<msg time="2026-05-01T00:56:25.874217" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.853279" elapsed="0.020991"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.886891" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.899593" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.912006" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.912230" elapsed="0.000133"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.912556" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.912965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.912811" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:25.912794" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.913195" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.913367" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.913551" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:25.912757" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.912639" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.913784" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.913865" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:25.914012" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:25.850571" elapsed="0.063469"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:25.914239" elapsed="0.002476"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.917807" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.917496" elapsed="0.000340"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:25.918678" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:25.917993" elapsed="0.000714"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:25.919192" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "path-id": 0,
      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
      "shared-tree-join": {
       "c-multicast": {
        "c-g-address": "2.0.0.2",
        "multicast-source": "1.0.0.1",
        "route-distinguisher": "1.2.3.4:258",
        "source-as": 16
       }
      }
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:25.919402" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.918868" elapsed="0.000629">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.917042" elapsed="0.002638">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:25.916796" elapsed="0.002966">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:25.919951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:25.919797" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:25.916778" elapsed="0.003252">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.840006" elapsed="0.080148">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.839164" elapsed="0.081137">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:25.838897" elapsed="0.081492">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:25.838880" elapsed="0.081545">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:25.920490" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:25.702418" elapsed="0.218196">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BhYAAQECAwQBAgAAABAgAQAAASACAAAC",
+      "shared-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 16
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.978181" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:27.977786" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:27.979011" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:27.978755" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:27.979180" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:27.978394" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.979858" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:27.979411" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:27.980196" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:27.980363" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:27.980054" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.980812" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:27.980568" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.981912" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:27.981599" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.982391" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:27.982126" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.983223" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:27.982817" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:27.984553" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:27.983940" elapsed="0.000716"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:27.984738" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:27.985045" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:27.983486" elapsed="0.001585"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:27.985234" elapsed="0.000412"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:27.982678" elapsed="0.003011"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.986379" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:27.985948" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:27.987665" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:27.987071" elapsed="0.000695"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:27.987843" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:27.988140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:27.986615" elapsed="0.001552"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:27.988324" elapsed="0.000458"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:27.985809" elapsed="0.003015"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:27.982496" elapsed="0.006365"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:27.988904" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:27.989063" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:27.981256" elapsed="0.007832"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:27.980939" elapsed="0.008181"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:27.989299" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:27.989147" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:27.980914" elapsed="0.008463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:27.990294" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:27.989540" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:27.990372" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:27.977146" elapsed="0.013370"/>
</kw>
<msg time="2026-05-01T00:56:27.990572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:27.964267" elapsed="0.026354"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.003325" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.015727" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.028196" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.028401" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.028599" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.028980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.028831" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.028815" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.029207" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.029377" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.029562" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.028783" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.028676" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.029884" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.029968" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:28.030100" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:27.959696" elapsed="0.070432"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.031479" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.031178" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.031646" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.030815" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.031999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.031743" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.032575" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.032265" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.032080" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.031724" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.035014" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.032814" elapsed="0.002227"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:28.035094" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:28.035251" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:28.030474" elapsed="0.004815"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.036493" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.036287" elapsed="0.000261"/>
</kw>
<msg time="2026-05-01T00:56:28.036632" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.035946" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.036862" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.036727" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.036708" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.037243" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.037396" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.037077" elapsed="0.000344"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:28.037833" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.037597" elapsed="0.000262"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:28.037905" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:28.038061" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:28.035619" elapsed="0.002467"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.039580" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.039312" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.040024" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.039784" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:28.047921" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.048109" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:28.048274" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:28.042424" elapsed="0.005888"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.040134" elapsed="0.008242"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.048680" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.048416" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.040116" elapsed="0.008686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.053936" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.050290" elapsed="0.003718"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.049969" elapsed="0.004090"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.049943" elapsed="0.004155"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.057952" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.054538" elapsed="0.003481"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.054181" elapsed="0.003890"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.054156" elapsed="0.003952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.058986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.058383" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.059736" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.059345" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.060353" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.060051" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.059859" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.059272" elapsed="0.001166"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.060990" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.060623" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.061324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.061086" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.061881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.061589" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.061407" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.061068" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.062126" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:28.062970" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.062662" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.063154" elapsed="0.002407"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:28.049340" elapsed="0.016368"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.065900" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.065784" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.065765" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:28.068862" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.066130" elapsed="0.002761"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:28.068949" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:28.069120" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:28.038444" elapsed="0.030702"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.069211" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:28.069363" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:27.935878" elapsed="0.133510"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.098222" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.097748" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.099210" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.098787" elapsed="0.000599">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.099590" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.098419" elapsed="0.001197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.100234" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.099789" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.100609" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.100769" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.100428" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.101227" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.100959" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:28.101768" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.101341" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.102535" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.102010" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.101854" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.101322" elapsed="0.001297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.103254" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.102770" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.103392" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.097120" elapsed="0.006426"/>
</kw>
<msg time="2026-05-01T00:56:28.103601" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.084529" elapsed="0.019122"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.116219" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.128709" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.141202" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.141416" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.141613" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.142024" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.141868" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.141851" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.142248" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.142416" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.142600" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.141817" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.141695" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.142833" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.142912" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:28.143044" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.081845" elapsed="0.061227"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.143308" elapsed="0.002281"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:28.146708" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.146365" elapsed="0.000373"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:28.147167" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.146894" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.147369" elapsed="0.000354"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.145929" elapsed="0.001856"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.145671" elapsed="0.002148"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.148002" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.147845" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.145652" elapsed="0.002427"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:28.070598" elapsed="0.077530"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:28.069759" elapsed="0.078446"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.069490" elapsed="0.078762"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.069472" elapsed="0.078805"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.148313" elapsed="0.000034"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:27.929678" elapsed="0.218786"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:25.696747" elapsed="2.451781"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:28.148779" elapsed="0.002457"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:22.840528" elapsed="5.310769"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:22.758937" elapsed="5.392575"/>
</test>
<test id="s1-s16-t16" name="Odl_To_Play_source_tree_join" line="118">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:28.155884" elapsed="0.000335"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:28.155508" elapsed="0.000794"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.157852" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.157674" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.157645" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.163926" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.163801" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.163780" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.165071" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.164660" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.165576" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:28.165262" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:28.165648" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:28.165814" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.164255" elapsed="0.001583"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.173814" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.173705" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.173686" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.175067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.174960" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.174942" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:28.175637" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.175286" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.176052" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:28.175830" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.208413" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:28.176592" elapsed="0.031940"/>
</kw>
<msg time="2026-05-01T00:56:28.208699" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:28.208747" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.176239" elapsed="0.032544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.236938" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "o "u "r "c "e "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:28.209305" elapsed="0.027741"/>
</kw>
<msg time="2026-05-01T00:56:28.237206" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:28.237252" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.208960" elapsed="0.028329"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.237621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.237368" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.237347" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.238144" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "s "o "u "r "c "e "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.237846" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.238516" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.238282" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.238264" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:28.238629" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:28.241325" elapsed="0.000313"/>
</kw>
<msg time="2026-05-01T00:56:28.241703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.240287" elapsed="0.001556"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.242123" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.242488" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:28.239659" elapsed="0.003017"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:28.238928" elapsed="0.003811"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:28.174657" elapsed="0.068179"/>
</kw>
<msg time="2026-05-01T00:56:28.242929" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:28.242974" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.174038" elapsed="0.068974"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:28.243243" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:28.243135" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.243116" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.243784" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.244130" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.244201" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:28.173349" elapsed="0.070961"/>
</kw>
<msg time="2026-05-01T00:56:28.244404" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:28.244473" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.166316" elapsed="0.078197"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.244842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.244589" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.244572" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:28.166081" elapsed="0.078861"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:28.165897" elapsed="0.079076"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:28.163383" elapsed="0.081646"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:28.157215" elapsed="0.087871"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.156561" elapsed="0.088570"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:28.152337" elapsed="0.092846"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.246069" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/announce_source_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/announce_source_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.246253" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.245861" elapsed="0.000419"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:28.246666" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.246440" elapsed="0.000253"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.247042" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/withdraw_source_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/withdraw_source_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.247168" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.246853" elapsed="0.000342"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:28.247681" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.247351" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:28.247994" elapsed="0.002658"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.247779" elapsed="0.002909"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.247761" elapsed="0.002952"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.284503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.284113" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.285359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.285101" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.285559" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.284754" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.286138" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.285755" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.286481" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.286614" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.286330" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.287042" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.286800" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.288080" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.287821" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.288570" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.288288" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.289256" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.288960" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.290218" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.289804" elapsed="0.000441"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.290296" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:28.290475" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.289485" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.290658" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:28.288822" elapsed="0.002115"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.291526" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.291186" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.292483" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.292061" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.292561" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:28.292713" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.291743" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.292892" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:28.291051" elapsed="0.002102"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.288647" elapsed="0.004541"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.293232" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:28.293387" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:28.287498" elapsed="0.005913"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.287154" elapsed="0.006289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.293637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.293484" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.287135" elapsed="0.006578"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.294649" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.293860" elapsed="0.000818"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.294729" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.283498" elapsed="0.011359"/>
</kw>
<msg time="2026-05-01T00:56:28.294912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.270855" elapsed="0.024105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.307320" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.319663" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.332028" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.332276" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.332481" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.332901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.332747" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.332730" elapsed="0.000360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.333250" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.333423" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.333618" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.332689" elapsed="0.000984"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.332564" elapsed="0.001138"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.333854" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.333935" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:28.334086" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.266428" elapsed="0.067687"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.359028" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.358639" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.359850" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.359595" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.360018" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.359222" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.360607" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.360209" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.360939" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.361110" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.360798" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.361553" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;10&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/source-tree-join&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.361296" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:28.361991" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.361681" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.362530" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.362223" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.362075" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.361661" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.363212" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.362762" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.363292" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.358011" elapsed="0.005412"/>
</kw>
<msg time="2026-05-01T00:56:28.363523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.345337" elapsed="0.018236"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.376160" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.388595" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.400915" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.401115" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.401296" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.401706" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.401555" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.401539" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.401931" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.402101" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.402268" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.401506" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.401374" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.402513" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.402591" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:28.402728" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
     ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.344431" elapsed="0.058327"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.404088" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.403816" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.404254" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.403431" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.404620" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.404349" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.405172" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.404882" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.404700" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.404330" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.407625" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.405406" elapsed="0.002246"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:28.407737" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:28.407896" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:28.403097" elapsed="0.004824"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.409472" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.409208" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.409911" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;10&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/source-tree-join&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.409676" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.410356" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.410117" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.410802" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.410564" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:28.411689" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:28.411486" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:28.412064" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:28.411890" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.412240" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.412869" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.412623" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:28.412956" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:28.413118" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:28.411048" elapsed="0.002095"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:28.426207" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '796', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;BxYAAQECAwQBAgAAAAogAQAAASACAAAC&lt;/route-key&gt;
    &lt;attributes&gt;
      &lt;ipv4-next-hop&gt;
        &lt;global&gt;127.1.1.1&lt;/global&gt;
      &lt;/ipv4-next-hop&gt;
      &lt;multi-exit-disc&gt;
        &lt;med&gt;0&lt;/med&gt;
      &lt;/multi-exit-disc&gt;
      &lt;as-path/&gt;
      &lt;origin&gt;
        &lt;value&gt;egp&lt;/value&gt;
      &lt;/origin&gt;
      &lt;local-pref&gt;
        &lt;pref&gt;100&lt;/pref&gt;
      &lt;/local-pref&gt;
    &lt;/attributes&gt;
    &lt;source-tree-join&gt;
      &lt;c-multicast&gt;
        &lt;multicast-source&gt;1.0.0.1&lt;/multicast-source&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;source-as&gt;10&lt;/source-as&gt;
        &lt;c-g-address&gt;2.0.0.2&lt;/c-g-address&gt;
      &lt;/c-multicast&gt;
    &lt;/source-tree-join&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:28.426324" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=BxYAAQECAwQBAgAAAAogAQAAASACAAAC,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.426551" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:28.416702" elapsed="0.009900"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.413214" elapsed="0.013472"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.427037" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.426735" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.413197" elapsed="0.014109"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.435075" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.429729" elapsed="0.005443"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.429199" elapsed="0.006052"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.429159" elapsed="0.006149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.438291" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.436007" elapsed="0.002330"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.435432" elapsed="0.003037"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.435395" elapsed="0.003106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.439069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.438675" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.439406" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.439166" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.439987" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.439688" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.439520" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.439148" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.440608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.440231" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.440943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.440706" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.441495" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.441186" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.441023" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.440688" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.441731" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:28.442539" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.442238" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.442719" elapsed="0.002318"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:28.428185" elapsed="0.016914"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:28.445278" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:56:28.445171" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.445153" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.445533" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.445603" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:28.447986" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:28.408256" elapsed="0.039757"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.448083" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:28.448233" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:28.255509" elapsed="0.192748"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.448660" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.448400" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.448381" elapsed="0.000371"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.448786" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:28.250989" elapsed="0.197921"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.452503" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.449863" elapsed="0.002671"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.452689" elapsed="0.052151"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:28.504933" elapsed="0.000050"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:28.449591" elapsed="0.055531"/>
</kw>
<msg time="2026-05-01T00:56:28.505206" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:28.449084" elapsed="0.056150"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.506233" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:28.506310" level="INFO">${len_1} = 160</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:28.505921" elapsed="0.000412"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.506761" level="INFO">Length is 160.</msg>
<msg time="2026-05-01T00:56:28.506837" level="INFO">${len_2} = 160</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:28.506507" elapsed="0.000353"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.507017" elapsed="0.000304"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.507691" level="INFO">${sum_1} = 1019</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:28.507493" elapsed="0.000223"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.508042" level="INFO">${sum_2} = 1019</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:28.507867" elapsed="0.000199"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.508218" elapsed="0.000317"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:28.505516" elapsed="0.003078"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:28.508746" elapsed="0.002501"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.557325" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.556941" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.558140" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.557879" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.558309" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.557543" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.558902" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.558516" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.559232" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.559473" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.559091" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.559930" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.559685" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.561021" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.560710" elapsed="0.000365"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.561528" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.561236" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.562352" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.561933" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.563518" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.563015" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.563774" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:28.564011" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.562589" elapsed="0.001449"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.564199" elapsed="0.000435"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:28.561794" elapsed="0.002885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.565350" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.564935" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.566528" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.566006" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.566758" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:28.566985" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.565584" elapsed="0.001427"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.567165" elapsed="0.000484"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:28.564799" elapsed="0.002902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.561615" elapsed="0.006121"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.567781" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:28.567943" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:28.560367" elapsed="0.007602"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.560055" elapsed="0.007946"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.568180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.568026" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.560031" elapsed="0.008224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.568997" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.568399" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.569074" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.556307" elapsed="0.012893"/>
</kw>
<msg time="2026-05-01T00:56:28.569255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.543326" elapsed="0.025978"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.581978" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.594289" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.606587" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.606782" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.606959" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.607329" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.607183" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.607168" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.607592" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.607766" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.607931" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.607138" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.607033" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.608161" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.608236" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:28.608358" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.539015" elapsed="0.069369"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.609515" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.609243" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:28.618157" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.618205" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.618359" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:28.611704" elapsed="0.006682"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.609630" elapsed="0.008796"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.618633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.618473" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.609612" elapsed="0.009104"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.623384" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.620057" elapsed="0.003387"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.619745" elapsed="0.003769"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.619720" elapsed="0.003830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.627154" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.623959" elapsed="0.003259"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.623643" elapsed="0.003623"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.623619" elapsed="0.003682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.628146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.627571" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.628501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.628246" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.629052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.628755" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.628584" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.628227" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.629675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.629299" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.630009" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.629770" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.630562" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.630255" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.630091" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.629753" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.630797" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:28.631621" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.631303" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.631803" elapsed="0.002432"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:28.619137" elapsed="0.015162"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:28.634345" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:28.636627" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:28.608666" elapsed="0.027989"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.636709" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:28.512565" elapsed="0.124269"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.511945" elapsed="0.124944"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:28.511481" elapsed="0.125468"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.640398" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.637880" elapsed="0.002547"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.640690" elapsed="0.002081"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:28.642821" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:28.637609" elapsed="0.005339"/>
</kw>
<msg time="2026-05-01T00:56:28.643023" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:28.637125" elapsed="0.005924"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.643991" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:28.644116" level="INFO">${len_1} = 148</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:28.643697" elapsed="0.000452"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.644752" level="INFO">Length is 148.</msg>
<msg time="2026-05-01T00:56:28.644854" level="INFO">${len_2} = 148</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:28.644369" elapsed="0.000517"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.645106" elapsed="0.000448"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.646032" level="INFO">${sum_1} = 868</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:28.645775" elapsed="0.000292"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:28.646547" level="INFO">${sum_2} = 868</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:28.646280" elapsed="0.000303"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:28.646797" elapsed="0.000421"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:28.643264" elapsed="0.004037"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.692148" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.691776" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.692962" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.692706" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.693129" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.692352" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.693715" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.693317" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.694043" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.694189" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.693907" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.694633" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.694374" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.695677" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.695393" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.696152" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.695886" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.697093" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.696557" elapsed="0.000562"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.698301" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.697857" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.698477" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:28.698704" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.697350" elapsed="0.001380"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.698887" elapsed="0.000489"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:28.696405" elapsed="0.003013"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.700225" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.699716" elapsed="0.000536"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.701374" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.700932" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.701550" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:28.701781" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.700444" elapsed="0.001363"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.701963" elapsed="0.000513"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:28.699551" elapsed="0.002970"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.696230" elapsed="0.006326"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.702601" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:28.702759" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:28.695043" elapsed="0.007741"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.694746" elapsed="0.008070"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.702993" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.702841" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.694726" elapsed="0.008344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.703972" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.703217" elapsed="0.000784"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.704050" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.691095" elapsed="0.013079"/>
</kw>
<msg time="2026-05-01T00:56:28.704228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.678397" elapsed="0.025890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.716941" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.729363" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.741858" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.742060" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.742239" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.742627" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.742477" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.742460" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.742851" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.743021" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.743188" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.742417" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.742314" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.743416" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.743506" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:28.743628" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.673951" elapsed="0.069730"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.744835" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.744573" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:28.751726" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.751873" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:28.752018" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:28.752060" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.747009" elapsed="0.005465">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:28.744948" elapsed="0.007605">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.752751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.752587" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:28.744930" elapsed="0.007940">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.756467" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.753923" elapsed="0.002579">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:28.753698" elapsed="0.002867">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:28.753680" elapsed="0.002918">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.759191" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.756892" elapsed="0.002331">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:28.756667" elapsed="0.002620">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:28.756650" elapsed="0.002669">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.759940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.759525" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.760281" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.760040" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.760848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.760550" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.760363" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.760022" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.761469" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.761095" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.761804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.761567" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.762338" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.762047" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.761884" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.761549" elapsed="0.000871"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.762676" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:28.763504" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.763198" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:28.766121" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.763703" elapsed="0.002451">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.753248" elapsed="0.013042">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:28.766351" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:28.768785" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:28.768815" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:28.743951" elapsed="0.024893">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.768952" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.648801" elapsed="0.120325">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.648197" elapsed="0.120991"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:28.647650" elapsed="0.121598"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:28.245491" elapsed="0.523809"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.151756" elapsed="0.617661"/>
</test>
<test id="s1-s16-t17" name="Play_To_Odl_source_tree_join" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:28.772633" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:28.772347" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.773921" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.773810" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.773791" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.778967" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.778854" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.778837" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.780048" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.779667" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.780546" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:28.780238" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:28.780617" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:28.780773" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.779263" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.786301" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.786192" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.786173" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.787571" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.787440" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.787422" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:28.788109" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.787803" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.788535" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:28.788299" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.819198" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:28.789060" elapsed="0.030291"/>
</kw>
<msg time="2026-05-01T00:56:28.819561" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:28.819610" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.788724" elapsed="0.030922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:28.848522" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "o "u "r "c "e "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:28.820296" elapsed="0.028416"/>
</kw>
<msg time="2026-05-01T00:56:28.848976" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:28.849136" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.819891" elapsed="0.029301"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.849790" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.849330" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.849293" elapsed="0.000623"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.850645" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "s "o "u "r "c "e "_ "t "r "e "e "_ "j "o "i "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.850136" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.851181" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.850853" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.850824" elapsed="0.000475"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:28.851353" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:28.854309" elapsed="0.000181"/>
</kw>
<msg time="2026-05-01T00:56:28.854557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.853140" elapsed="0.001554"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.854978" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.855337" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:28.852484" elapsed="0.003080"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:28.851873" elapsed="0.003783"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:28.787140" elapsed="0.068657"/>
</kw>
<msg time="2026-05-01T00:56:28.855895" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:28.855940" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.786538" elapsed="0.069442"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:28.856171" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:28.856060" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.856041" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.856699" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.857054" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.857127" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:28.785850" elapsed="0.071389"/>
</kw>
<msg time="2026-05-01T00:56:28.857334" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:28.857378" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.781171" elapsed="0.076246"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.857828" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.857536" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.857511" elapsed="0.000397"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:28.781026" elapsed="0.076906"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:28.780854" elapsed="0.077112"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:28.778495" elapsed="0.079529"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:28.773518" elapsed="0.084564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:28.773061" elapsed="0.085120"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:28.770078" elapsed="0.088160"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.859385" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.858904" elapsed="0.000509"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.860071" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.859600" elapsed="0.000500"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.860852" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.860289" elapsed="0.000591"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.861262" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/announce_source_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/announce_source_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.861462" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.861054" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.861841" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/withdraw_source_tree_join.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/withdraw_source_tree_join.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.861971" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.861652" elapsed="0.000345"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:28.862153" elapsed="0.002483"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:28.864799" elapsed="0.001857"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.919346" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.918931" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.920262" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.919954" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.920438" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.919584" elapsed="0.000897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.921045" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.920653" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.921379" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:28.921565" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:28.921236" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.921998" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.921755" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.923168" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.922859" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.923675" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.923378" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.924538" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.924112" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.925802" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.925223" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.925986" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:28.926292" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.924761" elapsed="0.001558"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.926498" elapsed="0.000390"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:28.923972" elapsed="0.002960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.927803" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:28.927191" elapsed="0.000640"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:28.929045" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.928501" elapsed="0.000646"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:28.929226" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:28.929538" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:28.928024" elapsed="0.001541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:28.929723" elapsed="0.000363"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:28.927054" elapsed="0.003074"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.923793" elapsed="0.006371"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:28.930207" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:28.930365" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:28.922470" elapsed="0.007921"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.922125" elapsed="0.008298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.930618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.930463" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.922100" elapsed="0.008595"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.931421" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:28.930843" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:28.931515" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:28.918248" elapsed="0.013392"/>
</kw>
<msg time="2026-05-01T00:56:28.931696" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:28.905411" elapsed="0.026346"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.944277" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.956804" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.969218" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.969423" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.969622" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.970000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.969851" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.969836" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.970223" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.970393" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.970578" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:28.969805" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.969700" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.970808" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.970884" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:28.971015" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:28.901094" elapsed="0.069948"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.972430" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.972107" elapsed="0.000414">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.972615" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.971728" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.972967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.972710" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.973540" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:28.973234" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.973049" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.972692" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.976157" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:28.973776" elapsed="0.002408"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:28.976283" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:28.976460" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:28.971374" elapsed="0.005114"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:28.977733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.977486" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:28.977889" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:28.977133" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:28.978119" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:28.977984" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:28.977966" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.978351" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.978541" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.978607" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:28.980531" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:28.976804" elapsed="0.003753"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.981950" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.981699" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:28.982388" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:28.982150" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:28.989753" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:28.989895" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:28.989995" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.984630" elapsed="0.005734">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:28.982516" elapsed="0.007947">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.990656" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.990499" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:28.982497" elapsed="0.008247">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.991126" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.991294" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:28.991257" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.991239" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.991523" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.991595" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.980871" elapsed="0.010832">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.991811" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.877932" elapsed="0.113980">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:28.992198" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:28.992015" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:28.991997" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:28.992327" elapsed="0.000014"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:28.871572" elapsed="0.120852">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.049613" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.049166" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.050477" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.050190" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.050660" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.049836" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.051252" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.050859" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.051610" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.051778" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.051462" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.052395" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.051968" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.053561" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.053229" elapsed="0.000446"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.054119" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.053842" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.054958" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.054541" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.056230" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.055671" elapsed="0.000660"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.056414" elapsed="0.000061"/>
</return>
<msg time="2026-05-01T00:56:31.056766" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.055185" elapsed="0.001608"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.056984" elapsed="0.000405"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:31.054377" elapsed="0.003056"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.058120" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.057712" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.059584" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.059008" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.059768" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:31.060072" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.058543" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.060257" elapsed="0.000390"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.057572" elapsed="0.003117"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.054199" elapsed="0.006526"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.060770" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:31.060972" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:31.052897" elapsed="0.008100"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.052539" elapsed="0.008491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.061217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.061058" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.052514" elapsed="0.008779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.062156" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.061443" elapsed="0.000742"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.062235" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.048442" elapsed="0.013919"/>
</kw>
<msg time="2026-05-01T00:56:31.062418" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.035495" elapsed="0.027052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.075211" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.087847" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.100245" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.100462" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.100645" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.101067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.100909" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.100891" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.101296" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.101481" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.101652" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.100831" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.100724" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.101880" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.101955" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:31.102083" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.031065" elapsed="0.071046"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.103431" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.103158" elapsed="0.000367">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.103623" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.102798" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.103976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.103719" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.104561" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.104251" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.104064" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.103701" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.107175" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.104802" elapsed="0.002401"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:31.107256" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:31.107468" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.102445" elapsed="0.005050"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.108731" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.108494" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.108916" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.108137" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:31.109152" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:31.109014" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.108995" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.109388" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.109585" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.109653" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:31.111573" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.107809" elapsed="0.003790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.113021" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.112750" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.113485" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.113226" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:31.121133" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:31.121551" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:31.121669" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:31.115669" elapsed="0.006027"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.113599" elapsed="0.008140"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.121925" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.121766" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.113580" elapsed="0.008433"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.125507" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.123042" elapsed="0.002516"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.122818" elapsed="0.002777"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.122800" elapsed="0.002820"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.128370" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.125905" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.125677" elapsed="0.002792"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.125660" elapsed="0.002836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.129147" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.128727" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.129514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.129248" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.130070" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.129767" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.129598" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.129229" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.130705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.130322" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.131041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.130803" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.131598" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.131286" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.131122" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.130785" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.131836" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:31.132667" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.132355" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.132851" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:31.122380" elapsed="0.012860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.135418" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:31.135312" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.135293" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.138514" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.135656" elapsed="0.002888"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:31.138596" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:31.138760" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:31.111915" elapsed="0.026871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.138848" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:31.139000" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:31.007704" elapsed="0.131322"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.167586" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.167002" elapsed="0.000612"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.168429" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.168121" elapsed="0.000504">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.168811" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.167781" elapsed="0.001056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.169494" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.169028" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.169853" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.170015" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.169690" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.170490" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 10,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.170208" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:31.171015" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.170609" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.171783" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.171252" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.171102" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.170590" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.172537" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.172022" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.172616" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.166366" elapsed="0.006379"/>
</kw>
<msg time="2026-05-01T00:56:31.172801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.153485" elapsed="0.019363"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.185317" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.197825" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.210270" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.210505" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.210690" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.211101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.210943" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.210927" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.211330" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.211522" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.211694" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.210893" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.210774" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.211929" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.212006" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:31.212145" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.150835" elapsed="0.061338"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.212353" elapsed="0.002485"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.216101" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.215628" elapsed="0.000501"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.216725" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.216286" elapsed="0.000467"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.216930" elapsed="0.000334"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.215179" elapsed="0.002145"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.214920" elapsed="0.002438"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.217552" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.217383" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.214901" elapsed="0.002729"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:31.140176" elapsed="0.077505"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:31.139352" elapsed="0.078407"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.139108" elapsed="0.078744"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.139091" elapsed="0.078788"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.217914" elapsed="0.000032"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:31.002351" elapsed="0.215699"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:28.866841" elapsed="2.351271"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.267636" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.267243" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.268434" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.268176" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.268623" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.267833" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.269235" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.268818" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.269590" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.269755" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.269429" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.270187" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.269942" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.271426" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.270945" elapsed="0.000554"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.271944" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.271668" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.272774" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.272339" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.274046" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.273491" elapsed="0.000658"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.274227" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:31.274550" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.273009" elapsed="0.001569"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.274739" elapsed="0.000549"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:31.272198" elapsed="0.003133"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.276009" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.275606" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.277288" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.276700" elapsed="0.000733"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.277533" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:31.277834" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.276225" elapsed="0.001635"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.278018" elapsed="0.000373"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.275464" elapsed="0.002969"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.272024" elapsed="0.006465"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.278534" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:31.278695" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:31.270620" elapsed="0.008102"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.270301" elapsed="0.008453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.278934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.278780" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.270282" elapsed="0.008731"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.279766" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.279161" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.279845" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.266624" elapsed="0.013347"/>
</kw>
<msg time="2026-05-01T00:56:31.280027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.253872" elapsed="0.026203"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.292765" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.305219" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.317570" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.317776" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.317960" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.318337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.318189" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.318173" elapsed="0.000305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.318630" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.318806" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.318978" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.318142" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.318036" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.319209" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.319287" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:31.319417" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.249591" elapsed="0.069853"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.320763" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.320502" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.320927" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.320129" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.321304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.321047" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.321881" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.321588" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.321386" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.321028" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.324559" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.322125" elapsed="0.002462"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:31.324640" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:31.324796" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.319793" elapsed="0.005027"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.326076" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.325844" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.326234" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.325503" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:31.326482" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:31.326330" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.326311" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.326718" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.326892" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.326957" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:31.328875" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.325159" elapsed="0.003776"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.330376" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.330126" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.330837" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.330595" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:31.338321" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:31.338548" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:31.338688" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:31.333070" elapsed="0.005654"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.330948" elapsed="0.007835"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.339041" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.338820" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.330929" elapsed="0.008232"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.344219" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.340614" elapsed="0.003676"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.340276" elapsed="0.004062"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.340251" elapsed="0.004123"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.347445" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.344794" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.344475" elapsed="0.003066"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.344432" elapsed="0.003135"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.348136" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.347745" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.348497" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.348234" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.349087" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.348768" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.348597" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.348217" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.349717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.349336" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.350057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.349816" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.350607" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.350300" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.350137" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.349797" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.350886" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:31.351718" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.351406" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.351903" elapsed="0.002289"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:31.339693" elapsed="0.014563"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.354435" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:31.354327" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.354308" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.357492" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.354671" elapsed="0.002852"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:31.357576" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:31.357738" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:31.329287" elapsed="0.028477"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.357826" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:31.357979" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:31.226974" elapsed="0.131032"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.386364" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.385904" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.387190" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.386922" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.387501" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.386583" elapsed="0.000945"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.388135" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.387699" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.388501" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.388653" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.388327" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.389128" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 10,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.388838" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:31.389702" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.389284" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.390442" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.389939" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.389788" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.389265" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.391175" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.390694" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.391253" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.385265" elapsed="0.006115"/>
</kw>
<msg time="2026-05-01T00:56:31.391437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.372324" elapsed="0.019187"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.404100" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.416515" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.428895" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.429105" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.429282" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.429681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.429533" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.429519" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.429904" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.430077" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.430245" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.429486" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.429362" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.430527" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.430606" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:31.430729" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.369708" elapsed="0.061048"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.430934" elapsed="0.002353"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.434498" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.434040" elapsed="0.000489"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.435114" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.434687" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.435301" elapsed="0.000351"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.433629" elapsed="0.002084"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.433370" elapsed="0.002376"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.435924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.435771" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.433351" elapsed="0.002650"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:31.359145" elapsed="0.076904"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:31.358333" elapsed="0.077791"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.358090" elapsed="0.078078"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.358073" elapsed="0.078119"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.436225" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:31.222633" elapsed="0.213719"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:31.218292" elapsed="0.218121"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.485656" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.485261" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.486535" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.486296" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.486738" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.485957" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.487317" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.486933" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.487664" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.487798" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.487526" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.488227" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.487985" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.489479" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.488980" elapsed="0.000548"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.489971" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.489697" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.490787" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.490364" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.492035" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.491488" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.492217" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:31.492528" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.491009" elapsed="0.001545"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.492712" elapsed="0.000403"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.490223" elapsed="0.002934"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.493960" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.493560" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.495194" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.494651" elapsed="0.000646"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.495375" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:31.495685" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.494175" elapsed="0.001537"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.495866" elapsed="0.000365"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.493405" elapsed="0.002868"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.490049" elapsed="0.006260"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.496353" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:31.496531" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:31.488653" elapsed="0.007904"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.488340" elapsed="0.008249"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.496767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.496614" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.488321" elapsed="0.008523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.497586" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.496992" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.497663" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.484620" elapsed="0.013169"/>
</kw>
<msg time="2026-05-01T00:56:31.497890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.471946" elapsed="0.025994"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.510513" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.522845" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.535259" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.535477" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.535659" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.536041" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.535889" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.535874" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.536269" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.536438" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.536625" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.535842" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.535736" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.536856" elapsed="0.000075"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.536995" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:31.537145" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.467693" elapsed="0.069480"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.538490" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.538215" elapsed="0.000389">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.538700" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.537855" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.539057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.538796" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.539627" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.539317" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.539137" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.538778" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.543395" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.539864" elapsed="0.003559"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:31.543492" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:31.543652" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.537517" elapsed="0.006159"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.544910" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.544675" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.545092" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.544318" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:31.545328" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:31.545191" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.545173" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.545577" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.545750" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.545815" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:31.547731" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.543985" elapsed="0.003772"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.549202" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.548920" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.549667" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.549407" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:31.557198" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:31.557346" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '386'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}} 
 </msg>
<msg time="2026-05-01T00:56:31.557485" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:31.551843" elapsed="0.005671"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.549778" elapsed="0.007829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.557801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.557638" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.549760" elapsed="0.008127"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.561436" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.558942" elapsed="0.002560"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.558716" elapsed="0.002821"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.558698" elapsed="0.002864"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.565306" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.561847" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.561620" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.561603" elapsed="0.003873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.566281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.565729" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.566785" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.566420" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.567589" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.567139" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.566903" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.566394" elapsed="0.001315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.568474" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.567940" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.568949" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.568614" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.569780" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.569342" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.569063" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.568588" elapsed="0.001308"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.570124" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:31.570963" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.570663" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.571149" elapsed="0.002350"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:31.558266" elapsed="0.015300"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.573749" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:31.573639" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.573619" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.576844" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.573971" elapsed="0.002903"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:31.576927" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:31.577130" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:31.548070" elapsed="0.029089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.577279" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:31.577436" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:31.445278" elapsed="0.132200"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.606723" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.606190" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.607671" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.607289" elapsed="0.000516">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.607987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.606940" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.608652" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.608186" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.609017" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/source_tree_join/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.609216" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.608849" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.609697" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "source-tree-join": {
          "c-multicast": {
            "multicast-source": "1.0.0.1",
            "route-distinguisher": "1.2.3.4:258",
            "source-as": 10,
            "c-g-address": "2.0.0.2"
          }
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.609410" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:31.610285" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.609829" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.611054" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.610544" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.610377" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.609804" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.611808" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.611291" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.611890" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.605520" elapsed="0.006508"/>
</kw>
<msg time="2026-05-01T00:56:31.612085" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.592267" elapsed="0.019868"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.624799" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.637291" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.649794" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.650022" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.650212" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.650647" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.650492" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.650473" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.650879" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.651051" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.651219" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.650420" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.650296" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.651465" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.651547" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:31.651694" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "path-id": 0,
        "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
        "attributes": {
          "ipv4-next-hop": {
...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.589431" elapsed="0.062292"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.651906" elapsed="0.004733"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.660083" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.658945" elapsed="0.001206"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.661585" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.660546" elapsed="0.001226"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.662156" elapsed="0.000859"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:31.657771" elapsed="0.005388"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.656919" elapsed="0.006319"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.663681" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.663302" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.656854" elapsed="0.007010"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:31.578660" elapsed="0.085375"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:31.577827" elapsed="0.086459"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.577565" elapsed="0.086833"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.577548" elapsed="0.086941"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.664583" elapsed="0.000083"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:31.440905" elapsed="0.224002"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:31.436609" elapsed="0.228437"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:31.665492" elapsed="0.003272"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.723752" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.723347" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.724572" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.724294" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.724750" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.723955" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.725356" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.724946" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.725710" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.725868" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.725566" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.726311" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.726058" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.727644" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.727313" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.728132" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.727858" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.728980" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.728570" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.730338" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.729778" elapsed="0.000667"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.730547" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:31.730861" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.729296" elapsed="0.001591"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.731049" elapsed="0.000391"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.728404" elapsed="0.003095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.732159" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.731756" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:31.733428" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.732858" elapsed="0.000690"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:31.733627" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:31.733923" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:31.732378" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.734106" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:31.731618" elapsed="0.002914"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.728218" elapsed="0.006350"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:31.734612" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:31.734768" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:31.726762" elapsed="0.008031"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.726436" elapsed="0.008389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.735004" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.734851" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.726411" elapsed="0.008669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.735830" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.735226" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.735907" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.722726" elapsed="0.013306"/>
</kw>
<msg time="2026-05-01T00:56:31.736087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.709923" elapsed="0.026213"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.748678" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.761015" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.773463" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.773663" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.773842" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.774215" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.774069" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.774054" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.774437" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.774624" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.774794" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.774025" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.773921" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.775022" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.775103" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:31.775223" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.705627" elapsed="0.069622"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.776526" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.776269" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.776685" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.775929" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.777032" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.776782" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.777847" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.777327" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.777114" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.776764" elapsed="0.001170"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.780272" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.778092" elapsed="0.002206"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:31.780351" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:31.780521" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.775601" elapsed="0.004945"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.781745" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.781556" elapsed="0.000276"/>
</kw>
<msg time="2026-05-01T00:56:31.781919" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.781186" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.782149" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:31.782014" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.781996" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.782548" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.782676" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.782366" elapsed="0.000334"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:31.783092" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.782860" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:31.783167" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:31.783321" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:31.780861" elapsed="0.002484"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.784757" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.784509" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.785224" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.784957" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:31.792655" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:31.793110" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '531'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:31.793240" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:31.787417" elapsed="0.005852"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.785337" elapsed="0.007982"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.793520" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.793345" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.785319" elapsed="0.008290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.798322" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"BxYAAQECAwQBAgAAAAogAQAAASACAAAC","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"source-tree-join":{"c-multicast":{"source-as":10,"route-distinguisher":"1.2.3.4:258","multicast-source":"1.0.0.1","c-g-address":"2.0.0.2"}}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.794864" elapsed="0.003528"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.794551" elapsed="0.003892"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.794524" elapsed="0.003982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.802349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.798908" elapsed="0.003487"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.798593" elapsed="0.003837"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.798569" elapsed="0.003906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.803033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.802651" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.803374" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.803131" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.803978" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.803677" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.803508" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.803112" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.804605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.804225" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.804938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.804701" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.805506" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.805181" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.805018" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.804683" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.805743" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:31.806555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.806258" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:31.806739" elapsed="0.002280"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:31.793977" elapsed="0.015104"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.809286" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:31.809151" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.809133" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.812393" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.809525" elapsed="0.002896"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:31.812490" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:31.812650" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:31.783682" elapsed="0.028994"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.812739" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:31.812891" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:31.682916" elapsed="0.130001"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.841148" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.840703" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.841987" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.841728" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:31.842274" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:31.841366" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.842964" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:31.842521" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:31.843311" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:31.843437" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:31.843155" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.843906" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:31.843641" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:31.844428" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.844021" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.845191" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:31.844683" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:31.844531" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:31.844002" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.845940" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:31.845443" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:31.846018" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:31.840067" elapsed="0.006078"/>
</kw>
<msg time="2026-05-01T00:56:31.846198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.827296" elapsed="0.018950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.858646" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.871119" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.884841" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.885111" elapsed="0.000077"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.885417" elapsed="0.000058"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.885929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.885772" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:31.885748" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.886169" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.886342" elapsed="0.000033"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.886543" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:31.885713" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.885585" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.886793" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.886871" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:31.887013" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:31.824659" elapsed="0.062382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:31.887233" elapsed="0.002582"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.891024" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.890715" elapsed="0.000337"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:31.891879" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:31.891220" elapsed="0.000688"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:31.892397" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "path-id": 0,
      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
      "source-tree-join": {
       "c-multicast": {
        "c-g-address": "2.0.0.2",
        "multicast-source": "1.0.0.1",
        "route-distinguisher": "1.2.3.4:258",
        "source-as": 10
       }
      }
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:31.892629" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.892071" elapsed="0.000635">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.890174" elapsed="0.002721">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:31.889898" elapsed="0.003080">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:31.893169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:31.893014" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:31.889879" elapsed="0.003385">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.814076" elapsed="0.079330">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.813258" elapsed="0.080354">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:31.813000" elapsed="0.080719">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:31.812983" elapsed="0.080775">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:31.893810" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:31.678565" elapsed="0.215374">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,36 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "BxYAAQECAwQBAgAAAAogAQAAASACAAAC",
+      "source-tree-join": {
+       "c-multicast": {
+        "c-g-address": "2.0.0.2",
+        "multicast-source": "1.0.0.1",
+        "route-distinguisher": "1.2.3.4:258",
+        "source-as": 10
+       }
+      }
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.951011" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:33.950618" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:33.951834" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:33.951576" elapsed="0.000335">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:33.952005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:33.951223" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.952601" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:33.952199" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:33.952936" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:33.953098" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:33.952795" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.953550" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:33.953289" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.954693" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:33.954362" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.955172" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:33.954905" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.955992" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:33.955588" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:33.957231" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:33.956686" elapsed="0.000646"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:33.957411" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:56:33.957731" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:33.956210" elapsed="0.001548"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:33.957916" elapsed="0.000384"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:33.955426" elapsed="0.002928"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.959027" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:33.958625" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:33.960249" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:33.959711" elapsed="0.000639"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:33.960426" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:56:33.960737" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:33.959242" elapsed="0.001522"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:33.960919" elapsed="0.000417"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:33.958486" elapsed="0.002893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:33.955251" elapsed="0.006165"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:33.961476" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:33.961637" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:33.953976" elapsed="0.007687"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:33.953674" elapsed="0.008021"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:33.961874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:33.961721" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:33.953651" elapsed="0.008300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:33.962880" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:33.962097" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:33.962960" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:33.949960" elapsed="0.013128"/>
</kw>
<msg time="2026-05-01T00:56:33.963142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:33.937291" elapsed="0.025901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:33.975813" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:33.988133" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.000361" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.000580" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.000762" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.001146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.000998" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.000981" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.001533" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.001705" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.001873" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.000944" elapsed="0.001035"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.000839" elapsed="0.001168"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.002162" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.002240" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:34.002403" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:33.932868" elapsed="0.069564"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.003785" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.003505" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.003951" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.003114" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.004296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.004046" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.004872" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.004576" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.004378" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.004028" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.007276" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.005107" elapsed="0.002196"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:34.007354" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:34.007524" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:34.002780" elapsed="0.004769"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.008715" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.008528" elapsed="0.000240"/>
</kw>
<msg time="2026-05-01T00:56:34.008851" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.008178" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.009080" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.008945" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.008927" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.009472" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.009618" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.009293" elapsed="0.000350"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:34.010034" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.009802" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:34.010106" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:34.010266" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:34.007856" elapsed="0.002435"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.011778" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.011532" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.012221" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.011981" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:34.020241" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.020432" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:34.020599" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:34.014623" elapsed="0.006013"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.012340" elapsed="0.008356"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.020954" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.020734" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.012322" elapsed="0.008752"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.025879" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.022530" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.022176" elapsed="0.003819"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.022151" elapsed="0.003880"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.029637" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.026438" elapsed="0.003262"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.026109" elapsed="0.003639"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.026086" elapsed="0.003697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.030601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.030013" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.031078" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.030741" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.031716" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.031396" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.031219" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.030716" elapsed="0.001085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.032328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.031967" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.032734" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.032424" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.033291" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.032996" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.032830" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.032407" elapsed="0.000968"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.033549" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:34.034366" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.034067" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.034575" elapsed="0.002296"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:34.021594" elapsed="0.015374"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.037149" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.037041" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.037023" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:34.040016" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.037367" elapsed="0.002678"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:34.040097" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:34.040256" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:34.010697" elapsed="0.029587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.040348" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:34.040516" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:33.909855" elapsed="0.130688"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.070250" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.069794" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.071080" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.070814" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.071374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.070476" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.072030" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.071583" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.072378" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.072529" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.072221" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.072976" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.072714" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:34.073507" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.073091" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.074250" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.073746" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.073595" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.073070" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.075031" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.074538" elapsed="0.000555"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.075145" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.069153" elapsed="0.006121"/>
</kw>
<msg time="2026-05-01T00:56:34.075327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.056349" elapsed="0.019026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.088821" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.101315" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.113799" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.113997" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.114181" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.114603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.114430" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.114414" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.114830" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.115003" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.115172" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.114362" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.114258" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.115400" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.115492" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:34.115611" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.053708" elapsed="0.061929"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.115850" elapsed="0.002188"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:34.119084" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.118802" elapsed="0.000310"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:34.119551" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.119268" elapsed="0.000311"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.119736" elapsed="0.000321"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.118358" elapsed="0.001758"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.118117" elapsed="0.002032"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.120333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.120175" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.118099" elapsed="0.002310"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:34.041681" elapsed="0.078790"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:34.040870" elapsed="0.079677"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.040629" elapsed="0.079963"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.040612" elapsed="0.080004"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.120650" elapsed="0.000027"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:33.903506" elapsed="0.217268"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:31.669241" elapsed="2.451590"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:34.121044" elapsed="0.002538"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:28.858517" elapsed="5.265132"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:28.769646" elapsed="5.354120"/>
</test>
<test id="s1-s16-t18" name="Odl_To_Play_intra_pe_distinguisher" line="126">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:34.126891" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:34.126625" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.128157" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.128046" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.128027" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.133339" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.133230" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.133212" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.134440" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.134032" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.134947" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:34.134653" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:34.135019" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:34.135174" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.133654" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.140841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.140732" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.140713" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.142069" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.141962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.141944" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:34.142645" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.142291" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.143055" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:34.142836" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.173772" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:34.143608" elapsed="0.030429"/>
</kw>
<msg time="2026-05-01T00:56:34.174516" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:34.174629" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.143245" elapsed="0.031464"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.202018" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "p "e "_ "d "i "s "t "i "n "g "u "i "s "h "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:34.175757" elapsed="0.026397"/>
</kw>
<msg time="2026-05-01T00:56:34.202332" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:34.202378" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.175144" elapsed="0.027269"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.202842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.202567" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.202535" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.203404" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "p "e "_ "d "i "s "t "i "n "g "u "i "s "h "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.203077" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.203788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.203566" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.203547" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:34.203905" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:34.206570" elapsed="0.000372"/>
</kw>
<msg time="2026-05-01T00:56:34.207010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.205498" elapsed="0.001650"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.207434" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.207813" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:34.204821" elapsed="0.003181"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:34.204240" elapsed="0.003827"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:34.141662" elapsed="0.066502"/>
</kw>
<msg time="2026-05-01T00:56:34.208257" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:34.208301" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.141064" elapsed="0.067273"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:34.208603" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:34.208490" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.208469" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.209107" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.209467" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.209541" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:34.140277" elapsed="0.069376"/>
</kw>
<msg time="2026-05-01T00:56:34.209747" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:34.209792" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.135642" elapsed="0.074188"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.210160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.209906" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.209889" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:34.135495" elapsed="0.074766"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:34.135251" elapsed="0.075042"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:34.132861" elapsed="0.077489"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:34.127758" elapsed="0.082650"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.127314" elapsed="0.083173"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:34.124433" elapsed="0.086109"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.211414" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/announce_intra_pe_distinguisher.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/announce_intra_pe_distinguisher.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.211653" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.211210" elapsed="0.000470"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:34.212052" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.211840" elapsed="0.000240"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.212436" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/withdraw_intra_pe_distinguisher.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/withdraw_intra_pe_distinguisher.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.212581" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.212245" elapsed="0.000363"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:34.212967" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.212766" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:34.213280" elapsed="0.002817"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.213065" elapsed="0.003078"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.213046" elapsed="0.003123"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.252737" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.252341" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.253596" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.253330" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.253771" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.252986" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.254352" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.253965" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.254709" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.254837" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.254572" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.255265" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.255024" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.256271" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.256011" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.256762" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.256494" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.257443" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.257148" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.258406" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.257992" elapsed="0.000440"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.258531" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:34.258689" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.257674" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.258870" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:34.257010" elapsed="0.002146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.259723" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.259407" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.260681" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.260256" elapsed="0.000452"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.260760" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:34.260913" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.259936" elapsed="0.001002"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.261093" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:34.259270" elapsed="0.002087"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.256839" elapsed="0.004554"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.261436" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:34.261610" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:34.255688" elapsed="0.005947"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.255377" elapsed="0.006292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.261847" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.261694" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.255358" elapsed="0.006599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.262731" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.262109" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.262811" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.251718" elapsed="0.011220"/>
</kw>
<msg time="2026-05-01T00:56:34.262993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.238852" elapsed="0.024189"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.275687" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.288088" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.300509" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.300709" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.300888" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.301254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.301107" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.301093" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.301495" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.301670" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.301839" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.301063" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.300962" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.302069" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.302144" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:34.302263" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.234377" elapsed="0.067913"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.327087" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.326709" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.327842" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.327633" elapsed="0.000273">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.327999" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.327283" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.328589" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.328192" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.328914" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.329047" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.328781" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.329488" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pe-distinguisher-labels-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.10.1&lt;/pe-address&gt;
                &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.20.2&lt;/pe-address&gt;
                &lt;mpls-label&gt;20028&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
        &lt;/pe-distinguisher-labels-attribute&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.329234" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:34.329908" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.329619" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.330428" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.330140" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.329991" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.329600" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.331161" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.330720" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.331241" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.326062" elapsed="0.005305"/>
</kw>
<msg time="2026-05-01T00:56:34.331472" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.313421" elapsed="0.018102"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.344089" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.356668" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.369062" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.369260" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.369437" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.369820" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.369673" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.369658" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.370042" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.370211" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.370378" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.369629" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.369526" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.370643" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.370721" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:34.370855" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.312564" elapsed="0.058321"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.372143" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.371903" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.372332" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.371562" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.372692" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.372428" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.373234" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.372945" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.372773" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.372410" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.375676" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.373486" elapsed="0.002217"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:34.375755" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:34.375908" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:34.371223" elapsed="0.004710"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.377474" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.377216" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.377910" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pe-distinguisher-labels-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.10.1&lt;/pe-address&gt;
                &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.20.2&lt;/pe-address&gt;
                &lt;mpls-label&gt;20028&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
        &lt;/pe-distinguisher-labels-attribute&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.377676" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.378361" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.378121" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.378861" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.378620" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:34.379721" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:34.379529" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:34.380073" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:34.379902" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.380249" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.380871" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.380628" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:34.380956" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:34.381111" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:34.379108" elapsed="0.002028"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:34.393674" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '1181', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;pe-distinguisher-labels-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.10.1&lt;/pe-address&gt;
                &lt;mpls-label&gt;20024&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
            &lt;pe-distinguisher-label-attribute&gt;
                &lt;pe-address&gt;10.10.20.2&lt;/pe-address&gt;
                &lt;mpls-label&gt;20028&lt;/mpls-label&gt;
            &lt;/pe-distinguisher-label-attribute&gt;
        &lt;/pe-distinguisher-labels-attribute&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:34.393798" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AQwAAQECAwQBAgoKCgo%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.393928" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:34.383488" elapsed="0.010467"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.381206" elapsed="0.012801"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.394220" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.394039" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.381188" elapsed="0.013124"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.402781" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.397258" elapsed="0.005623"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.396676" elapsed="0.006283"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.396633" elapsed="0.006385"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.405691" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.403389" elapsed="0.002347"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.403144" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.403107" elapsed="0.002689"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.406366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.405974" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.406737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.406479" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.407297" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.406989" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.406822" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.406460" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.407917" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.407556" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.408248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.408013" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.408925" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.408636" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.408471" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.407995" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.409161" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:34.409978" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.409685" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.410163" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:34.395532" elapsed="0.017013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:34.412727" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:56:34.412618" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.412600" elapsed="0.000333"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.413091" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.413160" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:34.415486" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:34.376269" elapsed="0.039246"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.415631" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:34.415793" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:34.221031" elapsed="0.194787"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.416169" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.415926" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.415908" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.416296" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:34.216420" elapsed="0.200004"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.419633" level="INFO">${update} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.417372" elapsed="0.002291"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.419840" elapsed="0.002247"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:34.422140" elapsed="0.000034"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:34.417098" elapsed="0.005173"/>
</kw>
<msg time="2026-05-01T00:56:34.422348" level="INFO">${update} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:34.416623" elapsed="0.005750"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.423348" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:56:34.423475" level="INFO">${len_1} = 174</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:34.423021" elapsed="0.000489"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.424082" level="INFO">Length is 174.</msg>
<msg time="2026-05-01T00:56:34.424186" level="INFO">${len_2} = 174</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:34.423730" elapsed="0.000489"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.424439" elapsed="0.000446"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.425366" level="INFO">${sum_1} = 2055</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:34.425108" elapsed="0.000294"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.425896" level="INFO">${sum_2} = 2055</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:34.425642" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.426147" elapsed="0.000465"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:34.422648" elapsed="0.004049"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:34.426913" elapsed="0.001959"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.472593" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.472204" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.473364" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.473117" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.473583" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.472784" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.474163" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.473774" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.474506" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.474684" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.474353" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.475110" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.474870" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.476305" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.476002" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.476807" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.476536" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.477643" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.477208" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.478815" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.478284" elapsed="0.000613"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.479035" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:34.479260" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.477864" elapsed="0.001422"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.479443" elapsed="0.000415"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:34.477063" elapsed="0.002836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.480580" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.480151" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.481699" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.481210" elapsed="0.000572"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.481920" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:34.482140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.480794" elapsed="0.001373"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.482322" elapsed="0.000444"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:34.480014" elapsed="0.002794"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.476887" elapsed="0.005956"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.482887" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:34.483046" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:34.475536" elapsed="0.007536"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.475226" elapsed="0.007879"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.483287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.483130" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.475208" elapsed="0.008155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.484084" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.483526" elapsed="0.000593"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.484167" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.471592" elapsed="0.012700"/>
</kw>
<msg time="2026-05-01T00:56:34.484381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.458995" elapsed="0.025436"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.496937" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.509270" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.521950" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.522162" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.522342" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.522779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.522618" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.522578" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.523004" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.523176" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.523344" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.522546" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.522422" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.523596" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.523675" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:34.523797" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.454645" elapsed="0.069179"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.524932" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.524683" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:34.534188" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.534235" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.534324" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:34.527170" elapsed="0.007180"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.525084" elapsed="0.009305"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.534594" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.534415" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.525066" elapsed="0.009653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.539301" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.535965" elapsed="0.003397"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.535657" elapsed="0.003754"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.535632" elapsed="0.003831"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.543055" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.539863" elapsed="0.003255"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.539549" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.539526" elapsed="0.003674"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.543970" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.543432" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.544437" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.544106" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.545218" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.544806" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.544572" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.544081" elapsed="0.001252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.546091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.545583" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.546576" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.546225" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.547356" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.546984" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.546749" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.546200" elapsed="0.001239"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.547609" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:34.548390" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.548116" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.548603" elapsed="0.002426"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:34.535080" elapsed="0.016012"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:34.551139" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:34.553382" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:34.524092" elapsed="0.029317"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.553512" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:34.430277" elapsed="0.123363"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.429696" elapsed="0.123999"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:34.429155" elapsed="0.124598"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.556668" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.554689" elapsed="0.002008"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.556873" elapsed="0.002085"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:34.559008" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:34.554378" elapsed="0.004756"/>
</kw>
<msg time="2026-05-01T00:56:34.559209" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:34.553920" elapsed="0.005314"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.560087" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:34.560162" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:34.559829" elapsed="0.000357"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.560610" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:34.560683" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:34.560341" elapsed="0.000365"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.560862" elapsed="0.000302"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.561519" level="INFO">${sum_1} = 1904</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:34.561321" elapsed="0.000224"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:34.561958" level="INFO">${sum_2} = 1904</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:34.561698" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:34.562141" elapsed="0.000301"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:34.559462" elapsed="0.003059"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.609781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.609373" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.610607" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.610319" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.610821" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.609982" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.611395" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.611012" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.611743" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.611900" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.611603" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.612380" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.612135" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.613445" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.613189" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.613936" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.613668" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.614930" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.614326" elapsed="0.000631"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.616093" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.615647" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.616258" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:34.616504" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.615150" elapsed="0.001380"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.616687" elapsed="0.000492"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:34.614189" elapsed="0.003032"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.617996" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.617488" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.619196" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.618744" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.619356" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:34.619599" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.618211" elapsed="0.001414"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.619780" elapsed="0.000485"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:34.617338" elapsed="0.003099"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.614015" elapsed="0.006474"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.620534" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:34.620692" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:34.612836" elapsed="0.007882"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.612520" elapsed="0.008229"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.620925" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.620775" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.612494" elapsed="0.008508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.621738" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.621147" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.621816" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.608701" elapsed="0.013240"/>
</kw>
<msg time="2026-05-01T00:56:34.621995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.595866" elapsed="0.026188"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.635198" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.647739" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.660195" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.660403" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.660604" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.660991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.660841" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.660825" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.661219" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.661390" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.661574" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.660793" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.660683" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.661803" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.661880" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:34.662013" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.590098" elapsed="0.071942"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.663245" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.662974" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:34.670847" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.670994" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:34.671152" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:34.671196" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.665434" elapsed="0.006386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:34.663360" elapsed="0.008573">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.672200" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.671981" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:34.663342" elapsed="0.008977">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.677167" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.673805" elapsed="0.003411">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:34.673492" elapsed="0.003812">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:34.673465" elapsed="0.003885">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.681196" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.677781" elapsed="0.003463">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:34.677465" elapsed="0.003868">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:34.677423" elapsed="0.003956">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.682197" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.681664" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.682727" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.682336" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.683499" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.683079" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.682845" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.682310" elapsed="0.001274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.684107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.683747" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.684438" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.684203" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.684991" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.684699" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.684535" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.684185" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.685229" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:34.686052" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.685763" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:34.688529" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.686235" elapsed="0.002327">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.672867" elapsed="0.015830">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:34.688791" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:34.691204" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:34.691239" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:34.662309" elapsed="0.028959">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.691334" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.563835" elapsed="0.127685">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.563219" elapsed="0.128365"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:34.562803" elapsed="0.128840"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:34.210839" elapsed="0.480856"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.124001" elapsed="0.567808"/>
</test>
<test id="s1-s16-t19" name="Play_To_Odl_intra_pe_distinguisher" line="130">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:34.694893" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:34.694612" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.696137" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.696027" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.696009" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.701299" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.701192" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.701174" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.702371" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.701988" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.702897" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:34.702575" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:34.702967" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:34.703122" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.701612" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.708651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.708543" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.708523" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.709905" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.709795" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.709777" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:34.710426" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.710123" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.710908" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:34.710637" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.739488" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:34.711439" elapsed="0.028152"/>
</kw>
<msg time="2026-05-01T00:56:34.739756" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:34.739803" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.711098" elapsed="0.028740"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:34.766690" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "p "e "_ "d "i "s "t "i "n "g "u "i "s "h "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:34.740358" elapsed="0.026503"/>
</kw>
<msg time="2026-05-01T00:56:34.767023" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:34.767069" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.740014" elapsed="0.027091"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.767419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.767184" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.767164" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.767981" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "p "e "_ "d "i "s "t "i "n "g "u "i "s "h "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.767673" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.768359" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.768141" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.768122" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:34.768487" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:34.771020" elapsed="0.000285"/>
</kw>
<msg time="2026-05-01T00:56:34.771367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.769958" elapsed="0.001566"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.771816" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.772179" elapsed="0.000257"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:34.769323" elapsed="0.003251"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:34.768786" elapsed="0.003854"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:34.709493" elapsed="0.063262"/>
</kw>
<msg time="2026-05-01T00:56:34.772847" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:34.772891" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.708875" elapsed="0.064051"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:34.773109" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:34.773002" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.772984" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.773609" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.773949" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.774020" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:34.708190" elapsed="0.065937"/>
</kw>
<msg time="2026-05-01T00:56:34.774219" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:34.774262" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.703532" elapsed="0.070766"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.774638" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.774372" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.774355" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:34.703371" elapsed="0.071393"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:34.703200" elapsed="0.071643"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:34.700830" elapsed="0.074074"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:34.695743" elapsed="0.079218"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:34.695306" elapsed="0.079701"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:34.692479" elapsed="0.082580"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.776174" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.775707" elapsed="0.000496"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.776851" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.776376" elapsed="0.000503"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.777422" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.777046" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.777831" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/announce_intra_pe_distinguisher.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/announce_intra_pe_distinguisher.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.778006" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.777629" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.778377" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/withdraw_intra_pe_distinguisher.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/withdraw_intra_pe_distinguisher.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.778526" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.778190" elapsed="0.000362"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:34.778707" elapsed="0.002604"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:34.781493" elapsed="0.001755"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.836644" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.836232" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.837521" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.837197" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.837699" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.836861" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.838275" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.837894" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.838621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:34.838813" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:34.838481" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.839329" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.839081" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.840409" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.840101" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.840905" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.840641" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.841754" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.841299" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.843039" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.842430" elapsed="0.000711"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.843222" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:34.843541" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.841976" elapsed="0.001592"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.843727" elapsed="0.000384"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:34.841160" elapsed="0.002993"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.844821" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:34.844405" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:34.846038" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.845502" elapsed="0.000637"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:34.846221" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:34.846540" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:34.845035" elapsed="0.001533"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:34.846721" elapsed="0.000389"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:34.844268" elapsed="0.002885"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.840986" elapsed="0.006203"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:34.847234" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:34.847391" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:34.839778" elapsed="0.007639"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.839464" elapsed="0.008001"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.847645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.847493" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.839428" elapsed="0.008293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.848642" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:34.847867" elapsed="0.000804"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:34.848722" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:34.835603" elapsed="0.013244"/>
</kw>
<msg time="2026-05-01T00:56:34.848901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:34.822877" elapsed="0.026073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.861519" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.874095" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.887442" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.887656" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.887833" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.888205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.888052" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.888038" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.888428" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.888614" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.888780" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:34.888009" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.887906" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.889008" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.889083" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:34.889204" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:34.818246" elapsed="0.070985"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.890514" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.890246" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.890670" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.889907" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.891050" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.890765" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.891687" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:34.891350" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.891164" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.890747" elapsed="0.001026"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.894101" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:34.891928" elapsed="0.002200"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:34.894179" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:34.894332" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:34.889581" elapsed="0.004776"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:34.895614" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.895360" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:34.895775" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:34.895027" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:34.896005" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:34.895871" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:34.895853" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.896241" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.896415" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.896498" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:34.898586" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:34.894686" elapsed="0.003927"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.900046" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.899799" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:34.900504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:34.900249" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:34.908309" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:34.908522" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:34.908661" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.902679" elapsed="0.006498">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:34.900616" elapsed="0.008678">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.909581" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.909341" elapsed="0.000373"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:34.900598" elapsed="0.009154">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.910286" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.910492" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:34.910419" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.910395" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.910790" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.910907" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.898962" elapsed="0.012101">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.911169" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.794348" elapsed="0.116967">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:34.911782" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:34.911523" elapsed="0.000359"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:34.911494" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:34.911964" elapsed="0.000019"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:34.788227" elapsed="0.123872">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.973444" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:36.973010" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:36.974297" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:36.974034" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:36.974484" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:36.973679" elapsed="0.000831"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.975069" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:36.974681" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:36.975404" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:36.975592" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:36.975261" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.976179" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:36.975880" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.977354" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:36.977039" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.977862" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:36.977588" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.978695" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:36.978262" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:36.980030" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:36.979389" elapsed="0.000758"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:36.980232" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:36.980558" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:36.978919" elapsed="0.001667"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:36.980747" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:36.978121" elapsed="0.003061"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.981861" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:36.981438" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:36.983115" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:36.982560" elapsed="0.000658"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:36.983298" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:36.983613" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:36.982079" elapsed="0.001562"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:36.983800" elapsed="0.000402"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:36.981299" elapsed="0.002946"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:36.977942" elapsed="0.006341"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:36.984328" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:36.984506" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:36.976701" elapsed="0.007832"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:36.976316" elapsed="0.008250"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:36.984754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:36.984596" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:36.976290" elapsed="0.008542"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:36.985831" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:36.984982" elapsed="0.000879"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:36.985912" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:36.972250" elapsed="0.013789"/>
</kw>
<msg time="2026-05-01T00:56:36.986094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:36.959135" elapsed="0.027012"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:36.999121" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.011925" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.024902" elapsed="0.000069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.025254" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.025473" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.025929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.025772" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.025753" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.026165" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.026366" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.026561" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.025710" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.025561" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.026800" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.026883" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:37.027056" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:36.954564" elapsed="0.072530"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.028825" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.028499" elapsed="0.000406">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.029001" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.027982" elapsed="0.001045"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.029377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.029102" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.030074" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.029767" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.029554" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.029083" elapsed="0.001077"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.032733" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.030321" elapsed="0.002441"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:37.032828" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:37.033020" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.027545" elapsed="0.005507"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.034467" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.034157" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.034647" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.033778" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:37.034895" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:37.034751" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.034729" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.035155" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.035337" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.035405" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:37.037731" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.033407" elapsed="0.004353"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.039281" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.039006" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.039786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.039532" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:37.048056" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:37.048623" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '492'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:37.048786" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:37.042148" elapsed="0.006668"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.039922" elapsed="0.008957"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.049170" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.048918" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.039897" elapsed="0.009390"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.053808" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.050580" elapsed="0.003400"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.050281" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.050248" elapsed="0.003826"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.058129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.054523" elapsed="0.003677"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.054160" elapsed="0.004095"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.054135" elapsed="0.004158"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.059211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.058606" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.059955" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.059395" elapsed="0.000663"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.060645" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.060316" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.060095" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.059361" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.061275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.060900" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.061634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.061374" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.062185" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.061884" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.061717" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.061356" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.062431" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:37.063271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.062972" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.063469" elapsed="0.002704"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:37.049759" elapsed="0.016486"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.066429" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:37.066319" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.066298" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.069708" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.066671" elapsed="0.003068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:37.069791" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:37.069962" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:37.038116" elapsed="0.031873"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.070054" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:37.070206" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:36.929684" elapsed="0.140547"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.099133" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.098622" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.100080" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.099726" elapsed="0.000505">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.100416" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.099346" elapsed="0.001095"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.101088" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.100634" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.101468" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.101735" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.101284" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.102204" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "pe-distinguisher-labels-attribute": {
            "pe-distinguisher-label-attribute": [
              {
                "pe-address": "10.10.10.1",
                "mpls-label": 20024
              },
              {
                "pe-address": "10.10.20.2",
                "mpls-label": 20028
              }
            ]
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.101931" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:37.102803" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.102343" elapsed="0.000521"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.103568" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.103042" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.102892" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.102319" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.104354" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.103806" elapsed="0.000578"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.104436" elapsed="0.000056"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.097930" elapsed="0.006666"/>
</kw>
<msg time="2026-05-01T00:56:37.104655" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.085018" elapsed="0.019686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.118868" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.131518" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.144159" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.144386" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.144596" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.145016" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.144860" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.144842" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.145249" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.145421" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.145610" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.144803" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.144681" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.145845" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.146074" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:37.146249" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.082240" elapsed="0.064037"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.146479" elapsed="0.002352"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.150190" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.149612" elapsed="0.000607"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.150914" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.150381" elapsed="0.000562"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.151105" elapsed="0.000336"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.149159" elapsed="0.002362"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.148913" elapsed="0.002643"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.151735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.151582" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.148894" elapsed="0.002968"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:37.071436" elapsed="0.080475"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:37.070605" elapsed="0.081420"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.070317" elapsed="0.081756"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.070300" elapsed="0.081798"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.152132" elapsed="0.000034"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:36.922931" elapsed="0.229337"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:34.783430" elapsed="2.368899"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.207927" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.207519" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.208801" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.208524" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.208982" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.208163" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.209592" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.209186" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.209932" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.210104" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.209787" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.210558" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.210295" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.211806" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.211400" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.212479" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.212103" elapsed="0.000405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.213334" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.212906" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.214645" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.214050" elapsed="0.000700"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.214836" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:56:37.215161" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.213580" elapsed="0.001608"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.215421" elapsed="0.000425"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:37.212760" elapsed="0.003129"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.216884" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.216421" elapsed="0.000491"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.218179" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.217610" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.218366" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:37.218695" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.217119" elapsed="0.001604"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.218881" elapsed="0.000378"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:37.216218" elapsed="0.003088"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.212569" elapsed="0.006774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.219389" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:37.219569" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:37.211006" elapsed="0.008590"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.210692" elapsed="0.008938"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.219813" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.219657" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.210663" elapsed="0.009230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.220901" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.220076" elapsed="0.000855"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.220980" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.206803" elapsed="0.014306"/>
</kw>
<msg time="2026-05-01T00:56:37.221164" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.193953" elapsed="0.027259"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.233897" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.246376" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.258764" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.259029" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.259211" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.259605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.259438" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.259422" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.259831" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.260015" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.260185" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.259391" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.259288" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.260584" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.260661" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:37.260786" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.189538" elapsed="0.071276"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.262097" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.261843" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.262259" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.261499" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.262625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.262357" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.263183" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.262891" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.262708" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.262339" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.265634" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.263419" elapsed="0.002243"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:37.265713" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:37.265868" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.261149" elapsed="0.004743"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.267116" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.266884" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.267275" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.266545" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:37.267523" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:37.267372" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.267354" elapsed="0.000294"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.267800" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.267976" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.268056" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:37.270141" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.266204" elapsed="0.003964"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.271594" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.271324" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.272074" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.271799" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:37.279720" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:37.279870" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '492'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:37.279987" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:37.274601" elapsed="0.005445"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.272188" elapsed="0.007904"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.280295" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.280119" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.272169" elapsed="0.008268"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.285301" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.281908" elapsed="0.003468"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.281595" elapsed="0.003829"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.281570" elapsed="0.003919"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.289096" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.285887" elapsed="0.003275"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.285571" elapsed="0.003639"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.285547" elapsed="0.003699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.290050" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.289510" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.290548" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.290187" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.291316" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.290900" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.290666" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.290162" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.292388" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.291859" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.292797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.292554" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.293349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.293052" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.292881" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.292535" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.293606" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:37.294421" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.294122" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.294628" elapsed="0.002305"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:37.280983" elapsed="0.016013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.297175" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:37.297067" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.297048" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.300277" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.297394" elapsed="0.002912"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:37.300359" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:37.300543" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:37.270505" elapsed="0.030066"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.300635" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:37.300790" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:37.165829" elapsed="0.134987"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.329359" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.328891" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.330211" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.329918" elapsed="0.000423">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.330539" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.329577" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.331179" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.330736" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.331549" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.331740" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.331372" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.332233" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "pe-distinguisher-labels-attribute": {
            "pe-distinguisher-label-attribute": [
              {
                "pe-address": "10.10.10.1",
                "mpls-label": 20024
              },
              {
                "pe-address": "10.10.20.2",
                "mpls-label": 20028
              }
            ]
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.331929" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:37.332830" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.332359" elapsed="0.000536"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.333599" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.333071" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.332920" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.332340" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.334320" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.333836" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.334399" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.328246" elapsed="0.006306"/>
</kw>
<msg time="2026-05-01T00:56:37.334611" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.315567" elapsed="0.019093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.347238" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.359570" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.372118" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.372429" elapsed="0.000039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.372639" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.373217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.373057" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.373038" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.373472" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.373647" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.373818" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.372994" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.372834" elapsed="0.001067"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.374052" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.374135" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:37.374333" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.312927" elapsed="0.061436"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.374738" elapsed="0.002378"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.378744" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.377951" elapsed="0.000822"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.379440" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.378932" elapsed="0.000553"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.379646" elapsed="0.000340"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.377505" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.377200" elapsed="0.002910"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.380290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.380138" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.377180" elapsed="0.003188"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:37.301958" elapsed="0.078459"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:37.301144" elapsed="0.079368"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.300901" elapsed="0.079658"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.300884" elapsed="0.079700"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.380622" elapsed="0.000036"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:37.158545" elapsed="0.222224"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:37.152525" elapsed="0.228308"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.431920" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.431332" elapsed="0.000633"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.433145" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.432783" elapsed="0.000471">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.433385" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.432258" elapsed="0.001160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.434070" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.433669" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.434413" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.434604" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.434267" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.435064" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.434811" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.436293" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.435953" elapsed="0.000390"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.436838" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.436544" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.437703" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.437254" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.438986" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.438397" elapsed="0.000697"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.439178" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:37.439516" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.437929" elapsed="0.001616"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.439709" elapsed="0.000450"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:37.437112" elapsed="0.003091"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.440926" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.440478" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.442239" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.441673" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.442425" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:56:37.442782" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.441148" elapsed="0.001662"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.442969" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:37.440324" elapsed="0.003072"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.436922" elapsed="0.006511"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.443496" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:37.443661" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:37.435606" elapsed="0.008139"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.435202" elapsed="0.008579"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.443972" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.443811" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.435175" elapsed="0.008876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.445111" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.444220" elapsed="0.000921"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.445195" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.430347" elapsed="0.014982"/>
</kw>
<msg time="2026-05-01T00:56:37.445387" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.416766" elapsed="0.028677"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.458225" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.470710" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.483168" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.483375" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.483574" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.483969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.483817" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.483801" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.484233" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.484412" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.484601" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.483767" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.483655" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.484839" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.484969" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:37.485102" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.412328" elapsed="0.072802"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.486515" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.486220" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.486691" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.485851" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.487047" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.486790" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.487642" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.487323" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.487131" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.486772" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.490152" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.487886" elapsed="0.002294"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:37.490234" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:37.490396" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.485499" elapsed="0.004923"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.491758" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.491426" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.491936" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.491083" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:37.492206" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:56:37.492035" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.492015" elapsed="0.000281"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.492469" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.492650" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.492718" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:37.494837" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.490755" elapsed="0.004110"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.496330" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.496037" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.496798" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.496552" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:37.504509" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:37.504697" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '492'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:37.504816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:37.499009" elapsed="0.005834"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.496911" elapsed="0.007974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.505070" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.504912" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.496892" elapsed="0.008262"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.509966" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.506590" elapsed="0.003445"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.506258" elapsed="0.003824"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.506233" elapsed="0.003884"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.513852" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.510529" elapsed="0.003390"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.510195" elapsed="0.003773"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.510172" elapsed="0.003832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.514845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.514240" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.515333" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.514990" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.516169" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.515705" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.515469" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.514963" elapsed="0.001338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.517071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.516555" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.517528" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.517209" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.518076" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.517778" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.517612" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.517184" elapsed="0.000976"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.518313" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:37.519142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.518846" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.519331" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:37.505675" elapsed="0.016053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.521908" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:37.521801" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.521782" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.525135" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.522176" elapsed="0.003021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:37.525252" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:37.525415" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:37.495198" elapsed="0.030244"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.525525" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:37.525679" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:37.389777" elapsed="0.135929"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.554252" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.553782" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.555099" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.554819" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.555394" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.554478" elapsed="0.000942"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.556043" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.555606" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.556415" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.556590" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.556254" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.557038" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "multi-exit-disc": {
            "med": 0
          },
          "pe-distinguisher-labels-attribute": {
            "pe-distinguisher-label-attribute": [
              {
                "pe-address": "10.10.10.1",
                "mpls-label": 20024
              },
              {
                "pe-address": "10.10.20.2",
                "mpls-label": 20028
              }
            ]
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.556774" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:37.557597" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.557158" elapsed="0.000502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.558337" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.557835" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.557686" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.557138" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.559076" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.558588" elapsed="0.000552"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.559193" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.553140" elapsed="0.006186"/>
</kw>
<msg time="2026-05-01T00:56:37.559385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.540296" elapsed="0.019138"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.572279" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.584824" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.597649" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.597857" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.598041" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.598577" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.598296" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.598279" elapsed="0.000383"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.598807" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.598981" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.599151" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.598242" elapsed="0.000964"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.598126" elapsed="0.001109"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.599383" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.599477" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:37.599631" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "ipv4-next-hop": {
            ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.537627" elapsed="0.062032"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.599880" elapsed="0.002299"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.603560" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.602960" elapsed="0.000630"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.604318" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "127.1.1.1"
     },
     "local-pref": {
      "pref": 100
     },
     "multi...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.603748" elapsed="0.000600"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.604529" elapsed="0.000358"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:37.602534" elapsed="0.002416"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.602264" elapsed="0.002721"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.605166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.605012" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.602244" elapsed="0.003002"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:37.526839" elapsed="0.078457"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:37.526030" elapsed="0.079345"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.525789" elapsed="0.079634"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.525772" elapsed="0.079692"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.605503" elapsed="0.000032"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:37.385391" elapsed="0.220249"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:37.381064" elapsed="0.224641"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:37.605877" elapsed="0.002544"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.658198" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.657811" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.658994" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.658746" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.659163" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.658393" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.659752" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.659353" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.660077" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.660234" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.659941" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.660735" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.660487" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.661786" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.661499" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.662266" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.661994" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.663087" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.662686" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.664363" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.663778" elapsed="0.000701"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.664559" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:37.664857" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.663305" elapsed="0.001578"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.665042" elapsed="0.000383"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:37.662546" elapsed="0.002936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.666131" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.665734" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:37.667350" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.666811" elapsed="0.000655"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:37.667546" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:37.667838" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:37.666344" elapsed="0.001520"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.668019" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:37.665597" elapsed="0.002845"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.662347" elapsed="0.006147"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:37.668540" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:37.668698" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:37.661159" elapsed="0.007565"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.660853" elapsed="0.007903"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.668932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.668781" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.660832" elapsed="0.008175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.671073" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.669152" elapsed="0.001950"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.671152" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.657176" elapsed="0.014102"/>
</kw>
<msg time="2026-05-01T00:56:37.671332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.644529" elapsed="0.026856"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.683973" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.696443" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.708800" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.708999" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.709175" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.709559" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.709396" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.709382" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.709784" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.709954" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.710122" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.709353" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.709250" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.710349" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.710425" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:37.710560" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.639989" elapsed="0.070597"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.712015" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.711765" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.712181" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.711274" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.712602" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.712322" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.713172" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.712873" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.712690" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.712302" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.715605" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.713415" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:37.715686" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:37.715884" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.710909" elapsed="0.005003"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.717146" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.716957" elapsed="0.000244"/>
</kw>
<msg time="2026-05-01T00:56:37.717293" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.716614" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.717551" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:37.717393" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.717374" elapsed="0.000249"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.717942" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.718076" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.717773" elapsed="0.000329"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:37.718516" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.718262" elapsed="0.000281"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:37.718592" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:37.718750" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:37.716223" elapsed="0.002553"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.720196" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.719944" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.720672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.720417" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:37.728436" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:37.729013" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '637'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:37.729141" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:37.723041" elapsed="0.006129"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.720782" elapsed="0.008436"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.729433" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.729248" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.720764" elapsed="0.008777"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.733215" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"pe-distinguisher-labels-attribute":{"pe-distinguisher-label-attribute":[{"mpls-label":20024,"pe-address":"10.10.10.1"},{"mpls-label":20028,"pe-address":"10.10.20.2"}]},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"}},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.730660" elapsed="0.002623"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.730404" elapsed="0.003032"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.730385" elapsed="0.003116"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.737969" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.733916" elapsed="0.004144"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.733588" elapsed="0.004535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.733563" elapsed="0.004601"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.739225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.738486" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.739822" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.739404" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.740816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.740238" elapsed="0.000622"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.739948" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.739372" elapsed="0.001580"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.741630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.741200" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.741976" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.741733" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.742549" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.742225" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.742060" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.741715" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.742806" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:37.743714" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.743377" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:37.743902" elapsed="0.002405"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:37.729939" elapsed="0.016448"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.746597" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:37.746479" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.746445" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.749883" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.746829" elapsed="0.003085"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:37.749967" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:37.750145" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:37.719088" elapsed="0.031085"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.750240" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:37.750396" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:37.617365" elapsed="0.133058"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.779165" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.778686" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.780053" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.779741" elapsed="0.000443">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:37.780399" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:37.779368" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.781085" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:37.780624" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:37.781462" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:37.781632" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:37.781282" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.782095" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:37.781822" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:37.782643" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.782215" elapsed="0.000491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.783395" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:37.782883" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:37.782732" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:37.782194" elapsed="0.001306"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.784152" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:37.783653" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:37.784235" elapsed="0.000056"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:37.778042" elapsed="0.006365"/>
</kw>
<msg time="2026-05-01T00:56:37.784489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.765191" elapsed="0.019353"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.797652" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.810208" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.823056" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.823264" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.823446" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.823860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.823709" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:37.823694" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.824085" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.824255" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.824466" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:37.823661" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.823542" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.824699" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.824776" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:37.824901" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:37.762518" elapsed="0.062411"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:37.825108" elapsed="0.002207"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.828406" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.828080" elapsed="0.000355"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:37.829274" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:37.828609" elapsed="0.000694"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:37.829804" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       },
       "pe-distinguisher-labels-attribute": {
        "pe-distinguisher-label-attribute": [
         {
          "mpls-label": 20024,
          "pe-address": "10.10.10.1"
         },
         {
          "mpls-label": 20028,
          "pe-address": "10.10.20.2"
         }
        ]
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "10.10.10.10",
       "route-distinguisher": "1.2.3.4:258"
      },
      "path-id": 0,
      "route-key": "AQwAAQECAwQBAgoKCgo="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:37.830042" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       },
+       "pe-distinguisher-labels-attribute": {
+        "pe-distinguisher-label-attribute": [
+         {
+          "mpls-label": 20024,
+          "pe-address": "10.10.10.1"
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.829485" elapsed="0.000669">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.827658" elapsed="0.002672">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:37.827395" elapsed="0.003028">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:37.830633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:37.830477" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:37.827376" elapsed="0.003337">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.751627" elapsed="0.079236">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.750789" elapsed="0.080246">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:37.750527" elapsed="0.080610">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:37.750510" elapsed="0.080688">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:37.831252" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:37.613006" elapsed="0.218398">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,44 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
    [ Message content over the limit has been removed. ]
+         },
+         {
+          "mpls-label": 20028,
+          "pe-address": "10.10.20.2"
+         }
+        ]
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.886361" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:39.885961" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:39.887204" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:39.886938" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:39.887378" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:39.886595" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.887981" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:39.887590" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:39.888320" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:39.888503" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:39.888175" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.888961" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.888696" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.890106" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.889788" elapsed="0.000365"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.890617" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.890320" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.891436" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:39.891017" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:39.892737" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.892147" elapsed="0.000702"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:39.892932" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:39.893243" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:39.891680" elapsed="0.001591"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.893434" elapsed="0.000443"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:39.890874" elapsed="0.003097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.894678" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:39.894236" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:39.895948" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.895360" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:39.896132" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:39.896431" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:39.894899" elapsed="0.001563"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.896639" elapsed="0.000390"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:39.894095" elapsed="0.002979"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:39.890698" elapsed="0.006438"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:39.897183" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:39.897347" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:39.889403" elapsed="0.007971"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.889087" elapsed="0.008319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.897606" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.897432" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.889064" elapsed="0.008623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.898647" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:39.897853" elapsed="0.000823"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:39.898727" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:39.885281" elapsed="0.013574"/>
</kw>
<msg time="2026-05-01T00:56:39.898910" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:39.872423" elapsed="0.026537"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.913132" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.925592" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.938119" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.938335" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.938599" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.939014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.938860" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:39.938842" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.939264" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.939436" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.939621" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:39.938806" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:39.938682" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.939853" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:39.939932" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:39.940073" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:39.868168" elapsed="0.071932"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:39.941471" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:39.941191" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:39.941654" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:39.940806" elapsed="0.000873"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.942008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.941751" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.942582" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:39.942272" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.942090" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.941733" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.944997" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:39.942818" elapsed="0.002207"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:39.945077" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:39.945231" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:39.940438" elapsed="0.004818"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:39.946438" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:39.946249" elapsed="0.000260"/>
</kw>
<msg time="2026-05-01T00:56:39.946608" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:39.945911" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:39.946840" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:39.946703" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.946685" elapsed="0.000225"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:39.947230" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:39.947415" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:39.947061" elapsed="0.000386"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:39.947888" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:39.947646" elapsed="0.000268"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:39.947962" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:39.948117" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:39.945585" elapsed="0.002558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.949742" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.949493" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.950178" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.949942" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:39.957487" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:39.957623" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:39.957719" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:39.952596" elapsed="0.005149"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.950287" elapsed="0.007501"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.957973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.957815" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.950269" elapsed="0.007791"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.962079" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.959092" elapsed="0.003057"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.958869" elapsed="0.003331"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.958851" elapsed="0.003387"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.966205" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:39.962683" elapsed="0.003591"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.962322" elapsed="0.004003"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.962298" elapsed="0.004064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.967195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:39.966637" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.967715" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.967338" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.968587" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:39.968081" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.967837" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.967312" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.969461" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:39.968949" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:39.969812" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:39.969574" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:39.970347" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:39.970058" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.969893" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.969556" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:39.970643" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:39.971451" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:39.971154" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:39.971649" elapsed="0.002290"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:39.958430" elapsed="0.015573"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:39.974178" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:39.974073" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.974055" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:39.977035" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:39.974399" elapsed="0.002665"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:39.977117" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:39.977275" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:39.948639" elapsed="0.028662"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:39.977365" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:39.977537" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:39.845507" elapsed="0.132058"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.005730" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.005239" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.006545" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.006258" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.006845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.005924" elapsed="0.000946"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.007501" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.007039" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.007853" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.007989" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.007696" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.008440" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.008176" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:40.009017" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.008578" elapsed="0.000500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.009809" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.009254" elapsed="0.000583"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.009103" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.008559" elapsed="0.001336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.010548" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.010046" elapsed="0.000531"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.010627" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.004626" elapsed="0.006129"/>
</kw>
<msg time="2026-05-01T00:56:40.010808" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:39.992041" elapsed="0.018816"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.023293" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.035672" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.048342" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.048572" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.048754" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.049130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.048983" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.048969" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.049364" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.049551" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.049733" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.048939" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.048832" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.049963" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.050081" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:40.050213" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:39.989403" elapsed="0.060838"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.050420" elapsed="0.002241"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:40.053731" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.053414" elapsed="0.000345"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:40.054194" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.053915" elapsed="0.000307"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.054378" elapsed="0.000380"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.052993" elapsed="0.001828"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.052741" elapsed="0.002112"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.055037" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.054878" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.052723" elapsed="0.002391"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:39.978709" elapsed="0.076482"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:39.977894" elapsed="0.077374"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:39.977651" elapsed="0.077662"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:39.977634" elapsed="0.077702"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.055370" elapsed="0.000029"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:39.839431" elapsed="0.216085"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:37.608648" elapsed="2.446928"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:40.055797" elapsed="0.002977"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:34.775313" elapsed="5.283524"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:34.692028" elapsed="5.366932"/>
</test>
<test id="s1-s16-t20" name="Odl_To_Play_intra_vrf" line="134">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:40.063109" elapsed="0.000318"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:40.062720" elapsed="0.000820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.064975" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.064816" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.064788" elapsed="0.000285"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.071270" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.071162" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.071145" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.072441" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.072039" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.072954" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:40.072658" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:40.073026" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:40.073184" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.071633" elapsed="0.001590"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.078932" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.078824" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.078806" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.080203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.080093" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.080062" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:40.080749" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.080421" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.081160" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:40.080942" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.115987" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:40.081726" elapsed="0.034455"/>
</kw>
<msg time="2026-05-01T00:56:40.116398" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:40.116452" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.081349" elapsed="0.035164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.134261" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "v "r "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:40.117165" elapsed="0.017245"/>
</kw>
<msg time="2026-05-01T00:56:40.134639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:40.134687" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.116748" elapsed="0.017977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.135120" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.134829" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.134800" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.135725" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "v "r "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.135355" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.136087" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.135864" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.135845" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:40.136204" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:40.138853" elapsed="0.000360"/>
</kw>
<msg time="2026-05-01T00:56:40.139277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.137783" elapsed="0.001658"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.139754" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.140174" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:40.137111" elapsed="0.003257"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:40.136546" elapsed="0.003887"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:40.079755" elapsed="0.060799"/>
</kw>
<msg time="2026-05-01T00:56:40.140649" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:40.140694" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.079156" elapsed="0.061578"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:40.140925" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:40.140814" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.140794" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.141443" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.141808" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.141879" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:40.078477" elapsed="0.063510"/>
</kw>
<msg time="2026-05-01T00:56:40.142077" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:40.142121" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.073615" elapsed="0.068577"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.142558" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.142269" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.142251" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:40.073455" elapsed="0.069210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:40.073279" elapsed="0.069419"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:40.070789" elapsed="0.071966"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:40.064365" elapsed="0.078447"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.063761" elapsed="0.079096"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:40.059827" elapsed="0.083086"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.143890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/announce_intra_vrf.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/announce_intra_vrf.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.144097" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.143681" elapsed="0.000443"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:40.144519" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.144285" elapsed="0.000262"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.144897" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/withdraw_intra_vrf.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/withdraw_intra_vrf.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.145022" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.144707" elapsed="0.000341"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:40.145408" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.145203" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:40.145785" elapsed="0.002926"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.145564" elapsed="0.003185"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.145545" elapsed="0.003230"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.182889" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.182513" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.183715" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.183417" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.183892" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.183083" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.184477" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.184086" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.184821" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.184956" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.184685" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.185388" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.185144" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.186403" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.186146" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.186896" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.186630" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.187601" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.187285" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.188612" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.188157" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.188691" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:40.188847" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.187836" elapsed="0.001037"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.189031" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:40.187147" elapsed="0.002163"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.189875" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.189578" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.190830" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.190407" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.190909" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:40.191062" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.190089" elapsed="0.000998"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.191240" elapsed="0.000227"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:40.189423" elapsed="0.002134"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.186974" elapsed="0.004622"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.191642" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:40.191800" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:40.185821" elapsed="0.006005"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.185522" elapsed="0.006363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.192064" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.191912" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.185502" elapsed="0.006640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.194383" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.192288" elapsed="0.002125"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.194467" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.181877" elapsed="0.012734"/>
</kw>
<msg time="2026-05-01T00:56:40.194667" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.169025" elapsed="0.025691"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.207273" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.222437" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.235492" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.235768" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.235989" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.236465" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.236273" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.236254" elapsed="0.000313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.236720" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.236895" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.237065" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.236213" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.236081" elapsed="0.001066"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.237361" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.237458" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:40.237616" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:40.164765" elapsed="0.072878"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.262781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.262345" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.263579" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.263320" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.263749" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.262980" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.264362" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.263956" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.264715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.264874" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.264574" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.265326" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.265069" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:40.265782" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.265463" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.266386" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.266050" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.265881" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.265441" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.267224" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.266713" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.267346" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.261693" elapsed="0.005807"/>
</kw>
<msg time="2026-05-01T00:56:40.267572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.248834" elapsed="0.018789"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.280385" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.292956" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.305368" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.305582" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.305764" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.306136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.305989" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.305975" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.306360" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.306549" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.306720" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.305946" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.305840" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.306949" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.307023" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:40.307161" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:40.247927" elapsed="0.059262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.308597" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.308296" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.308756" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.307948" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.309099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.308850" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.309678" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.309364" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.309179" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.308832" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.312112" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.309914" elapsed="0.002225"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:40.312190" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:40.312345" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:40.307583" elapsed="0.004787"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.313919" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.313674" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.314354" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.314120" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.314828" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.314585" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.315265" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.315025" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:40.316194" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:40.315947" elapsed="0.000275"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:40.316584" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:40.316388" elapsed="0.000222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.316762" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.317375" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.317130" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:40.317463" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:56:40.317636" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:40.315536" elapsed="0.002124"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:40.329644" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '1171', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:40.329785" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AQwAAQECAwQBAgoKCgo%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:40.329938" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:40.320000" elapsed="0.009974"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.317731" elapsed="0.012307"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.330294" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.330075" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.317713" elapsed="0.012705"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.335322" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.331898" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.331587" elapsed="0.003844"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.331562" elapsed="0.003910"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.339107" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.335887" elapsed="0.003283"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.335574" elapsed="0.003645"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.335551" elapsed="0.003703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.340046" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.339511" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.340549" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.340183" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.341358" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.340897" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.340665" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.340158" elapsed="0.001349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.342038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.341676" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.342371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.342134" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.342927" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.342635" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.342455" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.342116" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.343161" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:40.343983" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.343695" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.344166" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:40.330954" elapsed="0.015618"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:40.346754" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:56:40.346646" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.346628" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.347001" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.347069" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:40.349435" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:40.312728" elapsed="0.036735"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.349592" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:40.349752" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:40.153584" elapsed="0.196193"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.350128" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.349882" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.349865" elapsed="0.000355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.350254" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:40.149038" elapsed="0.201341"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.353922" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.351326" elapsed="0.002626"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.354132" elapsed="0.002268"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:40.356457" elapsed="0.000042"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:40.351048" elapsed="0.005551"/>
</kw>
<msg time="2026-05-01T00:56:40.356675" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:40.350574" elapsed="0.006126"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.357602" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:40.357681" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:40.357283" elapsed="0.000421"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.358114" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:40.358188" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:40.357860" elapsed="0.000351"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.358369" elapsed="0.000462"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.359306" level="INFO">${sum_1} = 1291</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:40.359051" elapsed="0.000290"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.359833" level="INFO">${sum_2} = 1291</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:40.359580" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.360084" elapsed="0.000443"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:40.356920" elapsed="0.003690"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:40.360824" elapsed="0.003548"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.410578" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.410187" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.411337" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.411102" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.411582" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.410771" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.412165" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.411778" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.412510" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.412656" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.412357" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.413086" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.412842" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.414316" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.414005" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.414833" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.414556" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.415702" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.415228" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.416841" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.416343" elapsed="0.000579"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.417059" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:40.417286" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.415923" elapsed="0.001389"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.417473" elapsed="0.000417"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:40.415090" elapsed="0.002841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.418633" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.418184" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.419801" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.419271" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.420026" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:40.420250" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.418849" elapsed="0.001427"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.420437" elapsed="0.000421"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:40.418048" elapsed="0.002851"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.414912" elapsed="0.006023"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.420979" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:40.421138" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:40.413519" elapsed="0.007644"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.413200" elapsed="0.007996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.421373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.421221" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.413181" elapsed="0.008271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.422178" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.421615" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.422254" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.409574" elapsed="0.012806"/>
</kw>
<msg time="2026-05-01T00:56:40.422475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.396892" elapsed="0.025662"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.435022" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.447410" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.459839" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.460037" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.460212" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.460606" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.460436" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.460421" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.460830" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.460999" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.461183" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.460391" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.460286" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.461412" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.461505" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:40.461628" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:40.392491" elapsed="0.069164"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.462760" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.462510" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:40.471693" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:40.471777" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:40.471884" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:40.465105" elapsed="0.006812"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.462872" elapsed="0.009085"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.472159" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.471984" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.462854" elapsed="0.009390"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.476234" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.473270" elapsed="0.003026"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.473040" elapsed="0.003305"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.473022" elapsed="0.003358"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.480071" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.476803" elapsed="0.003333"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.476464" elapsed="0.003720"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.476436" elapsed="0.003784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.481068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.480496" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.481567" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.481203" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.482376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.481960" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.481682" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.481178" elapsed="0.001317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.483020" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.482660" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.483351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.483115" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.483910" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.483618" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.483433" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.483097" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.484144" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:40.484956" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.484674" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.485137" elapsed="0.002415"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:40.472636" elapsed="0.014982"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:40.487664" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:40.489933" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:40.461925" elapsed="0.028065"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.490048" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:40.365897" elapsed="0.124276"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.365216" elapsed="0.125011"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:40.364673" elapsed="0.125613"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.493866" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.491214" elapsed="0.002681"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.494116" elapsed="0.002100"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:40.496266" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:40.490943" elapsed="0.005454"/>
</kw>
<msg time="2026-05-01T00:56:40.496487" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:40.490456" elapsed="0.006059"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.497354" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:40.497429" level="INFO">${len_1} = 150</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:40.497092" elapsed="0.000364"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.497883" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:40.497957" level="INFO">${len_2} = 150</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:40.497632" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.498137" elapsed="0.000370"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.498852" level="INFO">${sum_1} = 1140</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:40.498668" elapsed="0.000209"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:40.499206" level="INFO">${sum_2} = 1140</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:40.499029" elapsed="0.000202"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:40.499397" elapsed="0.000468"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:40.496730" elapsed="0.003219"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.547466" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.547055" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.548422" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.548100" elapsed="0.000421">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.548629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.547748" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.549277" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.548875" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.549641" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.549806" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.549494" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.550241" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.549995" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.551339" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.551081" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.551869" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.551569" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.552953" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.552348" elapsed="0.000632"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.554140" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.553687" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.554308" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:40.554564" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.553180" elapsed="0.001411"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.554754" elapsed="0.000520"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:40.552205" elapsed="0.003112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.556213" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.555591" elapsed="0.000658"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.557654" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.557187" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.557812" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:40.558038" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.556528" elapsed="0.001537"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.558224" elapsed="0.000579"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:40.555434" elapsed="0.003414"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.552021" elapsed="0.006863"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.558928" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:40.559090" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:40.550721" elapsed="0.008394"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.550368" elapsed="0.008779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.559341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.559174" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.550343" elapsed="0.009077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.560274" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.559593" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.560358" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.546360" elapsed="0.014157"/>
</kw>
<msg time="2026-05-01T00:56:40.560573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.532179" elapsed="0.028458"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.574702" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.587184" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.599793" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.600004" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.600192" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.600602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.600431" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.600415" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.600832" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.601004" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.601173" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.600380" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.600270" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.601437" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.601534" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:40.601673" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:40.527700" elapsed="0.074000"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.602899" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.602618" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:40.610056" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:40.610205" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:40.610347" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:40.610395" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.605080" elapsed="0.005783">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:40.603016" elapsed="0.007928">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.611145" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.610986" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:40.602998" elapsed="0.008282">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.615204" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.612345" elapsed="0.002907">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:40.612121" elapsed="0.003219">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:40.612103" elapsed="0.003283">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.619200" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.615842" elapsed="0.003406">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:40.615522" elapsed="0.003813">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:40.615495" elapsed="0.003887">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.620286" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.619683" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.620824" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.620452" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.621628" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.621182" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.620947" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.620422" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.622539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.622034" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.622876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.622637" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.623413" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.623121" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.622956" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.622619" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.623673" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:40.624515" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.624189" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:40.626968" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.624701" elapsed="0.002299">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.611684" elapsed="0.015458">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:40.627208" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:40.629586" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:40.629616" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:40.601971" elapsed="0.027673">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.629763" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.501688" elapsed="0.128251">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.500837" elapsed="0.129168"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:40.500265" elapsed="0.129802"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:40.143211" elapsed="0.486909"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.059177" elapsed="0.571088"/>
</test>
<test id="s1-s16-t21" name="Play_To_Odl_intra_vrf" line="138">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:40.633637" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:40.633345" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.634993" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.634873" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.634852" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.640128" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.640021" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.640003" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.641222" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.640832" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.641724" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:40.641412" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:40.641795" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:40.641954" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.640433" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.647569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.647442" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.647422" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.648848" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.648742" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.648724" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:40.649380" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.649068" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.649818" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:40.649592" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.682059" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:40.650345" elapsed="0.031958"/>
</kw>
<msg time="2026-05-01T00:56:40.682594" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:40.682657" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.650008" elapsed="0.032698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:40.706230" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "v "r "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:40.683885" elapsed="0.022546"/>
</kw>
<msg time="2026-05-01T00:56:40.706674" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:40.706801" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.683018" elapsed="0.023824"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.707259" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.706951" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.706920" elapsed="0.000423"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.707876" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "v "r "f "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.707511" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.708236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.708015" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.707997" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:40.708352" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:40.711046" elapsed="0.000170"/>
</kw>
<msg time="2026-05-01T00:56:40.711279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.709960" elapsed="0.001456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.711720" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.712057" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:40.709282" elapsed="0.002960"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:40.708714" elapsed="0.003592"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:40.648408" elapsed="0.064017"/>
</kw>
<msg time="2026-05-01T00:56:40.712548" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:40.712594" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.647794" elapsed="0.064841"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:40.712882" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:56:40.712762" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.712740" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.713397" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.713762" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.713834" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:40.647101" elapsed="0.066841"/>
</kw>
<msg time="2026-05-01T00:56:40.714035" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:40.714079" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.642365" elapsed="0.071755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.714452" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.714196" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.714179" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:40.642217" elapsed="0.072362"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:40.642038" elapsed="0.072574"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:40.639662" elapsed="0.075006"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:40.634570" elapsed="0.080154"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:40.634078" elapsed="0.080739"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:40.630991" elapsed="0.083882"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.716085" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.715604" elapsed="0.000509"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.716751" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.716281" elapsed="0.000499"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.717361" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.716980" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.717774" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/announce_intra_vrf.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/announce_intra_vrf.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.717940" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.717569" elapsed="0.000397"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.718310" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/withdraw_intra_vrf.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/withdraw_intra_vrf.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.718435" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.718123" elapsed="0.000340"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:40.718643" elapsed="0.005144"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:40.724061" elapsed="0.001949"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.784051" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.783655" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.784904" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.784624" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.785075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.784267" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.785679" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.785269" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.786012" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:40.786180" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:40.785872" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.786634" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.786367" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.787750" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.787410" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.788286" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.788016" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.789142" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.788735" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.790397" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.789842" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.790599" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:40.790903" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.789363" elapsed="0.001567"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.791119" elapsed="0.000401"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:40.788593" elapsed="0.002969"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.793831" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:40.791817" elapsed="0.002042"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:40.795078" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.794534" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:40.795277" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:40.795604" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:40.794056" elapsed="0.001575"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:40.795790" elapsed="0.000369"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:40.791680" elapsed="0.004521"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.788366" elapsed="0.007872"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:40.796283" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:40.796443" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:40.787083" elapsed="0.009389"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.786758" elapsed="0.009775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.796714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.796559" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.786735" elapsed="0.010056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.797602" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:40.796936" elapsed="0.000696"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:40.797682" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:40.783017" elapsed="0.014792"/>
</kw>
<msg time="2026-05-01T00:56:40.797865" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:40.770206" elapsed="0.027707"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.810576" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.823010" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.835427" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.835639" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.835816" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.836182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.836037" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.836023" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.836419" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.836604" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.836774" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:40.835993" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.835890" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.837001" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.837077" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:40.837198" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:40.765665" elapsed="0.071559"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.838500" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.838234" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.838660" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.837892" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.839001" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.838755" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.839586" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:40.839262" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.839082" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.838736" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.842193" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:40.839822" elapsed="0.002398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:40.842271" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:40.842427" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:40.837567" elapsed="0.004932"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:40.843733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.843493" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:40.843890" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:40.843140" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:40.844120" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:40.843985" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:40.843966" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.844352" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.844542" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.844609" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:40.846552" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:40.842815" elapsed="0.003763"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.847966" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.847720" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:40.848406" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:40.848167" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:40.856357" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:40.856522" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:40.856632" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.850662" elapsed="0.006340">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:40.848533" elapsed="0.008586">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.857310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.857153" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:40.848514" elapsed="0.008885">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.857792" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.857930" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:40.857888" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.857871" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.858280" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.858378" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.846890" elapsed="0.011662">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.858660" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.739230" elapsed="0.119565">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:40.859182" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:40.858926" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:40.858903" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:40.859364" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:40.732952" elapsed="0.126569">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.914822" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:42.914405" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:42.915663" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:42.915367" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:42.915837" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:42.915031" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.916411" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:42.916028" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:42.916775" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:42.917003" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:42.916633" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.917441" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.917194" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.918569" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.918221" elapsed="0.000396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.919056" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:42.918785" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.919991" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:42.919576" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:42.921280" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:42.920721" elapsed="0.000664"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:42.921481" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:42.921790" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:42.920212" elapsed="0.001605"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:42.921976" elapsed="0.000394"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:42.919413" elapsed="0.002999"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.923262" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:42.922693" elapsed="0.000596"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:42.924546" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:42.923976" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:42.924741" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:42.925040" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:42.923516" elapsed="0.001550"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:42.925223" elapsed="0.000391"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:42.922553" elapsed="0.003104"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:42.919233" elapsed="0.006460"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:42.925737" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:42.925894" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:42.917895" elapsed="0.008025"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.917590" elapsed="0.008362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.926130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:42.925977" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.917567" elapsed="0.008640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.926948" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:42.926353" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:42.927026" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:42.913780" elapsed="0.013373"/>
</kw>
<msg time="2026-05-01T00:56:42.927207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:42.900986" elapsed="0.026269"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.939878" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.952976" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.965825" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.966079" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.966280" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.966765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:42.966601" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:42.966580" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.967010" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.967182" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.967353" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:42.966527" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:42.966371" elapsed="0.001065"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.967608" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:42.967694" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:56:42.967888" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:42.896724" elapsed="0.071196"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:42.969489" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:42.969136" elapsed="0.000442">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:42.969679" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:42.968682" elapsed="0.001022"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.970075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:42.969793" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.970685" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:42.970354" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.970157" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.969773" elapsed="0.000998"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.973586" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:42.970929" elapsed="0.002685"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:42.973668" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:42.973860" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:42.968268" elapsed="0.005620"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:42.975137" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:42.974900" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:42.975337" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:42.974555" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:42.975593" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:42.975435" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.975416" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.975833" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.976009" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:42.976075" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:42.978014" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:42.974206" elapsed="0.003835"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.979512" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.979226" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.979965" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.979719" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:42.987782" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:42.988239" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '516'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:42.988342" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:42.982195" elapsed="0.006173"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.980075" elapsed="0.008337"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.988623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:42.988439" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.980057" elapsed="0.008653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.993171" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.989764" elapsed="0.003478"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.989531" elapsed="0.003762"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.989513" elapsed="0.003816"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.996968" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:42.993749" elapsed="0.003283"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.993407" elapsed="0.003675"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.993384" elapsed="0.003733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.997932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:42.997353" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:42.998439" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:42.998069" elapsed="0.000524"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:42.999300" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:42.998872" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:42.998632" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:42.998044" elapsed="0.001375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.000005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:42.999636" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.000341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.000104" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.000900" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.000604" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.000422" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.000086" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.001138" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:43.001981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.001672" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.002165" elapsed="0.002335"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:42.989087" elapsed="0.015477"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.004743" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:43.004635" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.004616" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.007895" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.004960" elapsed="0.002964"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:43.007976" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:43.008136" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:42.978365" elapsed="0.029797"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.008225" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:43.008382" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:42.873986" elapsed="0.134422"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.036945" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.036450" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.037781" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.037513" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.038083" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.037142" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.038780" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.038315" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.039136" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.039300" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.038974" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.039811" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "vrf-route-import-extended-community": {
                "inet4-specific-extended-community-common": {
                  "global-administrator": "10.0.0.1",
                  "local-administrator": "MTA="
                }
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.039541" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:43.040348" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.039934" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.041120" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.040610" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.040434" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.039915" elapsed="0.001291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.041882" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.041355" elapsed="0.000555"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.041960" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.035822" elapsed="0.006266"/>
</kw>
<msg time="2026-05-01T00:56:43.042147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.022990" elapsed="0.019206"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.054646" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.067047" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.079426" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.079766" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.079964" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.080454" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.080258" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.080238" elapsed="0.000327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.080718" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.080891" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.081060" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.080192" elapsed="0.000920"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.080053" elapsed="0.001089"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.081295" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.081376" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:43.081596" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.020166" elapsed="0.061461"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.081812" elapsed="0.002596"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.085869" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.085233" elapsed="0.000665"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.086612" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.086056" elapsed="0.000585"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.086801" elapsed="0.000346"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.084778" elapsed="0.002429"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.084508" elapsed="0.002732"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.087419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.087266" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.084487" elapsed="0.003028"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:43.009590" elapsed="0.077979"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:43.008765" elapsed="0.078889"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.008519" elapsed="0.079184"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.008501" elapsed="0.079229"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.087768" elapsed="0.000039"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:42.868210" elapsed="0.219706"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:40.726286" elapsed="2.361740"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.138422" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.137956" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.139324" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.139038" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.139524" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.138677" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.140110" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.139722" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.140450" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.140644" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.140302" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.141085" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.140835" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.142601" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.141991" elapsed="0.000657"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.143091" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.142814" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.143962" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.143549" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.145225" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.144665" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.145410" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:56:43.145741" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.144187" elapsed="0.001580"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.145958" elapsed="0.000396"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:43.143364" elapsed="0.003031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.147076" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.146671" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.148321" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.147777" elapsed="0.000645"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.148520" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:43.148814" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.147291" elapsed="0.001549"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.148995" elapsed="0.000362"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:43.146533" elapsed="0.002926"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.143178" elapsed="0.006334"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.149557" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:43.149717" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:43.141642" elapsed="0.008101"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.141224" elapsed="0.008552"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.149973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.149802" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.141193" elapsed="0.008858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.150829" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.150198" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.150906" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.137126" elapsed="0.013904"/>
</kw>
<msg time="2026-05-01T00:56:43.151087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.124125" elapsed="0.027015"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.163712" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.176067" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.188355" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.188627" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.188824" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.189268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.189108" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.189089" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.189525" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.189699" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.189867" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.189043" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.188909" elapsed="0.001121"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.190191" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.190275" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:43.190460" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.119597" elapsed="0.070907"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.192230" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.191904" elapsed="0.000409">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.192410" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.191272" elapsed="0.001162"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.192809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.192526" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.193378" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.193084" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.192891" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.192505" elapsed="0.000959"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.196165" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.193636" elapsed="0.002556"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:43.196244" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:43.196407" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.190885" elapsed="0.005546"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.197688" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.197436" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.197844" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.197097" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:43.198075" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:43.197939" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.197920" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.198307" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.198499" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.198568" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:43.200499" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.196770" elapsed="0.003756"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.201947" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.201691" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.202388" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.202148" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:43.209472" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:43.209639" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '516'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:43.209740" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:43.204709" elapsed="0.005057"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.202604" elapsed="0.007205"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.209993" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.209836" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.202583" elapsed="0.007496"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.214344" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.211112" elapsed="0.003308"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.210889" elapsed="0.003605"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.210871" elapsed="0.003664"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.218398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.214952" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.214619" elapsed="0.003922"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.214594" elapsed="0.003985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.219422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.218840" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.219994" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.219631" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.220707" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.220361" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.220113" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.219603" elapsed="0.001188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.221315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.220953" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.221667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.221412" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.222202" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.221910" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.221748" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.221394" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.222437" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:43.223281" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.222973" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.223480" elapsed="0.002314"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:43.210454" elapsed="0.015453"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.226088" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:43.225978" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.225960" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.229233" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.226305" elapsed="0.002958"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:43.229315" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:43.229498" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:43.200846" elapsed="0.028680"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.229590" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:43.229745" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:43.097130" elapsed="0.132641"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.258381" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.257866" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.259312" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.258988" elapsed="0.000466">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.259652" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.258638" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.260291" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.259849" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.260706" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.260879" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.260529" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.261336" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "vrf-route-import-extended-community": {
                "inet4-specific-extended-community-common": {
                  "global-administrator": "10.0.0.1",
                  "local-administrator": "MTA="
                }
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.261068" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:43.261948" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.261489" elapsed="0.000575"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.262800" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.262248" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.262095" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.261445" elapsed="0.001441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.263576" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.263039" elapsed="0.000566"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.263660" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.257177" elapsed="0.006628"/>
</kw>
<msg time="2026-05-01T00:56:43.263867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.244338" elapsed="0.019581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.276385" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.288763" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.301097" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.301359" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.301606" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.302069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.301910" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.301890" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.302305" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.302491" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.302662" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.301842" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.301697" elapsed="0.001049"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.302896" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.303055" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:56:43.303259" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.241590" elapsed="0.061701"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.303499" elapsed="0.004016"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.308944" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.308323" elapsed="0.000651"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.309702" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.309132" elapsed="0.000604"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.309894" elapsed="0.000346"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.307872" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.307600" elapsed="0.002733"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.310528" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.310359" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.307581" elapsed="0.003025"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:43.230933" elapsed="0.079722"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:43.230108" elapsed="0.080621"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.229855" elapsed="0.080919"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.229838" elapsed="0.080960"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.310831" elapsed="0.000038"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:43.092739" elapsed="0.218229"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:43.088212" elapsed="0.222814"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.360781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.360334" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.361636" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.361344" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.361818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.360996" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.362397" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.362013" elapsed="0.000547"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.362890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.363054" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.362731" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.363507" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.363242" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.364892" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.364330" elapsed="0.000608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.365383" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.365105" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.366252" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.365840" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.367569" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.366985" elapsed="0.000688"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.367756" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:43.368068" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.366494" elapsed="0.001600"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.368253" elapsed="0.000420"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:43.365699" elapsed="0.003015"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.369373" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.368971" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.370650" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.370080" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.370830" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:43.371146" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.369625" elapsed="0.001548"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.371331" elapsed="0.000385"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:43.368834" elapsed="0.002924"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.365506" elapsed="0.006289"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.371841" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:43.372000" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:43.363999" elapsed="0.008026"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.363647" elapsed="0.008410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.372244" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.372086" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.363618" elapsed="0.008703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.373096" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.372487" elapsed="0.000637"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.373174" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.359667" elapsed="0.013635"/>
</kw>
<msg time="2026-05-01T00:56:43.373401" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.346748" elapsed="0.026713"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.386141" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.398565" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.411016" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.411264" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.411459" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.411923" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.411763" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.411744" elapsed="0.000279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.412175" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.412345" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.412537" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.411697" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.411560" elapsed="0.001060"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.412772" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.412854" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:43.413027" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.342426" elapsed="0.070631"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.414596" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.414244" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.414775" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.413812" elapsed="0.000988"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.415211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.414940" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.415802" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.415503" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.415292" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.414920" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.418590" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.416038" elapsed="0.002579"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:43.418671" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:43.418833" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.413401" elapsed="0.005457"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.420100" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.419867" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.420282" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.419528" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:43.420533" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:43.420378" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.420360" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.420768" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.420942" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.421008" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:43.422945" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.419172" elapsed="0.003799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.424444" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.424142" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.424918" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.424673" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:43.432745" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:43.432908" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '516'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:43.433028" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:43.427119" elapsed="0.005936"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.425028" elapsed="0.008070"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.433284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.433125" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.425010" elapsed="0.008359"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.438654" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.434975" elapsed="0.003754"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.434575" elapsed="0.004206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.434548" elapsed="0.004271"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.442488" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.439234" elapsed="0.003303"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.438902" elapsed="0.003670"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.438877" elapsed="0.003720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.443201" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.442785" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.443567" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.443300" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.444118" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.443820" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.443650" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.443281" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.444893" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.444366" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.445229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.444990" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.445795" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.445499" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.445309" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.444972" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.446042" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:43.446886" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.446579" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.447070" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:43.433917" elapsed="0.015719"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.449818" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:43.449707" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.449688" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.452975" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.450039" elapsed="0.002966"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:43.453058" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:43.453227" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:43.423294" elapsed="0.029959"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.453317" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:43.453486" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:43.319865" elapsed="0.133650"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.482101" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.481558" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.483183" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.482864" elapsed="0.000454">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.483516" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.482313" elapsed="0.001229"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.484162" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.483715" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.484543" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.484717" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.484357" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.485179" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "vrf-route-import-extended-community": {
                "inet4-specific-extended-community-common": {
                  "global-administrator": "10.0.0.1",
                  "local-administrator": "MTA="
                }
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.484909" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:43.485795" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.485312" elapsed="0.000546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.486593" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.486040" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.485888" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.485286" elapsed="0.001392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.487337" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.486833" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.487419" elapsed="0.000040"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.480885" elapsed="0.006706"/>
</kw>
<msg time="2026-05-01T00:56:43.487652" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.468025" elapsed="0.019680"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.503053" elapsed="0.000126"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.519906" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.532255" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.532515" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.532714" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.533163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.533004" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.532984" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.533402" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.533596" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.533768" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.532937" elapsed="0.000883"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.532803" elapsed="0.001047"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.534002" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.534084" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:43.534287" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.465359" elapsed="0.068959"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.534524" elapsed="0.002606"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.538649" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.537935" elapsed="0.000744"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.539355" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-community": {
    ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.538838" elapsed="0.000545"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.539561" elapsed="0.000345"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:43.537464" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.537212" elapsed="0.002827"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.540216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.540064" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.537193" elapsed="0.003099"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:43.454766" elapsed="0.085578"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:43.453925" elapsed="0.086500"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.453664" elapsed="0.086826"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.453646" elapsed="0.086872"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.540558" elapsed="0.000037"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:43.315530" elapsed="0.225168"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:43.311200" elapsed="0.229560"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:43.540928" elapsed="0.005218"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.601129" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.600751" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.601940" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.601686" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.602113" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.601326" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.602713" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.602307" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.603045" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.603191" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.602907" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.603644" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.603380" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.604885" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.604595" elapsed="0.000336"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.605377" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.605101" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.606210" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.605804" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.607461" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.606909" elapsed="0.000707"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.607697" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:43.607993" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.606434" elapsed="0.001585"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.608178" elapsed="0.000442"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:43.605664" elapsed="0.002999"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.609320" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.608917" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:43.610616" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.610046" elapsed="0.000672"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:43.610795" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:43.611108" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:43.609579" elapsed="0.001555"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.611289" elapsed="0.000387"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:43.608779" elapsed="0.002939"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.605458" elapsed="0.006295"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:43.611796" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:43.611954" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:43.604057" elapsed="0.007922"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.603759" elapsed="0.008252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.612188" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.612035" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.603740" elapsed="0.008528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.613042" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.612437" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.613119" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.600040" elapsed="0.013205"/>
</kw>
<msg time="2026-05-01T00:56:43.613298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.587014" elapsed="0.026332"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.626055" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.638545" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.651271" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.651533" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.651730" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.652128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.651971" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.651957" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.652361" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.652563" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.652735" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.651927" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.651805" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.652969" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.653045" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:43.653164" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.582457" elapsed="0.070733"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.654491" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.654239" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.654648" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.653900" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.655012" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.654743" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.655825" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.655300" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.655101" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.654725" elapsed="0.001184"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.658272" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.656064" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:43.658351" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:43.658530" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.653565" elapsed="0.004991"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.659740" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.659553" elapsed="0.000240"/>
</kw>
<msg time="2026-05-01T00:56:43.659877" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.659198" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.660107" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:43.659971" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.659953" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.660547" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.660672" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.660361" elapsed="0.000336"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:43.661087" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.660857" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:43.661162" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:43.661321" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:43.658874" elapsed="0.002473"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.662798" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.662550" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.663236" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.662997" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:43.670623" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:43.671154" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '661'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:43.671254" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:43.665434" elapsed="0.005845"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.663344" elapsed="0.007978"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.671524" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.671348" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.663326" elapsed="0.008290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.675392" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.672640" elapsed="0.002828"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.672398" elapsed="0.003138"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.672379" elapsed="0.003193"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.679402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.675967" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.675651" elapsed="0.003891"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.675627" elapsed="0.003951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.680347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.679821" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.680856" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.680509" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.681640" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.681200" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.680970" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.680463" elapsed="0.001340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.682603" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.682082" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.682939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.682700" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.683497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.683186" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.683020" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.682682" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.683735" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:43.684546" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.684245" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:43.684729" elapsed="0.002930"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:43.671981" elapsed="0.015743"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.687901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:43.687795" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.687777" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.691076" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.688116" elapsed="0.002989"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:43.691157" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:43.691316" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:43.661715" elapsed="0.029628"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.691406" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:43.691589" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:43.558878" elapsed="0.132738"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.719688" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.719219" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.720494" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.720217" elapsed="0.000394">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:43.720785" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:43.719884" elapsed="0.000926"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.721409" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:43.720977" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:43.721815" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:43.721942" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:43.721655" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.722391" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:43.722126" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:43.722953" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.722525" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.723728" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:43.723191" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:43.723040" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:43.722505" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.724435" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:43.723963" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:43.724541" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:43.718594" elapsed="0.006074"/>
</kw>
<msg time="2026-05-01T00:56:43.724721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.705837" elapsed="0.018932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.737323" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.749764" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.762210" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.762408" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.762607" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.762980" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.762833" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:43.762819" elapsed="0.000275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.763241" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.763414" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.763627" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:43.762789" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.762683" elapsed="0.001027"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.763859" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.763936" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:43.764053" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:43.703222" elapsed="0.060858"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:43.764258" elapsed="0.002338"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.767641" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.767330" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:43.768507" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:43.767830" elapsed="0.000715"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:43.769039" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "transitive": true,
         "vrf-route-import-extended-community": {
          "inet4-specific-extended-community-common": {
           "global-administrator": "10.0.0.1",
           "local-administrator": "MTA="
          }
         }
        }
       ],
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "10.10.10.10",
       "route-distinguisher": "1.2.3.4:258"
      },
      "path-id": 0,
      "route-key": "AQwAAQECAwQBAgoKCgo="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:43.769264" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.768727" elapsed="0.000607">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.766917" elapsed="0.002646">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:43.766676" elapsed="0.002983">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:43.769849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:43.769696" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:43.766658" elapsed="0.003269">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.692760" elapsed="0.077313">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.691940" elapsed="0.078303">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:43.691699" elapsed="0.078646">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:43.691681" elapsed="0.078701">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:43.770468" elapsed="0.000031"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:43.552690" elapsed="0.217943">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,43 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.826367" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.825973" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.827203" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:45.826942" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:45.827376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:45.826603" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.827979" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:45.827590" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.828314" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:45.828499" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:45.828172" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.828931" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.828687" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.830056" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.829702" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.830560" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.830266" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.831364" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.830961" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:45.832637" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.832060" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:45.832817" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:45.833118" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:45.831602" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.833304" elapsed="0.000411"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:45.830821" elapsed="0.002935"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.834423" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.834025" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:45.835679" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.835109" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:45.835908" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:45.836203" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:45.834659" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.836386" elapsed="0.000394"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:45.833872" elapsed="0.002950"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:45.830641" elapsed="0.006217"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:45.836902" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:45.837060" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:45.829361" elapsed="0.007726"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.829056" elapsed="0.008063"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.837297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.837145" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.829031" elapsed="0.008344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.839406" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:45.837540" elapsed="0.001896"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:45.839545" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:45.825319" elapsed="0.014362"/>
</kw>
<msg time="2026-05-01T00:56:45.839735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:45.812651" elapsed="0.027133"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.852259" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.864755" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.877201" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.877398" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.877593" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.877961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.877814" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:45.877800" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.878220" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.878392" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.878576" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:45.877770" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.877668" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.878851" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.878928" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:45.879047" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:45.808187" elapsed="0.070886"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.880325" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:45.880087" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:45.880499" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:45.879745" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.880843" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.880597" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.881396" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.881106" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.880924" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.880578" elapsed="0.000920"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.883845" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:45.881654" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:45.883923" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:45.884076" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:45.879399" elapsed="0.004702"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.885283" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:45.885092" elapsed="0.000244"/>
</kw>
<msg time="2026-05-01T00:56:45.885420" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:45.884753" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.885668" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:45.885532" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.885513" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.886049" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:45.886240" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:45.885884" elapsed="0.000382"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:45.886683" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.886425" elapsed="0.000284"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:45.886815" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:45.886979" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:45.884408" elapsed="0.002597"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.888402" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.888154" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.888868" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.888627" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:45.896326" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:45.896482" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:45.896611" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:45.891252" elapsed="0.005399"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.888977" elapsed="0.007734"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.896970" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.896749" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.888959" elapsed="0.008133"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.901931" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.898554" elapsed="0.003443"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.898217" elapsed="0.003831"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.898192" elapsed="0.003892"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.905727" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.902501" elapsed="0.003291"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.902164" elapsed="0.003677"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.902140" elapsed="0.003736"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.906667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:45.906110" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.907184" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.906806" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.907878" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.907559" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.907302" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.906781" elapsed="0.001182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.908505" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:45.908127" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.908842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.908604" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.909384" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.909088" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.908923" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.908586" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:45.909645" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:45.910499" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:45.910160" elapsed="0.000367"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:45.910685" elapsed="0.002304"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:45.897631" elapsed="0.015421"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.913228" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:45.913123" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.913104" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:45.916108" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.913446" elapsed="0.002691"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:45.916189" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:45.916346" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:45.887318" elapsed="0.029055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:45.916435" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:45.916604" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:45.785946" elapsed="0.130683"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.944945" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.944499" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.945763" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:45.945498" elapsed="0.000381">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:45.946053" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:45.945139" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.946725" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:45.946248" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:45.947076" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:45.947204" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:45.946918" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.947677" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:45.947390" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:45.948215" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.947818" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.948972" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:45.948450" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.948301" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.947799" elapsed="0.001293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:45.949747" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:45.949246" elapsed="0.000530"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:45.949826" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:45.943868" elapsed="0.006083"/>
</kw>
<msg time="2026-05-01T00:56:45.950004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:45.931183" elapsed="0.018869"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.962558" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.974953" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.987620" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.987818" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.987995" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.988391" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.988220" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:45.988205" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.988663" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.988855" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.989023" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:45.988175" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.988071" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.989253" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:45.989327" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:45.989444" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:45.928535" elapsed="0.060992"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:45.989714" elapsed="0.002190"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:45.992953" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.992672" elapsed="0.000309"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:45.993412" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:45.993145" elapsed="0.000294"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:45.993619" elapsed="0.000323"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:45.992226" elapsed="0.001775"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.991984" elapsed="0.002051"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:45.994210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:45.994060" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.991966" elapsed="0.002320"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:45.917770" elapsed="0.076563"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:45.916959" elapsed="0.077446"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.916711" elapsed="0.077741"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:45.916694" elapsed="0.077795"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:45.994523" elapsed="0.000029"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:45.780902" elapsed="0.213753"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:43.546423" elapsed="2.448291"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:45.995049" elapsed="0.002650"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:40.715133" elapsed="5.282626"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:40.630511" elapsed="5.367367"/>
</test>
<test id="s1-s16-t22" name="Odl_To_Play_intra_source_as" line="142">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:46.000992" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:46.000726" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.002245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.002137" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.002119" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.007424" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.007316" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.007298" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.008519" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.008120" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.009026" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:46.008725" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:46.009137" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:46.009297" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.007742" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.014826" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.014719" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.014701" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.016057" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.015951" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.015934" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:46.016598" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.016276" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.017043" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:46.016816" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.046418" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:46.017586" elapsed="0.028952"/>
</kw>
<msg time="2026-05-01T00:56:46.046701" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:46.046747" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.017233" elapsed="0.029549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.071243" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:46.047298" elapsed="0.024048"/>
</kw>
<msg time="2026-05-01T00:56:46.071525" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:46.071572" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.046956" elapsed="0.024651"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.071909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.071685" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.071665" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.072423" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.072132" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.072796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.072578" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.072560" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:46.072907" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:46.075345" elapsed="0.000287"/>
</kw>
<msg time="2026-05-01T00:56:46.075695" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.074339" elapsed="0.001486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.076103" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.076443" elapsed="0.000092"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:46.073726" elapsed="0.002920"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:46.073170" elapsed="0.003539"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:46.015649" elapsed="0.061192"/>
</kw>
<msg time="2026-05-01T00:56:46.076932" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:46.076977" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.015051" elapsed="0.061961"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:46.077196" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:46.077089" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.077070" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.077709" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.078078" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.078150" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:46.014367" elapsed="0.063892"/>
</kw>
<msg time="2026-05-01T00:56:46.078351" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:46.078394" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.009716" elapsed="0.068713"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.078783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.078529" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.078511" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:46.009568" elapsed="0.069315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:46.009375" elapsed="0.069537"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:46.006955" elapsed="0.072010"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:46.001856" elapsed="0.077164"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.001405" elapsed="0.077659"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:45.998567" elapsed="0.080548"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.079980" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/announce_intra_source_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/announce_intra_source_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.080118" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.079788" elapsed="0.000357"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:46.080534" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.080304" elapsed="0.000257"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.080906" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/withdraw_intra_source_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/withdraw_intra_source_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.081032" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.080720" elapsed="0.000338"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:46.081412" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.081213" elapsed="0.000225"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:46.081841" elapsed="0.004363"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.081610" elapsed="0.004663"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.081592" elapsed="0.004710"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.122325" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.121952" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.123108" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.122887" elapsed="0.000287">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.123267" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.122551" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.123863" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.123473" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.124187" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.124314" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.124054" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.124757" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.124515" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.125752" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.125496" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.126218" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.125958" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.126933" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.126638" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.127924" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.127481" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.128000" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:46.128153" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.127147" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.128330" elapsed="0.000253"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:46.126474" elapsed="0.002150"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.129167" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.128872" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.130114" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.129717" elapsed="0.000424"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.130190" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:46.130339" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.129379" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.130536" elapsed="0.000258"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:46.128736" elapsed="0.002100"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.126292" elapsed="0.004579"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.130914" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:46.131104" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:46.125159" elapsed="0.005971"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.124870" elapsed="0.006292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.131337" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.131186" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.124851" elapsed="0.006562"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.132298" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.131576" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.132377" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.121320" elapsed="0.011201"/>
</kw>
<msg time="2026-05-01T00:56:46.132575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.108722" elapsed="0.023901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.144979" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.157610" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.170319" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.170536" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.170717" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.171081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.170935" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.170921" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.171361" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.171559" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.171729" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:46.170892" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.170791" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.171953" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.172074" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:46.172199" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:46.104303" elapsed="0.067922"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.196913" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.196533" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.197672" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.197440" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.197832" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.197107" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.198408" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.198023" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.198759" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.198895" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.198623" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.199330" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-extended-community&gt;
                &lt;global-administrator&gt;65&lt;/global-administrator&gt;
            &lt;/source-as-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.199086" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:46.199823" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.199460" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.200349" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.200058" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.199909" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.199438" elapsed="0.000993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.201034" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.200594" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.201112" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.195903" elapsed="0.005333"/>
</kw>
<msg time="2026-05-01T00:56:46.201325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.183218" elapsed="0.018157"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.213945" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.226230" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.238571" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.238768" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.238947" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.239313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.239168" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.239153" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.239551" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.239723" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.239890" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:46.239125" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.239021" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.240116" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.240191" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:46.240355" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:46.182339" elapsed="0.058047"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.241676" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.241412" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.241866" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.241072" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.242208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.241961" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.242776" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.242482" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.242289" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.241943" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.245246" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.243013" elapsed="0.002260"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:46.245325" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:46.245498" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:46.240746" elapsed="0.004778"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.247048" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.246804" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.247504" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-extended-community&gt;
                &lt;global-administrator&gt;65&lt;/global-administrator&gt;
            &lt;/source-as-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.247247" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.247953" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.247713" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.248380" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.248146" elapsed="0.000317"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:46.249281" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:46.249086" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:46.249655" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:46.249463" elapsed="0.000217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.249829" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.250424" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.250182" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:46.250527" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:46.250685" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:46.248683" elapsed="0.002026"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:46.263310" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '960', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;egp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-extended-community&gt;
                &lt;global-administrator&gt;65&lt;/global-administrator&gt;
            &lt;/source-as-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:46.263444" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AQwAAQECAwQBAgoKCgo%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:46.263608" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:46.253045" elapsed="0.010598"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.250779" elapsed="0.012926"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.263959" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.263742" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.250761" elapsed="0.013321"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.270863" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.265615" elapsed="0.005344"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.265269" elapsed="0.005767"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.265244" elapsed="0.005850"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.275048" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.271740" elapsed="0.003353"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.271216" elapsed="0.003910"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.271180" elapsed="0.003971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.275711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.275317" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.276043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.275806" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.276599" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.276287" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.276123" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.275789" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.277214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.276842" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.277562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.277309" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.278106" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.277805" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.277642" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.277291" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.278337" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:46.279138" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.278864" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.279317" elapsed="0.002363"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:46.264618" elapsed="0.017122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:46.281916" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:46.281813" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.281794" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.282150" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.282217" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:46.284550" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:46.245854" elapsed="0.038724"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.284685" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:46.284842" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:46.092812" elapsed="0.192056"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.285250" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.284972" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.284955" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.285375" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:46.086586" elapsed="0.198933"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.298152" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.286420" elapsed="0.011772"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.298410" elapsed="0.003231"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:46.301762" elapsed="0.000070"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:46.286153" elapsed="0.015913"/>
</kw>
<msg time="2026-05-01T00:56:46.302243" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:46.285693" elapsed="0.016609"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.304386" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:46.304602" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:46.303763" elapsed="0.000897"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.305787" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:46.305967" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:46.305032" elapsed="0.000992"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.306401" elapsed="0.000777"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.308034" level="INFO">${sum_1} = 1245</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:46.307591" elapsed="0.000502"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.308928" level="INFO">${sum_2} = 1245</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:46.308490" elapsed="0.000497"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.309354" elapsed="0.000775"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:46.302851" elapsed="0.007409"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:46.310610" elapsed="0.003683"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.359368" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.358997" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.360124" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.359912" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.360319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.359577" elapsed="0.000767"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.360916" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.360530" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.361240" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.361367" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.361106" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.361811" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.361569" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.363029" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.362735" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.363528" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.363237" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.364326" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.363917" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.365456" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.364984" elapsed="0.000567"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.365689" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:46.365912" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.364565" elapsed="0.001372"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.366092" elapsed="0.000453"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:46.363779" elapsed="0.002808"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.367251" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.366841" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.368368" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.367901" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.368608" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:46.368829" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.367484" elapsed="0.001371"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.369010" elapsed="0.000393"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:46.366703" elapsed="0.002741"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.363606" elapsed="0.005892"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.369544" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:46.369702" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:46.362242" elapsed="0.007486"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.361922" elapsed="0.007837"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.369934" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.369784" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.361903" elapsed="0.008107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.370742" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.370156" elapsed="0.000615"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.370820" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.358365" elapsed="0.012579"/>
</kw>
<msg time="2026-05-01T00:56:46.371032" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.345774" elapsed="0.025308"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.383564" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.396054" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.409802" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.410011" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.410192" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.410602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.410431" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.410415" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.410830" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.411018" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.411188" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:46.410380" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.410269" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.411417" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.411512" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:46.411646" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:46.341512" elapsed="0.070161"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.412819" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.412542" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:46.421732" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:46.421779" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:46.421879" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:46.415030" elapsed="0.006875"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.412982" elapsed="0.008962"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.422125" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.421971" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.412963" elapsed="0.009244"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.426440" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.423250" elapsed="0.003273"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.422993" elapsed="0.003580"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.422976" elapsed="0.003633"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.430190" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.426995" elapsed="0.003258"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.426686" elapsed="0.003614"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.426663" elapsed="0.003672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.431129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.430598" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.431667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.431265" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.432215" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.431917" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.431750" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.431240" elapsed="0.001059"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.432840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.432477" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.433172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.432936" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.433732" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.433422" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.433258" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.432918" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.433966" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:46.434782" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.434490" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.434963" elapsed="0.050791"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:46.422585" elapsed="0.063262"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:46.485906" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:56:46.488243" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:46.411937" elapsed="0.076335"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.488498" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:46.315291" elapsed="0.173341"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.314875" elapsed="0.173812"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:46.314510" elapsed="0.174237"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.492441" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.489789" elapsed="0.002707"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.492682" elapsed="0.002098"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:46.494831" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:46.489501" elapsed="0.005455"/>
</kw>
<msg time="2026-05-01T00:56:46.495031" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:46.488949" elapsed="0.006108"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.495927" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:46.496003" level="INFO">${len_1} = 150</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:46.495662" elapsed="0.000365"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.496485" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:46.496562" level="INFO">${len_2} = 150</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:46.496183" elapsed="0.000403"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.496812" elapsed="0.000425"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.497742" level="INFO">${sum_1} = 1094</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:46.497460" elapsed="0.000318"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:46.498233" level="INFO">${sum_2} = 1094</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:46.497989" elapsed="0.000279"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:46.498503" elapsed="0.000428"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:46.495272" elapsed="0.003741"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.544781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.544388" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.545627" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.545342" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.545795" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.544973" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.546366" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.545984" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.546713" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.546865" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.546572" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.547347" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.547047" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.548386" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.548133" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.548875" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.548610" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.549865" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.549284" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.551031" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.550579" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.551191" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:46.551412" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.550084" elapsed="0.001355"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.551616" elapsed="0.000491"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:46.549127" elapsed="0.003021"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.552930" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.552402" elapsed="0.000555"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.554259" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.553678" elapsed="0.000623"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.554423" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:46.554670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.553147" elapsed="0.001550"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.554852" elapsed="0.000657"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:46.552266" elapsed="0.003286"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.548953" elapsed="0.006635"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.555633" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:46.555793" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:46.547784" elapsed="0.008034"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.547481" elapsed="0.008369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.556028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.555876" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.547445" elapsed="0.008660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.556835" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.556249" elapsed="0.000614"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.556913" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.543746" elapsed="0.013292"/>
</kw>
<msg time="2026-05-01T00:56:46.557091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.530904" elapsed="0.026245"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.569797" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.582311" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.594878" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.595078" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.595255" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.595647" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.595495" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.595478" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.595873" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.596044" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.596213" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:46.595433" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.595330" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.596442" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.596535" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:46.596659" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:46.526553" elapsed="0.070133"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.597844" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.597585" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:46.605782" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:46.605922" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:46.606082" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:46.606126" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.600132" elapsed="0.006423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:46.597980" elapsed="0.008660">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.606829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.606674" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:46.597961" elapsed="0.008955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.610544" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.607968" elapsed="0.002612">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:46.607748" elapsed="0.002927">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:46.607730" elapsed="0.002992">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.614349" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.611136" elapsed="0.003259">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:46.610821" elapsed="0.003683">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:46.610797" elapsed="0.003755">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.615350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.614820" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.615848" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.615511" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.616630" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.616192" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.615962" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.615484" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.617494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.616972" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.617959" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.617630" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.618720" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.618332" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.618070" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.617606" elapsed="0.001196"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.618953" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:46.619762" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.619476" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:46.622185" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.619944" elapsed="0.002273">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.607295" elapsed="0.015072">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:46.622477" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:46.624819" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:46.624848" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:46.596959" elapsed="0.027918">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.624943" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.500536" elapsed="0.124574">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.499902" elapsed="0.125270"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:46.499326" elapsed="0.125904"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:46.079399" elapsed="0.545881"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:45.998088" elapsed="0.627308"/>
</test>
<test id="s1-s16-t23" name="Play_To_Odl_intra_source_as" line="146">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:46.628592" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:46.628305" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.629851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.629741" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.629723" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.634893" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.634786" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.634768" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.635964" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.635584" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.636453" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:46.636155" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:46.636539" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:46.636697" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.635190" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.642196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.642088" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.642070" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.643455" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.643346" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.643328" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:46.643994" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.643700" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.644395" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:46.644180" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.674870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:46.644938" elapsed="0.030083"/>
</kw>
<msg time="2026-05-01T00:56:46.675210" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:46.675256" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.644602" elapsed="0.030690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:46.698995" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:46.676031" elapsed="0.023114"/>
</kw>
<msg time="2026-05-01T00:56:46.699362" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:46.699413" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.675497" elapsed="0.023952"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.699785" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.699556" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.699535" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.700312" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.700011" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.700731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.700500" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.700480" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:46.700844" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:46.703431" elapsed="0.000165"/>
</kw>
<msg time="2026-05-01T00:56:46.703667" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.702344" elapsed="0.001477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.704107" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.704456" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:46.701690" elapsed="0.002977"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:46.701116" elapsed="0.003619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:46.643048" elapsed="0.061811"/>
</kw>
<msg time="2026-05-01T00:56:46.704955" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:46.705000" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.642417" elapsed="0.062618"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:46.705224" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:46.705114" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.705095" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.705731" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.706089" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.706163" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:46.641755" elapsed="0.064518"/>
</kw>
<msg time="2026-05-01T00:56:46.706367" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:46.706412" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.637095" elapsed="0.069356"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.706800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.706543" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.706525" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:46.636949" elapsed="0.069953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:46.636775" elapsed="0.070189"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:46.634383" elapsed="0.072661"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:46.629435" elapsed="0.077669"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:46.629012" elapsed="0.078139"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:46.626040" elapsed="0.081166"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.708401" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.707900" elapsed="0.000530"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.709091" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.708630" elapsed="0.000490"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.709727" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.709313" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.710126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/announce_intra_source_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/announce_intra_source_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.710282" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.709923" elapsed="0.000391"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.710800" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/withdraw_intra_source_as.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/withdraw_intra_source_as.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.710927" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.710602" elapsed="0.000352"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:46.711110" elapsed="0.002518"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:46.713814" elapsed="0.010388"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.777922" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.777545" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.778717" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.778471" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.778884" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.778117" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.779474" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.779075" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.779810" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:46.779949" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:46.779670" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.780422" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.780173" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.781537" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.781224" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.782146" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.781746" elapsed="0.000432"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.782967" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.782561" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.784198" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.783652" elapsed="0.000647"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.784378" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:46.784779" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.783185" elapsed="0.001621"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.784967" elapsed="0.000387"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:46.782405" elapsed="0.002991"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.786230" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:46.785669" elapsed="0.000587"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:46.787479" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.786925" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:46.787661" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:46.787955" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:46.786453" elapsed="0.001528"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:46.788137" elapsed="0.000382"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:46.785531" elapsed="0.003062"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.782231" elapsed="0.006401"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:46.788681" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:46.788842" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:46.780891" elapsed="0.007977"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.780585" elapsed="0.008315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.789077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.788925" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.780565" elapsed="0.008589"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.789891" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:46.789299" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:46.789969" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:46.776911" elapsed="0.013183"/>
</kw>
<msg time="2026-05-01T00:56:46.790147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:46.764036" elapsed="0.026160"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.804015" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.816357" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.828678" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.828875" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.829053" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.829458" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.829306" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.829292" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.829728" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.829899" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.830065" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:46.829263" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.829157" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.830291" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.830366" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:46.830510" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:46.759483" elapsed="0.071055"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.831813" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.831561" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.831970" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.831194" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.832310" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.832064" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.832878" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:46.832587" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.832391" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.832046" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.835481" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:46.833111" elapsed="0.002398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:46.835593" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:46.835758" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:46.830870" elapsed="0.004913"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:46.837004" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.836770" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:46.837160" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:46.836417" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:46.837427" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:56:46.837286" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:46.837267" elapsed="0.000264"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.837679" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.837852" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.837917" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:46.839863" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:46.836095" elapsed="0.003795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.841367" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.841101" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:46.841834" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:46.841587" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:46.849195" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:46.849338" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:46.849473" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.844027" elapsed="0.005816">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:46.841945" elapsed="0.007982">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.850116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.849961" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:46.841926" elapsed="0.008277">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.850599" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.850765" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:46.850727" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.850709" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.850977" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.851046" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.840247" elapsed="0.010905">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.851227" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.737022" elapsed="0.114301">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:46.851613" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:46.851415" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:46.851398" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:46.851746" elapsed="0.000014"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:46.730998" elapsed="0.120851">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.917514" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:48.916905" elapsed="0.000658"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:48.918694" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:48.918324" elapsed="0.000472">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:48.918926" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:48.917829" elapsed="0.001133"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.919798" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:48.919202" elapsed="0.000636"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:48.920298" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:48.920554" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:48.920080" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.921141" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:48.920831" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.922499" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:48.922124" elapsed="0.000503"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.923122" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:48.922803" elapsed="0.000347"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.924119" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:48.923674" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:48.925568" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:48.924969" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:48.925764" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:56:48.926135" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:48.924375" elapsed="0.001796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:48.926392" elapsed="0.000485"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:48.923494" elapsed="0.003429"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.928085" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:48.927191" elapsed="0.000930"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:48.929767" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:48.929035" elapsed="0.000865"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:48.930006" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:56:48.930408" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:48.928401" elapsed="0.002042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:48.930689" elapsed="0.000516"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:48.927050" elapsed="0.004212"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:48.923213" elapsed="0.008103"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:48.931380" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:48.931689" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:48.921731" elapsed="0.009995"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:48.921278" elapsed="0.010494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.932041" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:48.931813" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:48.921253" elapsed="0.010895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.933239" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:48.932357" elapsed="0.000924"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:48.933351" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:48.915810" elapsed="0.017740"/>
</kw>
<msg time="2026-05-01T00:56:48.933630" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:48.897640" elapsed="0.036067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.950772" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.968009" elapsed="0.000084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.982829" elapsed="0.000086"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.983220" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.983488" elapsed="0.000029"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.984127" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:48.983888" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:48.983860" elapsed="0.000389"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.984448" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.984689" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.984905" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:48.983798" elapsed="0.001170"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:48.983601" elapsed="0.001400"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.985203" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:48.985308" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:56:48.985530" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:48.892671" elapsed="0.092895"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:48.987474" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:48.987062" elapsed="0.000515">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:48.987707" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:48.986504" elapsed="0.001234"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.988238" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:48.987830" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.989031" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:48.988630" elapsed="0.000436"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:48.988351" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:48.987804" elapsed="0.001338"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:48.992656" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:48.989361" elapsed="0.003332"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:48.992761" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:48.993031" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:48.986036" elapsed="0.007026"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:48.994765" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:48.994412" elapsed="0.000442">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:48.994982" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:48.993943" elapsed="0.001075"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:48.995301" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:56:48.995115" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:48.995090" elapsed="0.000329"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.995657" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:48.995883" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:48.995970" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:56:48.998702" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:48.993483" elapsed="0.005249"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.000427" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.000031" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.000936" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.000679" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:49.009925" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:49.010340" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '427'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:49.010481" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:49.003706" elapsed="0.006807"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.001052" elapsed="0.009515"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.010777" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.010598" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.001034" elapsed="0.009833"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.017629" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.012035" elapsed="0.005676"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.011778" elapsed="0.005990"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.011758" elapsed="0.006049"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.021554" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.018253" elapsed="0.003359"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.017897" elapsed="0.003757"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.017870" elapsed="0.003893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.022439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.022004" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.022963" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.022566" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.023537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.023216" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.023046" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.022545" elapsed="0.001078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.024208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.023788" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.024589" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.024309" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.025143" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.024843" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.024675" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.024290" elapsed="0.000939"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.025398" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:49.026246" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.025946" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.026432" elapsed="0.002471"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:49.011291" elapsed="0.017685"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.029166" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:49.029053" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.029033" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.032380" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.029390" elapsed="0.003023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:49.032490" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:49.032691" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:48.999070" elapsed="0.033648"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.032783" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:49.032936" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:48.867326" elapsed="0.165636"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.061782" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.061230" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.062817" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.062353" elapsed="0.000629">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.063174" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.061999" elapsed="0.001201"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.063852" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.063375" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.064211" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.064380" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.064047" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.064868" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-extended-community": {
                "global-administrator": 65
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.064588" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:49.065539" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.065039" elapsed="0.000565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.066297" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.065786" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.065632" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.065013" elapsed="0.001370"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.067056" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.066554" elapsed="0.000531"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.067139" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.060469" elapsed="0.006809"/>
</kw>
<msg time="2026-05-01T00:56:49.067337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.047481" elapsed="0.019907"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.080545" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.093609" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.106058" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.106283" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.106488" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.106906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.106752" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.106734" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.107137" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.107310" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.107496" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.106696" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.106575" elapsed="0.001003"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.107729" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.107810" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:49.107984" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.044820" elapsed="0.063192"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.108194" elapsed="0.002511"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.112038" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.111488" elapsed="0.000580"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.112731" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.112228" elapsed="0.000532"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.112923" elapsed="0.000336"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.111037" elapsed="0.002283"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.110787" elapsed="0.002567"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.113625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.113380" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.110767" elapsed="0.002944"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:49.034214" elapsed="0.079547"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:49.033354" elapsed="0.080487"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.033052" elapsed="0.080883"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.033034" elapsed="0.080926"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.113996" elapsed="0.000034"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:48.861066" elapsed="0.253068"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:46.724479" elapsed="2.389716"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.164590" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.164145" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.165416" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.165155" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.165607" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.164808" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.166207" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.165802" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.166562" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.166731" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.166401" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.167165" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.166917" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.168595" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.168015" elapsed="0.000628"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.169084" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.168813" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.169924" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.169510" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.171358" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.170660" elapsed="0.000815"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.171558" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:49.171867" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.170181" elapsed="0.001713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.172054" elapsed="0.000383"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:49.169342" elapsed="0.003155"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.173157" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.172753" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.174619" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.173843" elapsed="0.000896"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.174820" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:49.175120" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.173373" elapsed="0.001774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.175305" elapsed="0.000478"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:49.172616" elapsed="0.003222"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.169164" elapsed="0.006722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.175943" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:49.176144" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:49.167672" elapsed="0.008506"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.167292" elapsed="0.008928"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.176476" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.176255" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.167268" elapsed="0.009311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.177420" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.176774" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.177544" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.163368" elapsed="0.014346"/>
</kw>
<msg time="2026-05-01T00:56:49.177785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.150290" elapsed="0.027558"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.193492" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.206749" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.223814" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.224178" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.224430" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.225012" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.224809" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.224785" elapsed="0.000489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.225496" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.225731" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.225954" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.224734" elapsed="0.001292"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.224560" elapsed="0.001501"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.226262" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.226365" elapsed="0.000025"/>
</return>
<msg time="2026-05-01T00:56:49.226597" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.145864" elapsed="0.080822"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.228523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.228143" elapsed="0.000473">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.228739" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.227640" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.229200" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.228861" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.229930" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.229565" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.229304" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.228837" elapsed="0.001198"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.232900" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.230242" elapsed="0.002685"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:49.232981" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:49.233148" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.227157" elapsed="0.006017"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.234446" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.234196" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.234629" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.233854" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:49.234909" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:49.234768" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.234748" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.235144" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.235316" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.235381" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:49.237317" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.233515" elapsed="0.003896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.238888" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.238611" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.239331" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.239091" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:49.247105" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:49.247265" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '427'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:49.247383" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:49.241531" elapsed="0.005880"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.239442" elapsed="0.008048"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.247711" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.247523" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.239423" elapsed="0.008376"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.251688" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.248943" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.248703" elapsed="0.003073"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.248683" elapsed="0.003119"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.254392" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.252086" elapsed="0.002354"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.251859" elapsed="0.002630"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.251842" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.255131" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.254715" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.255488" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.255229" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.256047" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.255748" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.255573" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.255211" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.256676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.256295" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.257009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.256773" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.257567" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.257256" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.257091" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.256755" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.257887" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:49.258728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.258404" elapsed="0.000350"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.258912" elapsed="0.002432"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:49.248219" elapsed="0.013198"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.261627" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:49.261512" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.261491" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.264818" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.261853" elapsed="0.002996"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:49.264905" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:56:49.265083" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:49.237764" elapsed="0.027346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.265176" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:49.265330" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:49.123321" elapsed="0.142036"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.294558" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.294021" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.295485" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.295122" elapsed="0.000495">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.295798" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.294774" elapsed="0.001050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.296444" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.295997" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.296825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.296992" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.296660" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.297457" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-extended-community": {
                "global-administrator": 65
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.297183" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:49.298140" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.297671" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.298911" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.298381" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.298230" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.297647" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.299687" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.299149" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.299776" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.293331" elapsed="0.006583"/>
</kw>
<msg time="2026-05-01T00:56:49.299974" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.280227" elapsed="0.019797"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.312583" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.325099" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.337722" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.337940" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.338127" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.338551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.338384" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.338366" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.338788" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.338958" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.339127" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.338328" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.338210" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.339423" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.339520" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:56:49.339689" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.277359" elapsed="0.062359"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.340018" elapsed="0.002468"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.343816" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.343254" elapsed="0.000591"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.344537" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.344036" elapsed="0.000530"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.344734" elapsed="0.000332"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.342822" elapsed="0.002306"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.342570" elapsed="0.002592"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.345341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.345188" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.342551" elapsed="0.002869"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:49.266594" elapsed="0.078894"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:49.265755" elapsed="0.079815"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.265445" elapsed="0.080173"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.265427" elapsed="0.080216"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.345678" elapsed="0.000033"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:49.118730" elapsed="0.227083"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:49.114375" elapsed="0.231500"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.396998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.396595" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.397831" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.397564" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.398090" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.397211" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.398697" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.398286" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.399033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.399189" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.398891" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.399643" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.399376" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.400990" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.400420" elapsed="0.000618"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.401510" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.401209" elapsed="0.000330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.402327" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.401921" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.403604" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.403028" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.403784" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:49.404090" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.402570" elapsed="0.001547"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.404276" elapsed="0.000535"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:49.401778" elapsed="0.003078"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.405545" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.405118" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.406779" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.406217" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.406958" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:49.407247" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.405767" elapsed="0.001506"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.407426" elapsed="0.000382"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:49.404976" elapsed="0.002873"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.401593" elapsed="0.006428"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.408065" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:49.408222" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:49.400094" elapsed="0.008153"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.399767" elapsed="0.008512"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.408476" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.408306" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.399744" elapsed="0.008810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.409327" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.408740" elapsed="0.000615"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.409404" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.395924" elapsed="0.013627"/>
</kw>
<msg time="2026-05-01T00:56:49.409659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.382983" elapsed="0.026728"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.422388" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.434912" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.447466" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.447692" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.447881" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.448299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.448143" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.448124" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.448546" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.448724" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.448892" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.448083" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.447963" elapsed="0.001010"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.449159" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.449240" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:49.449395" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.378586" elapsed="0.070838"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.450838" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.450547" elapsed="0.000436">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.451080" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.450131" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.451444" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.451178" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.452031" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.451734" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.451547" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.451159" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.454773" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.452272" elapsed="0.002529"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:49.454855" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:49.455015" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.449775" elapsed="0.005265"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.456279" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.456045" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.456436" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.455706" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:49.456695" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:49.456558" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.456539" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.456934" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.457164" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.457238" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:49.459168" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.455354" elapsed="0.003840"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.460624" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.460349" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.461067" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.460827" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:49.468272" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:49.468420" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '427'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:49.468545" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:49.463283" elapsed="0.005290"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.461197" elapsed="0.007419"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.468866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.468698" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.461178" elapsed="0.007775"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.472621" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.470028" elapsed="0.002643"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.469805" elapsed="0.002901"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.469787" elapsed="0.002945"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.476214" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.473013" elapsed="0.003269"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.472788" elapsed="0.003546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.472772" elapsed="0.003599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.477229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.476658" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.477785" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.477400" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.478620" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.478155" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.477907" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.477373" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.479546" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.478994" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.480043" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.479689" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.480865" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.480407" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.480163" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.479662" elapsed="0.001325"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.481216" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:49.482225" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.481930" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.482409" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:49.469353" elapsed="0.015449"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.484983" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:49.484874" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.484856" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.488112" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.485206" elapsed="0.002936"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:49.488196" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:49.488369" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:49.459531" elapsed="0.028865"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.488549" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:49.488710" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:49.354750" elapsed="0.133987"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.518530" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.517964" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.519414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.519102" elapsed="0.000465">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.519773" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.518749" elapsed="0.001051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.520430" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.519975" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.520816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.520985" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.520648" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.521457" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-extended-community": {
                "global-administrator": 65
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "egp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.521176" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:49.522136" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.521609" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.522916" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.522378" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.522225" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.521585" elapsed="0.001416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.523680" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.523152" elapsed="0.000557"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.523762" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.517188" elapsed="0.006713"/>
</kw>
<msg time="2026-05-01T00:56:49.523961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.503705" elapsed="0.020307"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.536680" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.551907" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.564318" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.564568" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.564766" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.565197" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.565040" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.565021" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.565429" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.565621" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.565793" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.564980" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.564854" elapsed="0.001023"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.566030" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.566113" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:56:49.566346" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.500809" elapsed="0.065570"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.566584" elapsed="0.003769"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.571765" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.571171" elapsed="0.000624"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.572451" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-extended-community": {
        "global-administrator": 65
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.571961" elapsed="0.000594"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.572723" elapsed="0.000350"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:49.570729" elapsed="0.002408"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.570445" elapsed="0.002729"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.573357" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.573201" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.570423" elapsed="0.003016"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:49.490049" elapsed="0.083461"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:49.489098" elapsed="0.084493"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.488823" elapsed="0.084816"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.488805" elapsed="0.084858"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.573702" elapsed="0.000052"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:49.350373" elapsed="0.223532"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:49.346054" elapsed="0.227936"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:49.574222" elapsed="0.008143"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.640651" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.640226" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.641501" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.641217" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.641678" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.640870" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.642266" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.641874" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.642701" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.642923" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.642520" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.643511" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.643182" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.645192" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.644489" elapsed="0.000765"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.645859" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.645505" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.646845" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.646369" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.648347" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.647784" elapsed="0.000671"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.648553" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:56:49.648871" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.647286" elapsed="0.001613"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.649064" elapsed="0.000407"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:49.646183" elapsed="0.003333"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.650289" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.649775" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:49.651782" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.651123" elapsed="0.000771"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:49.651986" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:49.652367" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:49.650587" elapsed="0.001813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.652616" elapsed="0.000435"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:49.649634" elapsed="0.003482"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.645962" elapsed="0.007200"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:49.653214" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:49.653404" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:49.644060" elapsed="0.009374"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.643668" elapsed="0.009821"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.653711" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.653524" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.643641" elapsed="0.010156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.654746" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.653979" elapsed="0.000800"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.654835" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.639585" elapsed="0.015394"/>
</kw>
<msg time="2026-05-01T00:56:49.655048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.626655" elapsed="0.028453"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.668144" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.680603" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.693087" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.693292" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.693494" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.693877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.693727" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.693711" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.694103" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.694275" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.694446" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.693680" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.693574" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.694697" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.694779" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:49.694902" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.622139" elapsed="0.072791"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.696337" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.696071" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.696525" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.695670" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.696876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.696623" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.697428" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.697137" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.696957" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.696605" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.700180" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.697685" elapsed="0.002523"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:49.700263" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:49.700423" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.695264" elapsed="0.005188"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.701667" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.701477" elapsed="0.000281"/>
</kw>
<msg time="2026-05-01T00:56:49.701845" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.701119" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.702079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:49.701942" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.701923" elapsed="0.000225"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.702480" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.702631" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.702297" elapsed="0.000359"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:49.703053" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.702820" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:49.703126" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:49.703282" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:49.700787" elapsed="0.002520"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.704757" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.704502" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.705201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.704960" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:49.712584" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:49.713220" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '572'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:49.713377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:49.707383" elapsed="0.006032"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.705312" elapsed="0.008187"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.713760" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.713538" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.705293" elapsed="0.008589"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.718752" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"egp"},"extended-communities":[{"transitive":true,"source-as-extended-community":{"global-administrator":65}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.715315" elapsed="0.003509"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.715001" elapsed="0.003872"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.714975" elapsed="0.003934"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.722049" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.719301" elapsed="0.002796"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.718988" elapsed="0.003145"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.718964" elapsed="0.003195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.722741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.722330" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.723124" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.722841" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.723706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.723380" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.723210" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.722823" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.724366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.723995" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.724725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.724483" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.725269" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.724973" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.724807" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.724447" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.725527" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:49.726485" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.726183" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:49.726672" elapsed="0.002484"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:49.714387" elapsed="0.014835"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.729399" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:49.729293" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.729274" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.732565" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.729636" elapsed="0.002960"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:49.732675" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:56:49.732861" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:49.703665" elapsed="0.029222"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.732950" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:49.733103" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:49.599329" elapsed="0.133800"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.761375" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.760918" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.762204" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.761936" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:49.762551" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:49.761596" elapsed="0.000981"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.763193" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:49.762747" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:49.763559" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:49.763692" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:49.763384" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.764142" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:49.763878" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:49.764704" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.764282" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.765446" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:49.764946" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:49.764795" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:49.764263" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.766177" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:49.765700" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:49.766257" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:49.760282" elapsed="0.006102"/>
</kw>
<msg time="2026-05-01T00:56:49.766437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.747491" elapsed="0.019019"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.779138" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.791594" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.804065" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.804355" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.804563" elapsed="0.000046"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.804999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.804846" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:49.804830" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.805227" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.805400" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.805589" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:49.804793" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.804673" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.805821" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.805901" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:49.806043" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:49.744842" elapsed="0.061229"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:49.806253" elapsed="0.002294"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.809675" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.809344" elapsed="0.000360"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:49.810536" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:49.809861" elapsed="0.000705"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:49.811053" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "source-as-extended-community": {
          "global-administrator": 65
         },
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "egp"
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "10.10.10.10",
       "route-distinguisher": "1.2.3.4:258"
      },
      "path-id": 0,
      "route-key": "AQwAAQECAwQBAgoKCgo="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:49.811286" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.810727" elapsed="0.000636">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.808916" elapsed="0.002673">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:49.808663" elapsed="0.003023">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:49.811883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:49.811728" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:49.808610" elapsed="0.003354">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.734287" elapsed="0.077829">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.733482" elapsed="0.078810">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:49.733222" elapsed="0.079174">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:49.733204" elapsed="0.079230">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:49.812527" elapsed="0.000019"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:49.592660" elapsed="0.220050">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-extended-community": {
+          "global-administrator": 65
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "egp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.868070" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.867673" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.868900" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:51.868642" elapsed="0.000335">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:51.869073" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:51.868282" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.869673" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:51.869266" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.870007" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:51.870168" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:51.869865" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.870655" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.870354" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.871745" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.871415" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.872223" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.871957" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.873051" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:51.872647" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:51.874297" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.873748" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:51.874556" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:56:51.874892" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:51.873271" elapsed="0.001648"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.875080" elapsed="0.000414"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:51.872506" elapsed="0.003031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.876398" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:51.875797" elapsed="0.000627"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:51.877659" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.877092" elapsed="0.000668"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:51.877895" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:51.878193" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:51.876638" elapsed="0.001582"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.878378" elapsed="0.000454"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:51.875656" elapsed="0.003221"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:51.872301" elapsed="0.006612"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:51.878958" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:51.879124" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:51.871092" elapsed="0.008058"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.870780" elapsed="0.008403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.879367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.879211" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.870756" elapsed="0.008695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.880223" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:51.879620" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:51.880304" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:51.867028" elapsed="0.013407"/>
</kw>
<msg time="2026-05-01T00:56:51.880510" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:51.854075" elapsed="0.026488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.893141" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.905509" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.917960" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.918159" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.918336" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.918722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.918575" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:51.918560" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.918977" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.919188" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.919360" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:51.918530" elapsed="0.000883"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:51.918411" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.919606" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:51.919683" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:51.919804" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:51.849812" elapsed="0.070018"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.921104" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:51.920851" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:51.921268" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:51.920503" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.921634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.921365" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.922189" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.921896" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.921716" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.921346" elapsed="0.000926"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.924808" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:51.922424" elapsed="0.002412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:51.924889" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:51.925045" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:51.920160" elapsed="0.004910"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.926251" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:51.926065" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T00:56:51.926387" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:51.925725" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:51.926635" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:51.926500" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.926480" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.927067" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:51.927210" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:51.926853" elapsed="0.000383"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:51.927646" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:51.927396" elapsed="0.000276"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:51.927751" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:51.927912" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:51.925381" elapsed="0.002557"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.929323" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.929076" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.929784" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.929541" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:51.937473" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:51.937606" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:51.937703" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:51.931978" elapsed="0.005751"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.929898" elapsed="0.007875"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.938030" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.937808" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.929880" elapsed="0.008271"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.943017" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.939630" elapsed="0.003470"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.939295" elapsed="0.003855"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.939271" elapsed="0.003915"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.946994" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.943605" elapsed="0.003497"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.943264" elapsed="0.003888"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.943241" elapsed="0.003946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.947925" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:51.947421" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.948265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.948024" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.948832" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.948532" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.948348" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.948006" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.949440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:51.949080" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:51.949803" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.949557" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.950346" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.950052" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.949885" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.949539" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:51.950600" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:51.951415" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:51.951130" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:51.951653" elapsed="0.002299"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:51.938678" elapsed="0.015338"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:51.954192" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:51.954086" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.954068" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:51.957057" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:51.954409" elapsed="0.002677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:51.957140" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:51.957297" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:51.928249" elapsed="0.029074"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:51.957386" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:51.957554" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:51.827279" elapsed="0.130302"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.986100" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.985653" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.986915" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:51.986651" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:51.987208" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:51.986295" elapsed="0.000938"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.987870" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:51.987418" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:51.988224" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:51.988352" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:51.988062" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.988818" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:51.988553" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:51.989328" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:51.988930" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.990080" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:51.989579" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.989412" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.988912" elapsed="0.001329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:51.990890" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:51.990394" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:51.990968" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:51.985012" elapsed="0.006083"/>
</kw>
<msg time="2026-05-01T00:56:51.991147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:51.972136" elapsed="0.019061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.003719" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.016122" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.028550" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.028749" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.028932" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.029304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.029158" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.029144" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.029542" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.029714" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.029882" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.029114" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.029009" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.030109" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.030184" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:52.030300" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:51.969302" elapsed="0.061057"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.030559" elapsed="0.002360"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:52.033956" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.033669" elapsed="0.000316"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:52.034410" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.034142" elapsed="0.000296"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.034617" elapsed="0.000322"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.033242" elapsed="0.001758"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.033000" elapsed="0.002035"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.035210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.035060" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.032982" elapsed="0.002305"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:51.958720" elapsed="0.076616"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:51.957906" elapsed="0.077506"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:51.957665" elapsed="0.077808"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:51.957648" elapsed="0.077851"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.035533" elapsed="0.000029"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:51.822824" elapsed="0.212853"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:49.582872" elapsed="2.452867"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:52.035958" elapsed="0.002366"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:46.707510" elapsed="5.330874"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:46.625622" elapsed="5.412925"/>
</test>
<test id="s1-s16-t24" name="Odl_To_Play_intra_source_as_4" line="150">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:52.042052" elapsed="0.000303"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:52.041673" elapsed="0.000758"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.043865" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.043698" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.043672" elapsed="0.000291"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.050274" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.050167" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.050149" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.051351" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.050971" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.051870" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:52.051558" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:52.051981" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.052140" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.050592" elapsed="0.001573"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.057905" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.057793" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.057773" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.059153" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.059046" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.059028" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:52.059699" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.059371" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.060148" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:52.059928" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.100115" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:52.060691" elapsed="0.039645"/>
</kw>
<msg time="2026-05-01T00:56:52.100587" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:52.100639" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.060335" elapsed="0.040339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.161843" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:52.101342" elapsed="0.060707"/>
</kw>
<msg time="2026-05-01T00:56:52.162273" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:52.162323" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.100912" elapsed="0.061447"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.162813" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.162495" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.162439" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.163419" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.163053" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.163808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.163584" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.163565" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:52.163925" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:52.166579" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:56:52.166791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.165535" elapsed="0.001397"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.167216" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.167584" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:52.164862" elapsed="0.002910"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:52.164250" elapsed="0.003586"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:52.058745" elapsed="0.109285"/>
</kw>
<msg time="2026-05-01T00:56:52.168126" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:52.168172" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.058134" elapsed="0.110076"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:52.168399" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:52.168289" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.168270" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.168951" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.169303" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.169374" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:52.057430" elapsed="0.112075"/>
</kw>
<msg time="2026-05-01T00:56:52.169603" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:52.169649" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "O "d "l "_ "T "o "_ "P "l "a...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.052552" elapsed="0.117133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.170021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.169764" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.169746" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:52.052390" elapsed="0.117734"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:52.052219" elapsed="0.117937"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:52.049807" elapsed="0.120408"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:52.043270" elapsed="0.127002"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.042674" elapsed="0.127644"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:52.039206" elapsed="0.131167"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.171265" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/announce_intra_source_as_4.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/announce_intra_source_as_4.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.171503" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.171061" elapsed="0.000471"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:52.171903" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.171692" elapsed="0.000238"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.172273" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/withdraw_intra_source_as_4.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/withdraw_intra_source_as_4.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.172400" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.172086" elapsed="0.000340"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:56:52.174304" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.172601" elapsed="0.001732"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:52.174650" elapsed="0.004280"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.174408" elapsed="0.004621"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.174389" elapsed="0.004678"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.217358" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.216941" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.218169" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.217920" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.218340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.217579" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.218944" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.218553" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.219277" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.219419" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.219137" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.219876" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.219628" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.220902" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.220636" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.221400" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.221130" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.222111" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.221811" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.223271" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.222673" elapsed="0.000626"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.223351" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:56:52.223538" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.222331" elapsed="0.001233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.223722" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:52.221671" elapsed="0.002336"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.224590" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.224263" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.225675" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.225239" elapsed="0.000463"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.225754" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.225909" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.224863" elapsed="0.001071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.226093" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:52.224123" elapsed="0.002235"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.221494" elapsed="0.004900"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.226439" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T00:56:52.226659" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:52.220291" elapsed="0.006394"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.219992" elapsed="0.006726"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.226899" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.226743" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.219973" elapsed="0.007005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.227724" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.227127" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.227803" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.216299" elapsed="0.011632"/>
</kw>
<msg time="2026-05-01T00:56:52.227986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.203586" elapsed="0.024449"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.240601" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.253052" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.265716" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.265918" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.266099" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.266600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.266425" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.266411" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.266828" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.267001" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.267200" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.266382" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.266275" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.267432" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.267563" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:52.267687" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:52.199160" elapsed="0.068554"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.292938" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.292534" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.293786" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.293505" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.293957" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.293141" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.294559" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.294153" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.294898" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.295062" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.294755" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.295513" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-4-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
            &lt;/source-as-4-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.295253" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:52.295967" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.295647" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.296523" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.296202" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.296053" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.295625" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.297225" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.296763" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.297305" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.291866" elapsed="0.005572"/>
</kw>
<msg time="2026-05-01T00:56:52.297568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.278912" elapsed="0.018740"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.310249" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.322669" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.335121" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.335321" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.335515" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.335894" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.335746" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.335731" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.336120" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.336290" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.336475" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.335701" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.335594" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.336708" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.336783" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:52.336922" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-nex...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:52.278028" elapsed="0.058924"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.338245" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.337996" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.338438" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.337637" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.338808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.338554" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.339370" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.339076" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.338891" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.338534" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.342096" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.339631" elapsed="0.002495"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:52.342181" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:52.342344" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:52.337290" elapsed="0.005082"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.343946" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.343693" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.344392" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-4-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
            &lt;/source-as-4-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.344152" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.344876" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.344625" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.345314" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.345075" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:52.346224" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:56:52.346024" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:56:52.346599" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:56:52.346407" elapsed="0.000217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.346775" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.347384" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.347138" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:56:52.347486" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.347645" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:56:52.345580" elapsed="0.002090"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:52.358980" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '967', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;mvpn-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;AQwAAQECAwQBAgoKCgo=&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.1.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;multi-exit-disc&gt;
            &lt;med&gt;0&lt;/med&gt;
        &lt;/multi-exit-disc&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;source-as-4-extended-community&gt;
                &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
            &lt;/source-as-4-extended-community&gt;
        &lt;/extended-communities&gt;
    &lt;/attributes&gt;
    &lt;intra-as-i-pmsi-a-d&gt;
        &lt;route-distinguisher&gt;1.2.3.4:258&lt;/route-distinguisher&gt;
        &lt;orig-route-ip&gt;10.10.10.10&lt;/orig-route-ip&gt;
    &lt;/intra-as-i-pmsi-a-d&gt;
&lt;/mvpn-route&gt; 
 </msg>
<msg time="2026-05-01T00:56:52.359080" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4/mvpn-route=AQwAAQECAwQBAgoKCgo%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:52.359189" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:52.349847" elapsed="0.009369"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.347740" elapsed="0.011521"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.359447" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.359289" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.347722" elapsed="0.011839"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.364363" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.360930" elapsed="0.003496"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.360618" elapsed="0.003887"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.360592" elapsed="0.003953"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.368378" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.364952" elapsed="0.003491"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.364630" elapsed="0.003885"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.364605" elapsed="0.003946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.369316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.368786" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.369812" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.369474" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.370633" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.370196" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.369926" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.369427" elapsed="0.001323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.371290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.370932" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.371642" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.371386" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.372331" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.372032" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.371723" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.371369" elapsed="0.001044"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.372594" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:52.373390" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.373112" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.373591" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:52.359981" elapsed="0.015988"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:52.376148" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:52.376042" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.376024" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.376383" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.376453" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.378775" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:52.342735" elapsed="0.036067"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.378917" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.379076" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:52.185778" elapsed="0.193323"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.379451" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.379207" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.379190" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.379595" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:56:52.179420" elapsed="0.200300"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.383928" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.380645" elapsed="0.003313"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.384118" elapsed="0.002270"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:52.386443" elapsed="0.000050"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:52.380355" elapsed="0.006241"/>
</kw>
<msg time="2026-05-01T00:56:52.386672" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:52.379894" elapsed="0.006804"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.387869" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:52.387976" level="INFO">${len_1} = 162</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:52.387494" elapsed="0.000515"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.388599" level="INFO">Length is 162.</msg>
<msg time="2026-05-01T00:56:52.388702" level="INFO">${len_2} = 162</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:52.388226" elapsed="0.000508"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.388959" elapsed="0.000421"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.389886" level="INFO">${sum_1} = 1872</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:52.389627" elapsed="0.000295"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.390426" level="INFO">${sum_2} = 1872</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:52.390137" elapsed="0.000342"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.390699" elapsed="0.000423"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:52.386964" elapsed="0.004241"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:52.391418" elapsed="0.003084"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.442590" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.442196" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.443367" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.443148" elapsed="0.000285">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.443583" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.442808" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.444167" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.443780" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.444514" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.444655" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.444359" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.445090" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.444847" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.446142" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.445839" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.446642" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.446349" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.447472" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.447044" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.448596" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.448108" elapsed="0.000570"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.448817" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:52.449041" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.447692" elapsed="0.001375"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.449223" elapsed="0.000417"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:52.446905" elapsed="0.002776"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.450344" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.449933" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.451664" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.451018" elapsed="0.000728"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.451889" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:52.452114" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.450577" elapsed="0.001564"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.452297" elapsed="0.000417"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:52.449797" elapsed="0.002959"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.446729" elapsed="0.006062"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.452836" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:52.452995" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:52.445515" elapsed="0.007505"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.445201" elapsed="0.007851"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.453230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.453077" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.445183" elapsed="0.008124"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.454032" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.453471" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.454110" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.441576" elapsed="0.012661"/>
</kw>
<msg time="2026-05-01T00:56:52.454328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.428895" elapsed="0.025482"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.466922" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.479452" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.492022" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.492229" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.492409" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.492808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.492657" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.492642" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.493034" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.493208" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.493379" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.492612" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.492502" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.493633" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.493710" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:52.493834" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:52.424598" elapsed="0.069264"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.494984" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.494728" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:52.503732" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:52.503806" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:52.503934" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:52.497226" elapsed="0.006737"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.495169" elapsed="0.008847"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.504265" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.504049" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.495150" elapsed="0.009203"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.508507" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.505522" elapsed="0.003053"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.505261" elapsed="0.003367"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.505241" elapsed="0.003426"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.512590" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.509087" elapsed="0.003575"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.508750" elapsed="0.003964"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.508726" elapsed="0.004026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.513649" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.513039" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.514157" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.513797" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.515000" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.514554" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.514278" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.513769" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.515925" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.515408" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.516403" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.516167" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.516966" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.516669" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.516503" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.516004" elapsed="0.001044"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.517211" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:52.518050" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.517746" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.518232" elapsed="0.002364"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:52.504797" elapsed="0.015871"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:52.520722" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:56:52.522991" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:56:52.494130" elapsed="0.028888"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.523154" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:56:52.395885" elapsed="0.127457"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.395270" elapsed="0.128133"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:52.394759" elapsed="0.128723"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.526719" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.524476" elapsed="0.002272"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.526929" elapsed="0.002149"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:56:52.529130" elapsed="0.000034"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:56:52.524169" elapsed="0.005096"/>
</kw>
<msg time="2026-05-01T00:56:52.529344" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:52.523664" elapsed="0.005705"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.530277" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:52.530353" level="INFO">${len_1} = 150</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:52.530000" elapsed="0.000378"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.530805" level="INFO">Length is 150.</msg>
<msg time="2026-05-01T00:56:52.530878" level="INFO">${len_2} = 150</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:56:52.530552" elapsed="0.000349"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.531060" elapsed="0.000339"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.531759" level="INFO">${sum_1} = 1721</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:52.531575" elapsed="0.000210"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:56:52.532269" level="INFO">${sum_2} = 1721</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:56:52.532011" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:52.532562" elapsed="0.000590"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:56:52.529623" elapsed="0.003612"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.579542" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.579132" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.580517" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.580116" elapsed="0.000477">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.580689" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.579776" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.581271" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.580884" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.581621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.581783" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.581480" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.582286" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.581968" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.583356" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.583099" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.583882" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.583583" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.584846" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.584276" elapsed="0.000597"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.586019" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.585567" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.586184" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:52.586413" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.585066" elapsed="0.001374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.586618" elapsed="0.000511"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:56:52.584137" elapsed="0.003033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.588087" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.587421" elapsed="0.000702"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.589670" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.588844" elapsed="0.000888"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.589902" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:56:52.590169" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.588336" elapsed="0.001859"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.590351" elapsed="0.000517"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:52.587286" elapsed="0.003625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.583961" elapsed="0.006997"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.591019" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:56:52.591216" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:52.582742" elapsed="0.008511"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.582411" elapsed="0.008888"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.591506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.591328" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.582388" elapsed="0.009197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.592533" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.591919" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.592613" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.578485" elapsed="0.014256"/>
</kw>
<msg time="2026-05-01T00:56:52.592796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.565567" elapsed="0.027302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.606566" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.620644" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.633734" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.633959" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.634174" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.634613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.634438" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.634420" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.634851" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.635024" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.635208" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.634380" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.634263" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.635450" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.635546" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:56:52.635697" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:52.560993" elapsed="0.074732"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.637007" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.636708" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:52.643964" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:52.644119" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '374'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-mvpn:mcast-vpn-subsequent-address-family']/bgp-mvpn-ipv4:mvpn-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:52.644318" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:56:52.644365" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.639260" elapsed="0.005556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:52.637131" elapsed="0.007802">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.645199" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.644981" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:52.637112" elapsed="0.008208">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.650433" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.646822" elapsed="0.003682">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:52.646506" elapsed="0.004089">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:52.646479" elapsed="0.004162">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.653907" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.651060" elapsed="0.002881">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:52.650740" elapsed="0.003267">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:52.650716" elapsed="0.003324">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.654681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.654257" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.655027" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.654783" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.655598" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.655279" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.655112" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.654764" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.656238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.655852" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.656605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.656347" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.657152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.656854" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.656687" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.656329" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.657388" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:52.658250" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.657936" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:56:52.660782" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.658436" elapsed="0.002381">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.645874" elapsed="0.015084">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:56:52.661054" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:52.663496" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:56:52.663529" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:56:52.636001" elapsed="0.027559">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.663650" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.534735" elapsed="0.129100">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.534129" elapsed="0.129772"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:56:52.533577" elapsed="0.130386"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:52.170686" elapsed="0.493330"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.038762" elapsed="0.625370"/>
</test>
<test id="s1-s16-t25" name="Play_To_Odl_intra_source_as_4" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:52.667516" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:52.667221" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.668852" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.668735" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.668716" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.674187" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.674046" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.674023" elapsed="0.000255"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.675441" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.675053" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.676014" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:52.675654" elapsed="0.000387"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:52.676087" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:52.676246" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.674613" elapsed="0.001658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.681965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.681854" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.681835" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.683260" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.683152" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.683134" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:52.683844" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.683527" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.684272" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:52.684035" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.714389" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:52.684909" elapsed="0.029627"/>
</kw>
<msg time="2026-05-01T00:56:52.714736" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:52.714786" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.684532" elapsed="0.030290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:52.747644" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:52.717173" elapsed="0.030781"/>
</kw>
<msg time="2026-05-01T00:56:52.748190" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:52.748239" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.715041" elapsed="0.033234"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.748781" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.748401" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.748361" elapsed="0.000573"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.749511" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "s "o "u "r "c "e "_ "a "s "_ "4 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.749092" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.749909" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.749655" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.749636" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:52.750064" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:52.752891" elapsed="0.000161"/>
</kw>
<msg time="2026-05-01T00:56:52.753116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.751763" elapsed="0.001513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.753597" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.753946" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:52.751061" elapsed="0.003079"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:52.750421" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:52.682850" elapsed="0.071460"/>
</kw>
<msg time="2026-05-01T00:56:52.754434" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:52.754502" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.682199" elapsed="0.072343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:52.754743" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:52.754626" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.754606" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.755271" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.755716" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.755795" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:52.681512" elapsed="0.074396"/>
</kw>
<msg time="2026-05-01T00:56:52.756008" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:52.756052" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.676701" elapsed="0.079388"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.756428" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.756169" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.756150" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:52.676553" elapsed="0.079997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:52.676326" elapsed="0.080318"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:52.673580" elapsed="0.083136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:52.668427" elapsed="0.088349"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:52.667937" elapsed="0.088891"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:52.664901" elapsed="0.092035"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.758163" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.757638" elapsed="0.000554"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.758859" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.758367" elapsed="0.000522"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.759436" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.759060" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.759862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/announce_intra_source_as_4.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/announce_intra_source_as_4.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.760057" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.759650" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.760441" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/withdraw_intra_source_as_4.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/withdraw_intra_source_as_4.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.760585" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.760248" elapsed="0.000363"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:52.760768" elapsed="0.003652"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:52.764627" elapsed="0.002328"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.824669" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.824249" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.825575" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.825239" elapsed="0.000415">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.825754" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.824883" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.826394" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.825953" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.826758" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:52.826918" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:52.826614" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.827440" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.827181" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.828596" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.828259" elapsed="0.000385"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.829088" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.828814" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.829986" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.829558" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.831302" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.830732" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.831520" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:56:52.831844" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.830213" elapsed="0.001658"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.832033" elapsed="0.000388"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:52.829387" elapsed="0.003095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.833188" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:52.832767" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:52.834739" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.834157" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:52.834950" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:52.835254" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:52.833641" elapsed="0.001639"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:52.835442" elapsed="0.000399"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:52.832618" elapsed="0.003272"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.829168" elapsed="0.006772"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:52.835990" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:52.836157" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:52.827899" elapsed="0.008285"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.827587" elapsed="0.008630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.836424" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.836244" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.827564" elapsed="0.008992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.837323" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:52.836710" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:52.837442" elapsed="0.000047"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:52.823587" elapsed="0.014014"/>
</kw>
<msg time="2026-05-01T00:56:52.837658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:52.810318" elapsed="0.027392"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.851123" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.864178" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.876748" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.876956" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.877136" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.877533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.877364" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.877348" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.877792" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.877965" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.878132" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:52.877318" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.877211" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.878361" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.878437" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:52.878589" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:52.805838" elapsed="0.072778"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.879917" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.879651" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.880078" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.879284" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.880427" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.880175" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.881150" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:52.880712" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.880527" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.880156" elapsed="0.001114"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.883817" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:52.881427" elapsed="0.002417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:52.883896" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:52.884052" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:52.878948" elapsed="0.005128"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:52.885304" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.885066" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:52.885478" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:52.884728" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:52.885744" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:52.885577" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:52.885558" elapsed="0.000274"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.885980" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.886153" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.886218" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:52.888145" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:52.884386" elapsed="0.003785"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.889579" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.889315" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:52.890032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:52.889795" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:52.897018" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:52.897152" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:52.897263" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.892229" elapsed="0.005423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:52.890140" elapsed="0.007597">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.897949" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.897788" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:52.890122" elapsed="0.007916">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.898487" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.898623" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:52.898585" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.898568" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.898839" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.898911" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.888502" elapsed="0.010519">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.899097" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.782106" elapsed="0.117089">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:52.899489" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:52.899290" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:52.899273" elapsed="0.000313"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:52.899620" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:52.774536" elapsed="0.125182">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.956938" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:54.956539" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:54.957780" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:54.957504" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:54.957954" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:54.957150" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.958586" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:54.958181" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:54.958922" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:54.959089" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:54.958778" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.959608" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:54.959337" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.960708" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:54.960378" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.961188" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:54.960919" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.962050" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:54.961608" elapsed="0.000473"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:54.963316" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:54.962760" elapsed="0.000656"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:54.963519" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:54.963826" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:54.962279" elapsed="0.001573"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:54.964010" elapsed="0.000392"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:54.961443" elapsed="0.003003"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.965289" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:54.964718" elapsed="0.000597"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:54.966601" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:54.965989" elapsed="0.000713"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:54.966781" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:54.967077" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:54.965528" elapsed="0.001575"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:54.967260" elapsed="0.000390"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:54.964582" elapsed="0.003110"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:54.961267" elapsed="0.006461"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:54.967772" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:54.967931" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:54.960050" elapsed="0.007907"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:54.959733" elapsed="0.008256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:54.968168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:54.968015" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:54.959710" elapsed="0.008535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:54.969084" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:54.968392" elapsed="0.000721"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:54.969165" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:54.955898" elapsed="0.013395"/>
</kw>
<msg time="2026-05-01T00:56:54.969347" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:54.943048" elapsed="0.026348"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:54.982030" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:54.994596" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.007010" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.007225" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.007407" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.007826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.007668" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.007651" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.008054" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.008225" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.008393" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.007617" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.007504" elapsed="0.000984"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.008642" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.008720" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:55.008860" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:54.938765" elapsed="0.070122"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.010245" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.009949" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.010435" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.009578" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.010809" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.010548" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.011383" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.011077" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.010893" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.010530" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.014051" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.011644" elapsed="0.002434"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:55.014188" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:55.014413" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.009218" elapsed="0.005223"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.015797" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.015545" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.015960" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.015173" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:55.016201" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:55.016061" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.016041" elapsed="0.000249"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.016444" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.016640" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.016709" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:55.018661" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.014788" elapsed="0.003899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.020099" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.019844" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.020561" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.020301" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:55.028423" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:55.028854" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '432'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:55.028958" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:55.022882" elapsed="0.006103"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.020675" elapsed="0.008355"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.029218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.029058" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.020656" elapsed="0.008653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.034061" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.030399" elapsed="0.003737"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.030132" elapsed="0.004057"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.030114" elapsed="0.004112"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.038114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.034690" elapsed="0.003492"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.034309" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.034284" elapsed="0.004048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.039147" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.038655" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.039511" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.039247" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.040068" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.039764" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.039594" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.039229" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.040697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.040317" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.041031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.040795" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.041583" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.041274" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.041112" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.040777" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.041821" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:55.042682" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.042337" elapsed="0.000372"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.042869" elapsed="0.002338"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:55.029706" elapsed="0.015569"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.045478" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:55.045347" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.045328" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.048598" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.045705" elapsed="0.002922"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:55.048679" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:55.048839" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:55.019006" elapsed="0.029859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.048933" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:56:55.049084" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:54.914915" elapsed="0.134195"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.077595" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.077102" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.078471" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.078173" elapsed="0.000446">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.078815" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.077792" elapsed="0.001049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.079477" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.079012" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.079834" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.079992" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.079673" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.080447" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-4-extended-community": {
                "global-administrator": 64496
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.080181" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:55.081006" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.080595" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.081768" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.081242" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.081093" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.080576" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.082515" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.082006" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.082593" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.076478" elapsed="0.006258"/>
</kw>
<msg time="2026-05-01T00:56:55.082795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.063489" elapsed="0.019354"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.095394" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.107862" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.120314" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.120528" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.120709" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.121092" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.120944" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.120928" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.121315" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.121503" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.121675" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.120894" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.120787" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.121903" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.121980" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:55.122118" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.060823" elapsed="0.061322"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.122323" elapsed="0.002380"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.125950" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.125437" elapsed="0.000542"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.126731" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.126136" elapsed="0.000624"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.126956" elapsed="0.000328"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.125026" elapsed="0.002319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.124785" elapsed="0.002594"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.127576" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.127405" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.124765" elapsed="0.002890"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:55.050261" elapsed="0.077442"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:55.049434" elapsed="0.078346"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.049192" elapsed="0.078669"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.049176" elapsed="0.078710"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.127923" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:54.908510" elapsed="0.219546"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:52.767225" elapsed="2.360893"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.177664" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.177261" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.178529" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.178204" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.178694" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.177862" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.179310" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.178885" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.179656" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.179798" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.179516" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.180226" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.179985" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.181479" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.180986" elapsed="0.000542"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.181975" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.181696" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.182805" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.182369" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.184096" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.183535" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.184279" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:55.184600" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.183029" elapsed="0.001598"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.184788" elapsed="0.000381"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:55.182227" elapsed="0.002984"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.185888" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.185483" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.187209" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.186595" elapsed="0.000719"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.187392" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:55.187703" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.186108" elapsed="0.001622"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.187885" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:55.185328" elapsed="0.002967"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.182052" elapsed="0.006279"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.188375" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:55.188553" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:55.180655" elapsed="0.007925"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.180340" elapsed="0.008272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.188790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.188638" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.180320" elapsed="0.008547"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.189603" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.189012" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.189681" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.176641" elapsed="0.013166"/>
</kw>
<msg time="2026-05-01T00:56:55.189861" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.163851" elapsed="0.026057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.202406" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.215000" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.227374" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.227595" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.227780" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.228163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.228013" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.227998" elapsed="0.000307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.228469" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.228645" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.228815" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.227966" elapsed="0.000902"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.227859" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.229043" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.229120" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:55.229253" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.159584" elapsed="0.069696"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.230611" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.230323" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.230776" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.229963" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.231127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.230872" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.231729" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.231418" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.231209" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.230854" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.234400" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.231974" elapsed="0.002453"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:55.234496" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:55.234655" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.229625" elapsed="0.005056"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.236028" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.235786" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.236186" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.235323" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:55.236418" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:56:55.236282" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.236263" elapsed="0.000268"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.236682" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.236858" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.236924" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:55.238900" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.234992" elapsed="0.003935"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.240436" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.240184" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.240900" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.240659" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:55.247866" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:55.248007" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '432'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:55.248105" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:55.243074" elapsed="0.005058"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.241016" elapsed="0.007158"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.248359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.248201" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.240997" elapsed="0.007448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.253661" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.249499" elapsed="0.004234"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.249259" elapsed="0.004523"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.249241" elapsed="0.004579"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.257490" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.254220" elapsed="0.003339"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.253900" elapsed="0.003709"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.253877" elapsed="0.003767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.258422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.257886" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.258924" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.258584" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.259752" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.259278" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.259043" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.258558" elapsed="0.001316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.260426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.260063" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.260782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.260543" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.261329" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.261034" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.260863" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.260524" elapsed="0.000928"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.261625" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:55.262431" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.262142" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.262635" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:55.248835" elapsed="0.016175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.265185" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:55.265080" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.265062" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.268252" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.265401" elapsed="0.002881"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:55.268336" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:55.268512" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:55.239253" elapsed="0.029287"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.268603" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:55.268753" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:55.137037" elapsed="0.131743"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.297251" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.296791" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.298081" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.297810" elapsed="0.000387">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.298376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.297447" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.299032" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.298588" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.299386" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.299554" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.299226" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.300036" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-4-extended-community": {
                "global-administrator": 64496
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.299766" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:55.300617" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.300194" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.301361" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.300853" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.300703" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.300175" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.302105" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.301615" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.302184" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.296156" elapsed="0.006155"/>
</kw>
<msg time="2026-05-01T00:56:55.302369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.283213" elapsed="0.019204"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.314921" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.327400" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.339966" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.340173" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.340352" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.340748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.340600" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.340586" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.340973" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.341201" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.341376" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.340555" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.340430" elapsed="0.001045"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.341665" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.341742" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:55.341882" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.280576" elapsed="0.061333"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.342092" elapsed="0.002387"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.345745" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.345223" elapsed="0.000552"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.346406" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.345933" elapsed="0.000502"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.346613" elapsed="0.000329"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.344808" elapsed="0.002194"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.344562" elapsed="0.002473"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.347213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.347060" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.344543" elapsed="0.002746"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:55.269916" elapsed="0.077421"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:55.269101" elapsed="0.078310"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.268862" elapsed="0.078612"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.268845" elapsed="0.078654"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.347534" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:55.132619" elapsed="0.215041"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:55.128297" elapsed="0.219420"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.397262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.396889" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.398022" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.397810" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.398220" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.397471" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.398818" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.398413" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.399150" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.399277" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.399014" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.399724" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.399480" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.400950" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.400496" elapsed="0.000500"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.401436" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.401164" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.402267" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.401851" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.403534" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.402957" elapsed="0.000680"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.403715" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:55.404015" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.402503" elapsed="0.001538"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.404201" elapsed="0.000453"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:55.401713" elapsed="0.002984"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.405353" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.404951" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.406612" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.406049" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.406789" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:55.407083" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.405587" elapsed="0.001522"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.407263" elapsed="0.000386"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:55.404813" elapsed="0.002877"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.401538" elapsed="0.006188"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.407770" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:55.407929" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:55.400132" elapsed="0.007823"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.399838" elapsed="0.008149"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.408163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.408012" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.399819" elapsed="0.008420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.408986" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.408405" elapsed="0.000610"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.409064" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.396256" elapsed="0.012934"/>
</kw>
<msg time="2026-05-01T00:56:55.409281" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.383421" elapsed="0.025910"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.421999" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.434534" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.447136" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.447345" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.447552" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.447948" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.447797" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.447781" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.448178" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.448348" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.448546" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.447746" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.447634" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.448779" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.448857" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:55.448995" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.379153" elapsed="0.069869"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.450348" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.450084" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.450583" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.449717" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.450934" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.450680" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.451510" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.451196" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.451015" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.450661" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.454283" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.451751" elapsed="0.002563"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:55.454374" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:56:55.454570" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.449355" elapsed="0.005246"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.455958" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.455720" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.456116" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.455333" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:55.456348" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:55.456212" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.456193" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.456626" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.456803" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.456868" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:55.458872" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.454956" elapsed="0.003942"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.460304" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.460054" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.460797" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.460549" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:55.468096" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:55.468237" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '432'} 
 body={"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}} 
 </msg>
<msg time="2026-05-01T00:56:55.468336" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:55.462991" elapsed="0.005371"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.460906" elapsed="0.007532"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.468687" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.468495" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.460888" elapsed="0.007887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.473808" level="INFO">{"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.470171" elapsed="0.003707"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.469861" elapsed="0.004066"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.469835" elapsed="0.004126"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.477414" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.474361" elapsed="0.003115"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.474048" elapsed="0.003465"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.474017" elapsed="0.003522"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.478100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.477711" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.478439" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.478198" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.479005" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.478708" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.478539" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.478180" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.479631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.479253" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.479965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.479728" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.480522" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.480211" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.480046" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.479711" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.480771" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:55.481591" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.481284" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.481776" elapsed="0.002298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:55.469246" elapsed="0.014891"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.484314" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:55.484208" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.484189" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.487404" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.484546" elapsed="0.002888"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:55.487505" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:55.487666" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:55.459217" elapsed="0.028477"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.487794" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:55.487951" level="INFO">${response_text} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:55.356626" elapsed="0.131352"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.516336" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.515865" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.517201" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.516929" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.517517" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.516558" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.518153" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.517713" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.518518" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as_4/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.518668" level="INFO">${template} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.518343" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.519121" level="INFO">{
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
            "med": 0
          },
          "extended-communities": [
            {
              "transitive": true,
              "source-as-4-extended-community": {
                "global-administrator": 64496
              }
            }
          ],
          "ipv4-next-hop": {
            "global": "127.1.1.1"
          },
          "origin": {
            "value": "igp"
          },
          "local-pref": {
            "pref": 100
          }
        },
        "intra-as-i-pmsi-a-d": {
          "route-distinguisher": "1.2.3.4:258",
          "orig-route-ip": "10.10.10.10"
        }
      }
    ]
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.518852" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:55.519656" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.519238" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.520397" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.519891" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.519742" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.519219" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.521170" level="INFO">${final_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.520650" elapsed="0.000549"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.521249" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.515224" elapsed="0.006152"/>
</kw>
<msg time="2026-05-01T00:56:55.521434" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.502411" elapsed="0.019096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.533964" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.546337" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.558813" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.559011" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.559189" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.559583" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.559418" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.559404" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.559805" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.559978" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.560145" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.559373" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.559267" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.560373" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.560462" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:56:55.560605" level="INFO">${expected_text} = {
  "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
      {
        "route-key": "AQwAAQECAwQBAgoKCgo=",
        "path-id": 0,
        "attributes": {
          "multi-exit-disc": {
          ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.499759" elapsed="0.060873"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.560810" elapsed="0.002339"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.564396" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.563899" elapsed="0.000526"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.565124" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
  "mvpn-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "source-as-4-extended-community": {
        "global-administrator": 6449...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.564607" elapsed="0.000576"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.565352" elapsed="0.000349"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:55.563488" elapsed="0.002273"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.563230" elapsed="0.002565"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.565975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.565821" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.563212" elapsed="0.002841"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:55.489166" elapsed="0.076935"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:55.488307" elapsed="0.077869"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.488063" elapsed="0.078158"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.488045" elapsed="0.078200"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.566278" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:55.352247" elapsed="0.214157"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:55.347892" elapsed="0.218589"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:55.566649" elapsed="0.004892"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.626725" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.626316" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.627523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.627266" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.627698" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.626928" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.628278" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.627893" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.628629" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.628778" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.628488" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.629208" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.628966" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.630592" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.630257" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.631095" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.630811" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.632019" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.631579" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.633320" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.632741" elapsed="0.000744"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.633574" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:55.633890" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.632247" elapsed="0.001676"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.634115" elapsed="0.000417"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:55.631408" elapsed="0.003167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.635266" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.634837" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:55.636568" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.635978" elapsed="0.000695"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:55.636755" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:55.637063" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:55.635509" elapsed="0.001580"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.637248" elapsed="0.000434"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:55.634697" elapsed="0.003029"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.631224" elapsed="0.006538"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:55.637806" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:55.637969" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:55.629710" elapsed="0.008284"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.629330" elapsed="0.008698"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.638206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.638054" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.629308" elapsed="0.008977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.639038" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.638433" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.639118" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.625675" elapsed="0.013574"/>
</kw>
<msg time="2026-05-01T00:56:55.639304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.613049" elapsed="0.026304"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.652004" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.664494" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.676844" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.677047" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.677226" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.677612" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.677446" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.677431" elapsed="0.000288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.677865" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.678034" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.678201" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.677402" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.677300" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.678426" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.678519" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:55.678640" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.608810" elapsed="0.069856"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.679909" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.679674" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.680065" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.679318" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.680407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.680160" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.681176" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.680686" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.680506" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.680142" elapsed="0.001119"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.683639" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.681417" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:55.683718" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:55.683874" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.678992" elapsed="0.004907"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.685086" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.684901" elapsed="0.000269"/>
</kw>
<msg time="2026-05-01T00:56:55.685256" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.684561" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.685505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:55.685350" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.685332" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.685897" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.686022" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.685731" elapsed="0.000315"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:55.686434" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.686205" elapsed="0.000277"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:55.686531" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:56:55.686688" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:55.684216" elapsed="0.002496"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.688095" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.687851" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.688549" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.688294" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:55.695622" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:55.696118" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '577'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:56:55.696217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:55.690777" elapsed="0.005465"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.688657" elapsed="0.007628"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.696485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.696311" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.688639" elapsed="0.007933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.700901" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv4:mvpn-routes-ipv4":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAQECAwQBAgoKCgo=","attributes":{"local-pref":{"pref":100},"ipv4-next-hop":{"global":"127.1.1.1"},"multi-exit-disc":{"med":0},"origin":{"value":"igp"},"extended-communities":[{"transitive":true,"source-as-4-extended-community":{"global-administrator":64496}}]},"intra-as-i-pmsi-a-d":{"route-distinguisher":"1.2.3.4:258","orig-route-ip":"10.10.10.10"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.697593" elapsed="0.003378"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.697350" elapsed="0.003669"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.697332" elapsed="0.003721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.704862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.701441" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.701130" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.701107" elapsed="0.003907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.705913" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.705247" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.706300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.706021" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.706876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.706576" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.706383" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.706002" elapsed="0.000958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.707498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.707123" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.707833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.707596" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.708369" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.708080" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.707912" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.707578" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.708620" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:55.709399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.709124" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:55.709598" elapsed="0.002328"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:55.696933" elapsed="0.015057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.712166" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:55.712059" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.712041" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.715288" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.712381" elapsed="0.002935"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:55.715369" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:55.715544" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:55.687022" elapsed="0.028550"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.715635" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:55.715787" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:55.586356" elapsed="0.129457"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.744191" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.743743" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.745014" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.744750" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:55.745334" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:55.744387" elapsed="0.000973"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.746001" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:55.745548" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:55.746352" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:55.746501" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:55.746196" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.746959" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:55.746688" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:55.747491" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.747074" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.748225" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:55.747728" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:55.747579" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:55.747055" elapsed="0.001256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.748945" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:55.748475" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:55.749027" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:55.743109" elapsed="0.006044"/>
</kw>
<msg time="2026-05-01T00:56:55.749206" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.730272" elapsed="0.018982"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.761710" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.774270" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.786631" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.786859" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.787037" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.787411" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.787264" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:55.787250" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.787655" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.787826" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.787994" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:55.787220" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.787114" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.788225" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.788300" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:55.788418" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:55.727568" elapsed="0.060877"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:55.788642" elapsed="0.003340"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.793026" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.792740" elapsed="0.000315"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:55.793849" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:55.793211" elapsed="0.000666"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:56:55.794375" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
    "mvpn-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "source-as-4-extended-community": {
          "global-administrator": 64496
         },
         "transitive": true
        }
       ],
       "ipv4-next-hop": {
        "global": "127.1.1.1"
       },
       "local-pref": {
        "pref": 100
       },
       "multi-exit-disc": {
        "med": 0
       },
       "origin": {
        "value": "igp"
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "10.10.10.10",
       "route-distinguisher": "1.2.3.4:258"
      },
      "path-id": 0,
      "route-key": "AQwAAQECAwQBAgoKCgo="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:56:55.794616" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "127.1.1.1"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.794036" elapsed="0.000651">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.792309" elapsed="0.002577">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:55.792063" elapsed="0.002918">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:55.795171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:55.795017" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:55.792045" elapsed="0.003206">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.717001" elapsed="0.078398">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.716137" elapsed="0.079450">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:55.715896" elapsed="0.079794">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:56:55.715879" elapsed="0.079847">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:55.795800" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:55.578886" elapsed="0.217062">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,40 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv4:mvpn-routes-ipv4": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "source-as-4-extended-community": {
+          "global-administrator": 64496
+         },
+         "transitive": true
+        }
+       ],
+       "ipv4-next-hop": {
    [ Message content over the limit has been removed. ]
+       },
+       "multi-exit-disc": {
+        "med": 0
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "10.10.10.10",
+       "route-distinguisher": "1.2.3.4:258"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAQECAwQBAgoKCgo="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.851698" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.851281" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.852536" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:57.852256" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:57.852708" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:57.851912" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.853292" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:57.852904" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.853644" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:57.853809" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:57.853499" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.854241" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.853998" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.855391" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.855060" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.855899" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.855630" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.856725" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:57.856298" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:57.857977" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.857405" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:57.858159" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:56:57.858477" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:57.856945" elapsed="0.001560"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.858667" elapsed="0.000401"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:56:57.856157" elapsed="0.002953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.859794" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:57.859367" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:57.861038" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.860487" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:57.861274" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:56:57.861594" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:57.860011" elapsed="0.001610"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.861782" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:57.859227" elapsed="0.002973"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:57.855979" elapsed="0.006257"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:57.862280" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:57.862441" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:57.854687" elapsed="0.007797"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.854365" elapsed="0.008153"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.862699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.862544" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.854341" elapsed="0.008436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.863556" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:57.862959" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:57.863635" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:57.850634" elapsed="0.013129"/>
</kw>
<msg time="2026-05-01T00:56:57.863818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:57.837670" elapsed="0.026199"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.876789" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.889245" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.901709" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.901910" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.902088" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.902479" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.902311" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:57.902296" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.902707" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.902921" elapsed="0.000042"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.903119" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:57.902266" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:57.902163" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.903350" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:57.903427" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:57.903565" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:57.833328" elapsed="0.070264"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.904888" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:57.904647" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:57.905052" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:57.904284" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.905398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.905147" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.905981" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.905688" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.905497" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.905129" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.908448" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:57.906218" elapsed="0.002274"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:57.908548" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:57.908709" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:57.903923" elapsed="0.004812"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.909946" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:56:57.909753" elapsed="0.000245"/>
</kw>
<msg time="2026-05-01T00:56:57.910082" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:57.909388" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:56:57.910313" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:57.910177" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.910159" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.910716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:57.910863" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:57.910550" elapsed="0.000338"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:56:57.911320" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:56:57.911080" elapsed="0.000267"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:56:57.911435" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:56:57.911613" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:57.909055" elapsed="0.002584"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.913042" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.912796" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.913498" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.913243" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:57.921402" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:57.921747" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:56:57.922035" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:56:57.915900" elapsed="0.006224"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.913608" elapsed="0.008656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.922776" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.922336" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.913590" elapsed="0.009402"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.930151" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.925695" elapsed="0.004523"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.925105" elapsed="0.005164"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.925059" elapsed="0.005246"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.934005" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.930727" elapsed="0.003345"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.930384" elapsed="0.003738"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.930360" elapsed="0.003798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.935036" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:57.934412" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.935589" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.935216" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.936272" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.935941" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.935706" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.935189" elapsed="0.001167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.936900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:57.936536" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.937236" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.936998" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.937796" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.937500" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.937317" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.936980" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:57.938035" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:56:57.938868" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:57.938573" elapsed="0.000357"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:56:57.939120" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:56:57.923993" elapsed="0.017531"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:57.941704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:57.941596" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.941577" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:57.944672" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:57.941926" elapsed="0.002784"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:56:57.944765" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:56:57.944926" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:56:57.911956" elapsed="0.032997"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:57.945016" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:56:57.945168" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:56:57.810830" elapsed="0.134364"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.974318" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.973841" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.975193" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:57.974888" elapsed="0.000459">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:57.975543" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:57.974544" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.976184" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:57.975739" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:57.976557" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:57.976708" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:57.976379" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.977163" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:57.976896" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:56:57.977713" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:57.977279" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.978484" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:57.977952" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.977800" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.977259" elapsed="0.001358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:57.979283" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:57.978769" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:57.979363" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:57.973191" elapsed="0.006326"/>
</kw>
<msg time="2026-05-01T00:56:57.979572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:57.959869" elapsed="0.019753"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:57.992279" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.004728" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.017331" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.017545" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.017727" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.018110" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.017962" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:58.017948" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.018335" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.018523" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.018695" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:58.017917" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.017808" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.018925" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.019001" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:58.019118" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:57.957190" elapsed="0.062032"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:58.019426" elapsed="0.002223"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:58.022699" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:58.022388" elapsed="0.000339"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:56:58.023153" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:56:58.022884" elapsed="0.000296"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:56:58.023339" elapsed="0.000372"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:56:58.021974" elapsed="0.001797"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:58.021730" elapsed="0.002074"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.023983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.023830" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.021711" elapsed="0.002350"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:56:57.946336" elapsed="0.077773"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:56:57.945540" elapsed="0.078644"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:57.945278" elapsed="0.078951"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:57.945261" elapsed="0.078992"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:56:58.024287" elapsed="0.000027"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:56:57.805646" elapsed="0.218766"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:55.571944" elapsed="2.452545"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:58.024709" elapsed="0.002634"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:56:52.757224" elapsed="5.270201"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:52.664400" elapsed="5.363167"/>
</test>
<test id="s1-s16-t26" name="Play_To_Odl_intra_ipv6" line="158">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:56:58.030647" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:56:58.030362" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.031943" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:58.031833" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.031814" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.039157" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:58.039006" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.038981" elapsed="0.000274"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.040569" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:58.040134" elapsed="0.000463"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.041069" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:56:58.040759" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:56:58.041179" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:56:58.041339" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:56:58.039638" elapsed="0.001725"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.046807" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:58.046700" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.046681" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.048069" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:58.047962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.047944" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:56:58.048605" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.048284" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:56:58.049014" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:58.048795" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:56:58.079085" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:56:58.049556" elapsed="0.029633"/>
</kw>
<msg time="2026-05-01T00:56:58.079354" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:56:58.079401" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:58.049201" elapsed="0.030237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:56:58.103003" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:56:58.080006" elapsed="0.023102"/>
</kw>
<msg time="2026-05-01T00:56:58.103266" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:56:58.103311" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:58.079661" elapsed="0.023687"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.103707" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.103425" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.103405" elapsed="0.000384"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.104235" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "i "n "t "r "a "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:58.103935" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.104607" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.104370" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.104352" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:56:58.104719" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:56:58.107191" elapsed="0.000296"/>
</kw>
<msg time="2026-05-01T00:56:58.107551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:58.106162" elapsed="0.001529"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.107974" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.108353" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:56:58.105543" elapsed="0.003020"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:56:58.104992" elapsed="0.003636"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:56:58.047660" elapsed="0.061102"/>
</kw>
<msg time="2026-05-01T00:56:58.108854" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:58.108899" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:58.047032" elapsed="0.061905"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:56:58.109122" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:58.109014" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.108996" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.109628" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.109965" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.110036" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:56:58.046348" elapsed="0.063795"/>
</kw>
<msg time="2026-05-01T00:56:58.110234" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:56:58.110278" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "P "l "a "y "_ "T "o "_ "O "d...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:58.041754" elapsed="0.068560"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.110657" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.110388" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.110371" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:56:58.041608" elapsed="0.069148"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:56:58.041417" elapsed="0.069369"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:56:58.038501" elapsed="0.072339"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:56:58.031545" elapsed="0.079349"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:56:58.031070" elapsed="0.079868"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:56:58.028222" elapsed="0.082768"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.112125" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.111640" elapsed="0.000513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.112782" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.112322" elapsed="0.000488"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.113347" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.112977" elapsed="0.000396"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.113754" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/announce_intra_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/announce_intra_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:58.113901" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004b02000000344001010040020040050400000064800e230002051020010db800010000000000000000000600010c0001ac10002c0065c0a86401
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:58.113559" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.114273" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/withdraw_intra_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/withdraw_intra_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:58.114396" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003902000000224001010040020040050400000064800f11000205010c0001ac10002c0065c0a86401</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:58.114084" elapsed="0.000338"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:56:58.114629" elapsed="0.003782"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:56:58.118592" elapsed="0.003963"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.175960" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:58.175559" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.176759" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.176511" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:58.176930" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:58.176158" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.177523" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:58.177123" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.177851" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:56:58.177989" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:56:58.177714" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.178414" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:58.178173" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.179481" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:58.179168" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.179983" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.179691" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.180799" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:58.180376" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:58.182040" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.181491" elapsed="0.000649"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:58.182218" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:56:58.182538" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:58.181018" elapsed="0.001547"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.182724" elapsed="0.000386"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:56:58.180236" elapsed="0.002915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.183825" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:56:58.183405" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:56:58.185111" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.184545" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:56:58.185300" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:56:58.185615" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:56:58.184068" elapsed="0.001573"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:56:58.185796" elapsed="0.000369"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:56:58.183268" elapsed="0.003053"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:56:58.180062" elapsed="0.006298"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:56:58.186404" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:56:58.186583" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:56:58.178846" elapsed="0.007763"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:58.178549" elapsed="0.008091"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.186818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.186666" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.178527" elapsed="0.008368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.187808" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:56:58.187042" elapsed="0.000795"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:56:58.187886" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:56:58.174925" elapsed="0.013104"/>
</kw>
<msg time="2026-05-01T00:56:58.188086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:56:58.162245" elapsed="0.025890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.200649" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.213108" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.225427" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.225638" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.225817" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.226181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.226034" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:58.226020" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.226401" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.226588" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.226756" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:56:58.225992" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.225892" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.227021" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.227098" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:56:58.227221" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:56:58.157989" elapsed="0.069259"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.228554" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.228288" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:58.228712" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:58.227920" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.229054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.228807" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.229621" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:56:58.229313" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:58.229135" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.228789" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.232024" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:56:58.229857" elapsed="0.002193"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:56:58.232102" elapsed="0.000063"/>
</return>
<msg time="2026-05-01T00:56:58.232292" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:58.227592" elapsed="0.004725"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:56:58.233553" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.233301" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:56:58.233709" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:56:58.232961" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:56:58.233940" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:56:58.233805" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:56:58.233786" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.234173" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.234345" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.234409" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:56:58.236517" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:56:58.232639" elapsed="0.003905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.237943" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:58.237694" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:56:58.238386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:56:58.238144" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:56:58.246043" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:56:58.246181" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:56:58.246279" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.240658" elapsed="0.006023">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</kw>
<status status="FAIL" start="2026-05-01T00:56:58.238551" elapsed="0.008214">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.246955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.246799" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:56:58.238533" elapsed="0.008514">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.247424" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.247590" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:56:58.247553" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:58.247536" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.247798" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.247867" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.236862" elapsed="0.011110">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.248047" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.134981" elapsed="0.113161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:56:58.248477" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:56:58.248281" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:56:58.248263" elapsed="0.000310"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:56:58.248604" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:56:58.128935" elapsed="0.119765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.306736" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.306288" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.307600" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.307301" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.307777" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.306958" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.308357" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:00.307969" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.308706" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:00.308881" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:00.308564" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.309308" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.309066" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.310391" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.310078" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.310914" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.310624" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.311742" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.311310" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:00.313006" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.312414" elapsed="0.000698"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:00.313195" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:00.313528" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:00.311961" elapsed="0.001594"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.313712" elapsed="0.000386"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:00.311173" elapsed="0.002971"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.314850" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.314395" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:00.316128" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.315579" elapsed="0.000654"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:00.316310" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:00.316709" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:00.315066" elapsed="0.001671"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.316895" elapsed="0.000376"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:00.314260" elapsed="0.003052"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:00.310993" elapsed="0.006406"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:00.317446" elapsed="0.001448"/>
</return>
<msg time="2026-05-01T00:57:00.319040" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:00.309756" elapsed="0.009311"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.309431" elapsed="0.009670"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.319288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.319131" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.309408" elapsed="0.009958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.320113" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.319527" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:00.320192" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:00.305666" elapsed="0.014651"/>
</kw>
<msg time="2026-05-01T00:57:00.320372" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:00.292690" elapsed="0.027731"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.332979" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.345387" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.357839" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.358041" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.358217" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.358606" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.358439" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:00.358424" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.358832" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.359020" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.359191" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:00.358395" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.358291" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.359474" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.359554" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:00.359677" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:00.288407" elapsed="0.071296"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.360975" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.360730" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.361137" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.360362" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.361501" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.361233" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.362060" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.361766" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.361585" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.361215" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.364516" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:00.362300" elapsed="0.002244"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:00.364596" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:00.364752" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:00.360032" elapsed="0.004745"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.365996" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.365766" elapsed="0.000292">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.366151" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.365409" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:00.366381" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:00.366246" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.366228" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.366637" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.366809" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.366885" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:00.369013" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:00.365085" elapsed="0.003955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.370467" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.370201" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.370946" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.370675" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:00.380080" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:00.380589" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '305'} 
 body={"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:00.380745" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:00.373186" elapsed="0.007596"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.371064" elapsed="0.009779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.381104" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.380881" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.371045" elapsed="0.010181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.386072" level="INFO">{"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.382671" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.382335" elapsed="0.003854"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.382310" elapsed="0.003914"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.390012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.386777" elapsed="0.003300"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.386439" elapsed="0.003686"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.386416" elapsed="0.003744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.390979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.390393" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.391481" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.391123" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.392215" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.391830" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.391598" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.391097" elapsed="0.001203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.392840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.392478" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.393173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.392938" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.393728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.393419" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.393255" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.392920" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:00.393964" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:00.394771" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.394490" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.394965" elapsed="0.002302"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:00.381748" elapsed="0.015582"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.397577" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:00.397452" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.397429" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:00.400603" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.397798" elapsed="0.002835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:00.400687" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:00.400845" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:00.369360" elapsed="0.031512"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:00.400936" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:00.401084" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:00.265047" elapsed="0.136063"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.429805" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.429339" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.430622" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.430336" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.430916" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.430000" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.431600" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:00.431139" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.431950" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:00.432105" level="INFO">${template} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:00.431792" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.432581" level="INFO">{
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d": {
                    "route-distinguisher": "172.16.0.44:101",
                    "orig-route-ip": "192.168.100.1"
                },
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::6"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                      "pref": 100
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.432296" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:00.433101" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.432699" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.433861" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.433335" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.433185" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.432681" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.434596" level="INFO">${final_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.434094" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:00.434711" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:00.428719" elapsed="0.006122"/>
</kw>
<msg time="2026-05-01T00:57:00.434897" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:00.415897" elapsed="0.019048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.447386" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.459789" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.472301" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.472516" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.472698" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.473066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.472919" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:00.472905" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.473290" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.473477" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.473648" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:00.472876" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.472774" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.473876" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.473952" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:00.474087" level="INFO">${expected_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:00.413204" elapsed="0.060910"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:00.474333" elapsed="0.002220"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:00.477695" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.477288" elapsed="0.000436"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:00.478254" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.477881" elapsed="0.000401"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:00.478441" elapsed="0.000340"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:00.476878" elapsed="0.001964"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.476636" elapsed="0.002241"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.479054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.478902" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.476617" elapsed="0.002513"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:00.402250" elapsed="0.076927"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:00.401433" elapsed="0.077845"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.401194" elapsed="0.078131"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.401177" elapsed="0.078172"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:00.479383" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:00.258767" elapsed="0.220759"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:56:58.122802" elapsed="2.356783"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.531953" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.531566" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.532751" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.532510" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.532918" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.532157" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.533512" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:00.533110" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.533843" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:00.533992" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:00.533705" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.534427" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.534184" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.535599" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.535255" elapsed="0.000391"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.536081" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.535811" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.536909" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.536503" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:00.538166" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.537612" elapsed="0.000656"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:00.538351" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:57:00.538678" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:00.537135" elapsed="0.001570"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.538864" elapsed="0.000383"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:00.536338" elapsed="0.002951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.540041" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:00.539578" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:00.541271" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.540736" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:00.541451" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:57:00.541762" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:00.540262" elapsed="0.001526"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:00.541942" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:00.539425" elapsed="0.002926"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:00.536160" elapsed="0.006226"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:00.542430" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:57:00.542608" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:00.534932" elapsed="0.007702"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.534627" elapsed="0.008039"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.542845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.542692" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.534604" elapsed="0.008317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.543862" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:00.543068" elapsed="0.000824"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:00.543941" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:00.530859" elapsed="0.013209"/>
</kw>
<msg time="2026-05-01T00:57:00.544127" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:00.517258" elapsed="0.026918"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.556694" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.569607" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.581997" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.582212" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.582404" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.582832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.582680" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:00.582663" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.583058" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.583226" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.583392" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:00.582625" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.582502" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.583687" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.583768" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:00.583924" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:00.512536" elapsed="0.071417"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.585327" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.585039" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.585517" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.584659" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.585872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:00.585615" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.586433" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:00.586140" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.585954" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.585595" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.588879" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:00.586689" elapsed="0.002217"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:00.589013" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:00.589175" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:00.584290" elapsed="0.004910"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:00.590423" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:00.590192" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:00.590597" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:00.589854" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:00.590829" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:00.590693" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.590674" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.591063" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:00.591236" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:00.591301" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:00.593418" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:00.589530" elapsed="0.003916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.594880" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.594629" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:00.595446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:00.595081" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:01.098621" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:01.098946" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '305'} 
 body={"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:01.099245" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:00.597664" elapsed="0.501644"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:00.595595" elapsed="0.503827"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.099943" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.099526" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:00.595576" elapsed="0.504568"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.107201" level="INFO">{"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.102686" elapsed="0.004589"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.102136" elapsed="0.005190"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.102093" elapsed="0.005270"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.111244" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.107801" elapsed="0.003511"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.107446" elapsed="0.003917"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.107421" elapsed="0.003980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.112253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.111683" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.112922" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.112517" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.113556" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.113240" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.113050" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.112489" elapsed="0.001152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.114166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.113806" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.114514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.114263" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.115051" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.114760" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.114597" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.114245" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.115290" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:01.116121" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.115822" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.116303" elapsed="0.002546"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:01.101110" elapsed="0.017803"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.119096" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:01.118984" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.118965" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.122137" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.119318" elapsed="0.002849"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:01.122220" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:01.122390" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:00.593783" elapsed="0.528635"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.122508" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:01.122665" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:00.488861" elapsed="0.633830"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.151200" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.150730" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.152075" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.151768" elapsed="0.000474">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.152427" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.151397" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.153114" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.152641" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.153485" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.153676" level="INFO">${template} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.153307" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.154126" level="INFO">{
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d": {
                    "route-distinguisher": "172.16.0.44:101",
                    "orig-route-ip": "192.168.100.1"
                },
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::6"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                      "pref": 100
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.153862" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:01.154663" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.154244" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.155403" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.154897" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.154748" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.154226" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.156145" level="INFO">${final_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.155656" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.156224" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:01.150095" elapsed="0.006256"/>
</kw>
<msg time="2026-05-01T00:57:01.156407" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.137417" elapsed="0.019060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.168849" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.181230" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.193849" elapsed="0.000074"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.194111" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.194292" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.194705" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.194556" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:01.194542" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.194931" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.195100" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.195269" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:01.194509" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.194376" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.195519" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.195597" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:01.195736" level="INFO">${expected_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:01.134739" elapsed="0.061023"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.195940" elapsed="0.002189"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.199357" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.198884" elapsed="0.000503"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.199942" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.199563" elapsed="0.000407"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:01.200130" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:01.198469" elapsed="0.002066"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.198209" elapsed="0.002360"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.200746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.200594" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.198191" elapsed="0.002631"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:01.123831" elapsed="0.077039"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:01.123019" elapsed="0.077926"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.122775" elapsed="0.078256"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.122758" elapsed="0.078298"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.201091" elapsed="0.000061"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:00.484015" elapsed="0.717242"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:00.479761" elapsed="0.721558"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.250663" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.250272" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.251498" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.251259" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.251663" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.250882" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.252235" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.251855" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.252576" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.252712" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.252424" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.253137" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.252897" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.254185" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.253903" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.254687" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.254393" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.255487" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.255069" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:01.256734" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.256167" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:01.256914" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:01.257210" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:01.255708" elapsed="0.001528"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.257422" elapsed="0.000398"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:01.254931" elapsed="0.002931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.258527" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.258114" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:01.259755" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.259193" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:01.259933" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:01.260260" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:01.258742" elapsed="0.001544"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.260442" elapsed="0.000385"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:01.257977" elapsed="0.002893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:01.254762" elapsed="0.006144"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:01.260948" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:01.261105" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:01.253579" elapsed="0.007552"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.253269" elapsed="0.007893"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.261349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.261187" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.253234" elapsed="0.008192"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.262317" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.261585" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.262394" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:01.249658" elapsed="0.012880"/>
</kw>
<msg time="2026-05-01T00:57:01.262593" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.236950" elapsed="0.025691"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.275522" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.287896" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.300133" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.300328" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.300518" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.300881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.300736" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:01.300721" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.301100" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.301268" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.301502" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:01.300693" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.300593" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.301732" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.301808" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:01.301928" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:01.232591" elapsed="0.069363"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.303198" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.302963" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.303355" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.302624" elapsed="0.000755"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.303715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.303453" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.304259" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.303970" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.303796" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.303431" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.306699" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.304513" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:01.306778" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:01.306931" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:01.302281" elapsed="0.004674"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.308175" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.307943" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.308330" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.307608" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:01.308579" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:01.308425" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.308408" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.308812" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.308984" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.309049" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:01.311142" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:01.307268" elapsed="0.003901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.312569" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.312308" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.313051" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.312807" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:01.321890" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:01.322023" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '305'} 
 body={"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:01.322137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:01.315247" elapsed="0.006916"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.313161" elapsed="0.009045"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.322388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.322232" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.313143" elapsed="0.009354"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.325950" level="INFO">{"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.323511" elapsed="0.002487"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.323272" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.323255" elapsed="0.002802"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.329991" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.326437" elapsed="0.003620"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.326112" elapsed="0.003997"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.326096" elapsed="0.004049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.330968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.330391" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.331483" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.331110" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.332284" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.331849" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.331605" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.331085" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.333194" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.332666" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.333734" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.333334" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.334395" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.334096" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.333854" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.333309" elapsed="0.001184"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.334645" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:01.335432" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.335153" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.335632" elapsed="0.002379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:01.322859" elapsed="0.015216"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.338251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:01.338146" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.338127" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.341220" level="INFO">${text_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.338480" elapsed="0.002769"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:01.341301" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:01.341506" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:01.311498" elapsed="0.030040"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.341609" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:01.341770" level="INFO">${response_text} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:01.210152" elapsed="0.131644"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.372753" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.372287" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.373699" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.373334" elapsed="0.000492">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.374005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.372984" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.374672" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.374205" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.375030" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.375177" level="INFO">${template} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.374867" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.375656" level="INFO">{
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d": {
                    "route-distinguisher": "172.16.0.44:101",
                    "orig-route-ip": "192.168.100.1"
                },
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::6"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                      "pref": 100
                    }
                }
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.375365" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:01.376181" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.375777" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.376945" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.376418" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.376268" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.375757" elapsed="0.001311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.377753" level="INFO">${final_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.377220" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.377833" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:01.371669" elapsed="0.006293"/>
</kw>
<msg time="2026-05-01T00:57:01.378020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.357620" elapsed="0.020449"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.391882" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.404268" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.416829" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.417027" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.417209" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.417602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.417438" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:01.417424" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.417840" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.418009" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.418175" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:01.417394" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.417288" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.418402" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.418493" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:01.418630" level="INFO">${expected_text} = {
    "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
        "mvpn-route": [
            {
                "route-key": "AQwAAawQACwAZcCoZAE=",
                "path-id": 0,
                "intra-as-i-pmsi-a-d"...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:01.354898" elapsed="0.063791"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.418873" elapsed="0.002191"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.422244" level="INFO">${expected_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.421853" elapsed="0.000420"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.422818" level="INFO">${actual_normalized} = {
 "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
  "mvpn-route": [
   {
    "attributes": {
     "ipv6-next-hop": {
      "global": "2001:db8:1::6"
     },
     "local-pref": {
      "pref": 100
     },
     "o...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.422429" elapsed="0.000417"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:01.423001" elapsed="0.000328"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:01.421392" elapsed="0.001995"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.421147" elapsed="0.002273"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.423614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.423445" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.421126" elapsed="0.002564"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:01.342938" elapsed="0.080799"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:01.342125" elapsed="0.081685"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.341881" elapsed="0.081973"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.341863" elapsed="0.082014"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.423911" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:01.205820" elapsed="0.218216"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:01.201514" elapsed="0.222580"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:01.424258" elapsed="0.002801"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.479312" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.478940" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.480098" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.479857" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.480258" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.479523" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.480852" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.480467" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.481228" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.481367" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.481086" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.481817" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.481571" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.482869" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.482586" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.483348" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.483078" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.484164" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.483763" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:01.485400" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.484856" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:01.485599" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:01.485936" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:01.484383" elapsed="0.001581"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.486124" elapsed="0.000407"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:01.483624" elapsed="0.002949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.487234" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.486829" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:01.488564" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.488007" elapsed="0.000658"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:01.488743" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:01.489035" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:01.487556" elapsed="0.001506"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.489222" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:01.486690" elapsed="0.002956"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:01.483425" elapsed="0.006257"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:01.489726" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:01.489897" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:01.482244" elapsed="0.007679"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.481948" elapsed="0.008033"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.490166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.490008" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.481929" elapsed="0.008315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.491195" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.490391" elapsed="0.000833"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.491273" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:01.478309" elapsed="0.013089"/>
</kw>
<msg time="2026-05-01T00:57:01.491467" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.465639" elapsed="0.025913"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.504186" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.516546" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.528939" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.529137" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.529315" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.529701" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.529552" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:01.529538" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.529924" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.530110" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.530278" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:01.529507" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.529388" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.530521" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.530600" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:01.530719" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:01.461218" elapsed="0.069529"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.532008" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.531766" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.532170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.531404" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.532566" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.532266" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.533120" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.532831" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.532650" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.532248" elapsed="0.000955"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.535582" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.533358" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:01.535662" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:01.535818" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:01.531076" elapsed="0.004767"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.537029" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.536833" elapsed="0.000249"/>
</kw>
<msg time="2026-05-01T00:57:01.537166" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.536494" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.537395" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:01.537261" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.537243" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.537796" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.538046" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.537632" elapsed="0.000441"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:01.538492" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.538239" elapsed="0.000280"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:01.538567" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:01.538721" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:01.536151" elapsed="0.002595"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.540203" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.539888" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.540664" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.540406" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:01.548375" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:01.548806" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '450'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:01.548921" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:01.543048" elapsed="0.005900"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.540773" elapsed="0.008217"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.549179" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.549017" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.540755" elapsed="0.008547"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.553502" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-mvpn-ipv6:mvpn-routes-ipv6":{"mvpn-route":[{"path-id":0,"route-key":"AQwAAawQACwAZcCoZAE=","intra-as-i-pmsi-a-d":{"orig-route-ip":"192.168.100.1","route-distinguisher":"172.16.0.44:101"},"attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv6-next-hop":{"global":"2001:db8:1::6"}}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.550380" elapsed="0.003193"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.550152" elapsed="0.003469"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.550133" elapsed="0.003524"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.557327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.554063" elapsed="0.003328"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.553735" elapsed="0.003704"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.553711" elapsed="0.003792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.558305" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.557742" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.558803" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.558443" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.559446" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.559148" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.558916" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.558417" elapsed="0.001131"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.560069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.559711" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.560400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.560166" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.560956" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.560667" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.560501" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.560148" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.561191" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:01.561991" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.561715" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:01.562197" elapsed="0.002309"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:01.549690" elapsed="0.014878"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.564743" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:01.564638" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.564620" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.567774" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.564959" elapsed="0.002845"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:01.567856" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:01.568014" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:01.539058" elapsed="0.028983"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.568104" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:01.568254" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:01.438675" elapsed="0.129639"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.596553" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.596084" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.597358" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.597083" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:01.597669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:01.596750" elapsed="0.000944"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.598327" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:01.597864" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:01.598706" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:01.598844" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:01.598545" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.599296" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:01.599031" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:01.599832" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.599410" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.600582" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:01.600066" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:01.599917" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:01.599391" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.601296" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:01.600816" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:01.601375" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:01.595466" elapsed="0.006060"/>
</kw>
<msg time="2026-05-01T00:57:01.601581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.582837" elapsed="0.018793"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.614050" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.626533" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.639066" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.639269" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.639450" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.639847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.639699" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:01.639685" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.640067" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.640237" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.640403" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:01.639654" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.639544" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.640653" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.640728" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:01.640845" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:01.580161" elapsed="0.060711"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:01.641051" elapsed="0.002316"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.644427" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.644129" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:01.645171" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
    "mvpn-route": [
     {
      "attributes":...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:01.644630" elapsed="0.000570"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:01.645699" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
    "mvpn-route": [
     {
      "attributes": {
       "ipv6-next-hop": {
        "global": "2001:db8:1::6"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "intra-as-i-pmsi-a-d": {
       "orig-route-ip": "192.168.100.1",
       "route-distinguisher": "172.16.0.44:101"
      },
      "path-id": 0,
      "route-key": "AQwAAawQACwAZcCoZAE="
     }
    ]
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:01.645917" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.645357" elapsed="0.000630">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.643717" elapsed="0.002416">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:01.643470" elapsed="0.002740">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:01.646429" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:01.646244" elapsed="0.000262"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:01.643431" elapsed="0.003099">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.569473" elapsed="0.077179">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.568662" elapsed="0.078131">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:01.568400" elapsed="0.078480">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:01.568383" elapsed="0.078531">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:01.646989" elapsed="0.000018"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:01.432312" elapsed="0.214800">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,29 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-mvpn-ipv6:mvpn-routes-ipv6": {
+    "mvpn-route": [
+     {
+      "attributes": {
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::6"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "intra-as-i-pmsi-a-d": {
+       "orig-route-ip": "192.168.100.1",
+       "route-distinguisher": "172.16.0.44:101"
+      },
+      "path-id": 0,
+      "route-key": "AQwAAawQACwAZcCoZAE="
+     }
+    ]
+   },
    "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.703825" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.703403" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.704679" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:03.704379" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:03.704852" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:03.704040" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.705431" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:03.705047" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.705784" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:03.705958" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:03.705641" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.706391" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.706146" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.707533" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.707200" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.708018" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.707748" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.708844" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.708415" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:03.710097" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.709545" elapsed="0.000653"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:03.710283" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:03.710599" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:03.709064" elapsed="0.001561"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.710784" elapsed="0.000402"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:03.708275" elapsed="0.002952"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.711897" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.711496" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:03.713127" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.712589" elapsed="0.000638"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:03.713303" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:03.713700" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:03.712112" elapsed="0.001615"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.713884" elapsed="0.000379"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:03.711344" elapsed="0.002962"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:03.708095" elapsed="0.006248"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:03.714386" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:03.714562" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:03.706869" elapsed="0.007718"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.706529" elapsed="0.008090"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.714796" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.714645" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.706506" elapsed="0.008393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.715831" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.715045" elapsed="0.000815"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:03.715910" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:03.702758" elapsed="0.013276"/>
</kw>
<msg time="2026-05-01T00:57:03.716088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:03.690034" elapsed="0.026102"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.728648" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.741061" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.753363" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.753574" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.753751" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.754125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.753976" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:03.753961" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.754350" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.754534" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.754755" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:03.753932" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.753831" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.755022" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.755101" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:03.755219" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:03.685760" elapsed="0.069485"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.756523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:03.756261" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:03.756692" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:03.755919" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.757035" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.756787" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.757612" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.757305" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.757117" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.756768" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.760026" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:03.757848" elapsed="0.002204"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:03.760104" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:03.760258" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:03.755590" elapsed="0.004693"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.761481" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:03.761276" elapsed="0.000259"/>
</kw>
<msg time="2026-05-01T00:57:03.761627" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:03.760934" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.761857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.761722" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.761704" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.762234" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:03.762372" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:03.762071" elapsed="0.000325"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:03.762804" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.762573" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:03.762876" elapsed="0.000065"/>
</return>
<msg time="2026-05-01T00:57:03.763073" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:03.760610" elapsed="0.002526"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.764548" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.764288" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.764986" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.764747" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:03.774479" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:03.774739" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '146'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:03.774835" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:03.767340" elapsed="0.007522"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.765095" elapsed="0.009810"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.775109" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.774952" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.765077" elapsed="0.010119"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.778613" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.776215" elapsed="0.002446"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.775994" elapsed="0.002701"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.775976" elapsed="0.002745"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.781298" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.779021" elapsed="0.002323"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.778777" elapsed="0.002601"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.778760" elapsed="0.002644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.781963" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.781587" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.782301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.782060" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.782859" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.782561" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.782382" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.782042" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.783513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.783136" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.783848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.783610" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.784382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.784091" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.783928" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.783591" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:03.784634" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:03.785425" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.785141" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.785658" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:03.775579" elapsed="0.012485"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.788239" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.788134" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.788116" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:03.791119" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.788468" elapsed="0.002679"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:03.791200" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:03.791358" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:03.763476" elapsed="0.027908"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:03.791460" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:03.791614" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:03.663108" elapsed="0.128532"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.819716" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.819247" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.820540" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:03.820246" elapsed="0.000424">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:03.820845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:03.819911" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.821498" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:03.821040" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:03.821849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/empty_routes/ipv6/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:03.821985" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:03.821692" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.822433" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.822170" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:03.822972" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.822567" elapsed="0.000500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.823769" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:03.823247" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.823094" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.822547" elapsed="0.001307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.824555" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.824049" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:03.824640" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:03.818604" elapsed="0.006163"/>
</kw>
<msg time="2026-05-01T00:57:03.824820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:03.806015" elapsed="0.018853"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.837194" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.849646" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.863507" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.863732" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.863911" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.864301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.864149" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:03.864135" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.864538" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.864710" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.864876" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:03.864104" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.863990" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.865104" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.865186" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:03.865305" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:03.803386" elapsed="0.061947"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:03.865570" elapsed="0.002194"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:03.868812" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.868512" elapsed="0.000329"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:03.869263" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:03.868997" elapsed="0.000293"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:03.869462" elapsed="0.000324"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:03.868089" elapsed="0.001757"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.867845" elapsed="0.002034"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.870055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.869904" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.867827" elapsed="0.002303"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:03.792777" elapsed="0.077399"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:03.791964" elapsed="0.078286"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:03.791723" elapsed="0.078571"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.791706" elapsed="0.078611"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:03.870351" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:03.657801" elapsed="0.212693"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:01.427233" elapsed="2.443323"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:03.870784" elapsed="0.003103"/>
</kw>
<arg>intra_ipv6</arg>
<arg>${MVPN_DIR}</arg>
<arg>ipv6</arg>
<status status="PASS" start="2026-05-01T00:56:58.111237" elapsed="5.762711"/>
</kw>
<status status="PASS" start="2026-05-01T00:56:58.027781" elapsed="5.846290"/>
</test>
<test id="s1-s16-t27" name="Kill_Talking_BGP_Speaker" line="162">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:03.877229" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:03.876957" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.878522" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.878392" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.878373" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.884803" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.884696" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.884677" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.885880" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:03.885497" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.886373" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:03.886071" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:03.886502" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:03.886663" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:03.885104" elapsed="0.001584"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.892170" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.892063" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.892044" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.893399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:03.893293" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.893275" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:03.893940" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:03.893643" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:03.894345" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:03.894130" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:03.927913" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:03.894886" elapsed="0.033130"/>
</kw>
<msg time="2026-05-01T00:57:03.928177" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:03.928223" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.894550" elapsed="0.033709"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:03.957665" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:03.928809" elapsed="0.028976"/>
</kw>
<msg time="2026-05-01T00:57:03.957947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:03.957992" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.928435" elapsed="0.029594"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.958339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.958108" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.958088" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.958895" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:03.958593" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.959253" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.959032" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.959014" elapsed="0.000378"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:03.959430" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:03.961941" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:57:03.962142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:03.960913" elapsed="0.001362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.962709" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.963066" elapsed="0.000261"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:03.960275" elapsed="0.003175"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:03.959737" elapsed="0.003795"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:03.892992" elapsed="0.070689"/>
</kw>
<msg time="2026-05-01T00:57:03.963775" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:03.963819" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.892392" elapsed="0.071605"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:03.964199" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:03.964085" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.964065" elapsed="0.000291"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.965293" elapsed="0.000057"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.966081" elapsed="0.000056"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:03.966243" elapsed="0.000035"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:03.891725" elapsed="0.074899"/>
</kw>
<msg time="2026-05-01T00:57:03.966843" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:03.966940" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "K "i "l "l "_ "T "a "l "k "i...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.887060" elapsed="0.079964"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:03.967887" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:03.967197" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:03.967157" elapsed="0.000907"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:03.886913" elapsed="0.081205"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:03.886742" elapsed="0.081442"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:03.884315" elapsed="0.083961"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:03.878106" elapsed="0.090225"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.877679" elapsed="0.090697"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:03.874770" elapsed="0.093659"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:03.969675" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:03.969327" elapsed="0.000375"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:03.969861" elapsed="0.000237"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:57:03.969056" elapsed="0.001102"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:57:03.987861" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:57:03.970709" elapsed="0.017215"/>
</kw>
<msg time="2026-05-01T00:57:03.988021" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:03.988064" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:03.970334" elapsed="0.017755"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:03.988747" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:04.000963" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:04.001101" level="INFO">${output_log} = 2026-05-01 00:55:46,361 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:55:46,362 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:03.988601" elapsed="0.012537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.001780" level="INFO">2026-05-01 00:55:46,361 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:55:46,364 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:55:46,366 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:55:46,366 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:55:46,368 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:55:46,368 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100050206010400020005020641040000fbf0
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100050206010400020005020641040000fbf0'
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100050206010400020005020641040000fbf0
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:46,380 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-05-01 00:55:46,381 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:47,384 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:47,384 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.010s
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.011s
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:48,387 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.012s
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:50,389 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.013s
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:51,391 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:51,391 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.014s
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.015s
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:52,645 INFO BGP-Thread-1 (job): ... idle for 0.251s
2026-05-01 00:55:52,645 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.266s
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:52,646 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:52,646 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:52,771 INFO BGP-Thread-1 (job): ... idle for 0.125s
2026-05-01 00:55:52,771 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.391s
2026-05-01 00:55:52,771 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:53,773 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.392s
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:54,775 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:54,776 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.393s
2026-05-01 00:55:54,776 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:54,777 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:54,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.394s
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:56,779 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.395s
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:57,781 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.396s
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:58,595 INFO BGP-Thread-1 (job): ... idle for 0.814s
2026-05-01 00:55:58,596 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.210s
2026-05-01 00:55:58,596 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:58,597 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:58,597 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:58,735 INFO BGP-Thread-1 (job): ... idle for 0.138s
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.348s
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:59,737 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.349s
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.350s
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:01,741 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.351s
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.353s
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.354s
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:03,746 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): ... idle for 0.788s
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.142s
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:04,665 INFO BGP-Thread-1 (job): ... idle for 0.130s
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.272s
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:04,667 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.273s
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:05,669 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:05,669 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.274s
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.275s
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:07] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.276s
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.278s
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): ... idle for 0.844s
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.121s
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:10,521 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:10,522 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:10,522 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:10,651 INFO BGP-Thread-1 (job): ... idle for 0.129s
2026-05-01 00:56:10,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.251s
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:11,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:11,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.252s
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:12,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:12,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.253s
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.254s
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:13,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.255s
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:14,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.256s
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): ... idle for 0.850s
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.106s
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:16,653 INFO BGP-Thread-1 (job): ... idle for 0.140s
2026-05-01 00:56:16,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.246s
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.247s
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:17,657 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.249s
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.250s
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:20,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.251s
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:21,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.252s
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): ... idle for 0.811s
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.063s
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:22,475 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-05-01 00:56:22,475 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:22,608 INFO BGP-Thread-1 (job): ... idle for 0.132s
2026-05-01 00:56:22,608 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.194s
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.196s
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.197s
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:25,614 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:25,614 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.198s
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.199s
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:26,617 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:26,617 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.200s
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): ... idle for 0.813s
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.013s
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:28,433 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:28,433 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:28,618 INFO BGP-Thread-1 (job): ... idle for 0.185s
2026-05-01 00:56:28,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.198s
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:28,619 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:28,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:28,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.199s
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.200s
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:31,624 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.201s
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:32,626 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:32,628 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.202s
2026-05-01 00:56:32,628 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:33,630 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:33,630 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.203s
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): ... idle for 0.772s
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.975s
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:34,534 INFO BGP-Thread-1 (job): ... idle for 0.130s
2026-05-01 00:56:34,535 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.105s
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:34,535 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:34,536 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:34,536 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.106s
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:35,538 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:35,538 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.107s
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.108s
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:38,542 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:38,542 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.109s
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.110s
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:39,545 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): ... idle for 0.795s
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.905s
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:40,341 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:40,341 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:40,472 INFO BGP-Thread-1 (job): ... idle for 0.131s
2026-05-01 00:56:40,472 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.036s
2026-05-01 00:56:40,472 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.037s
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:42,476 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.038s
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:43,478 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.039s
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:44,479 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.040s
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:45,481 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.041s
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:46,270 INFO BGP-Thread-1 (job): ... idle for 0.788s
2026-05-01 00:56:46,271 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.829s
2026-05-01 00:56:46,271 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:46,272 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:46,422 INFO BGP-Thread-1 (job): ... idle for 0.150s
2026-05-01 00:56:46,422 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.978s
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.979s
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:47,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:47,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.980s
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.982s
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.982s
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:50,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:50,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:51,430 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.983s
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): ... idle for 0.935s
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.918s
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:52,366 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:52,366 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:52,504 INFO BGP-Thread-1 (job): ... idle for 0.137s
2026-05-01 00:56:52,504 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.054s
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.055s
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:54,507 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:54,507 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.055s
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.056s
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:56,510 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.057s
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:57,512 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:57,512 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.058s
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.059s
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b02000000344001010040020040050400000064800e230002051020010db800010000000000000000000600010c0001ac10002c0065c0a86401
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:58,515 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:58,515 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:59,515 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:59,515 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.059s
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.060s
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:01,541 INFO BGP-Thread-1 (job): ... idle for 1.024s
2026-05-01 00:57:01,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.084s
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003902000000224001010040020040050400000064800f11000205010c0001ac10002c0065c0a86401
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:02,543 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:02,543 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.085s
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.086s
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:03,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:03] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.001369" elapsed="0.001606"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:57:03.988294" elapsed="0.014763"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:57:04.003322" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-05-01T00:57:04.003152" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.003125" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.003744" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.003978" elapsed="0.000027"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:57:03.968729" elapsed="0.035354"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.015282" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:04.051731" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:04.051952" level="INFO">${output_log} = 2026-05-01 00:55:46,361 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:55:46,362 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:04.015143" elapsed="0.036869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.053028" level="INFO">2026-05-01 00:55:46,361 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:55:46,362 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:55:46,364 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:55:46,366 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:55:46,366 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:55:46,367 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:55:46,368 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:55:46,368 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:55:46,368 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100050206010400020005020641040000fbf0
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100050206010400020005020641040000fbf0'
2026-05-01 00:55:46,369 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100050206010400020005020641040000fbf0
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:55:46,370 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:46,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:46,380 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-05-01 00:55:46,381 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,381 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:46,382 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:46,383 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:46,383 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:47,384 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:47,384 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.010s
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:47,385 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.011s
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:48,386 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:48,387 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.012s
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:49,388 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:50,389 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.013s
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:50,390 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:51,391 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:51,391 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.014s
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:51,392 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.015s
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,393 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:52,645 INFO BGP-Thread-1 (job): ... idle for 0.251s
2026-05-01 00:55:52,645 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.266s
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:52,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:52,646 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:52,646 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,646 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:52,771 INFO BGP-Thread-1 (job): ... idle for 0.125s
2026-05-01 00:55:52,771 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.391s
2026-05-01 00:55:52,771 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:52,772 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:52,772 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:53,773 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.392s
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:53,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:54,775 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:54,776 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.393s
2026-05-01 00:55:54,776 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:54,777 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:54,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.394s
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:55,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:56,779 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.395s
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:56,780 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:55:57,781 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.396s
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:57,782 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:58,595 INFO BGP-Thread-1 (job): ... idle for 0.814s
2026-05-01 00:55:58,596 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.210s
2026-05-01 00:55:58,596 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:58,596 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:58,597 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:58,597 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:58,597 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:58,735 INFO BGP-Thread-1 (job): ... idle for 0.138s
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.348s
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:55:58,736 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:58,736 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:55:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:55:59,737 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.349s
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:55:59,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.350s
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:00,740 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:01,741 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.351s
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:01,742 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.353s
2026-05-01 00:56:02,743 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:02,744 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.354s
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:03,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:03,746 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): ... idle for 0.788s
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.142s
2026-05-01 00:56:04,534 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:04,534 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:04,535 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:04,535 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:04,665 INFO BGP-Thread-1 (job): ... idle for 0.130s
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.272s
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:04,666 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:04,666 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:04,667 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:04] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.273s
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:05,668 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:05,669 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:05,669 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.274s
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:06,670 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.275s
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:07,672 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:07] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.276s
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:08,674 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.278s
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:09,676 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): ... idle for 0.844s
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.121s
2026-05-01 00:56:10,520 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:10,521 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:10,521 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:10,522 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:10,522 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:10,651 INFO BGP-Thread-1 (job): ... idle for 0.129s
2026-05-01 00:56:10,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.251s
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:10,651 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:10,652 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:10,652 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:10] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:11,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:11,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.252s
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:11,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:12,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:12,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.253s
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:12,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.254s
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:13,657 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:13,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.255s
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:14,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:14,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.256s
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:15,661 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): ... idle for 0.850s
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.106s
2026-05-01 00:56:16,512 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:16,513 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:16,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:16,653 INFO BGP-Thread-1 (job): ... idle for 0.140s
2026-05-01 00:56:16,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.246s
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:16,654 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:16,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:16] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.247s
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:17,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:17,657 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.249s
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:18,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.250s
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:19,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:20,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.251s
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:20,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:21,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.252s
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:21,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): ... idle for 0.811s
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.063s
2026-05-01 00:56:22,475 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-05-01 00:56:22,475 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-05-01 00:56:22,475 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:22,476 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:22,476 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:22,608 INFO BGP-Thread-1 (job): ... idle for 0.132s
2026-05-01 00:56:22,608 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.194s
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:22,609 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:22,609 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:22] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.196s
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:23,611 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.197s
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:24,613 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:25,614 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:25,614 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.198s
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:25,615 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:25] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.199s
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:26,616 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:26,617 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:26,617 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.200s
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:27,618 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): ... idle for 0.813s
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.013s
2026-05-01 00:56:28,432 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:28,432 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:28,433 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:28,433 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:28,433 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:28,618 INFO BGP-Thread-1 (job): ... idle for 0.185s
2026-05-01 00:56:28,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.198s
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:28,619 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:28,619 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:28,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:28,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:28] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.199s
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:29,621 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.200s
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:30,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:31,624 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.201s
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:31,625 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:31] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:32,626 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:32,628 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.202s
2026-05-01 00:56:32,628 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:32,629 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:33,630 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:33,630 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.203s
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:33,631 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): ... idle for 0.772s
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.975s
2026-05-01 00:56:34,403 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:34,403 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:34,404 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:34,404 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:34,534 INFO BGP-Thread-1 (job): ... idle for 0.130s
2026-05-01 00:56:34,535 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.105s
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:34,535 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:34,535 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:34,536 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:34,536 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.106s
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-05-01 00:56:35,537 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:35,538 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:35,538 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.107s
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:36,539 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.108s
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:37,541 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:38,542 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:38,542 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.109s
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:38,543 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.110s
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:39,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:39,545 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): ... idle for 0.795s
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.905s
2026-05-01 00:56:40,340 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:40,340 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:40,341 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:40,341 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:40,341 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:40,472 INFO BGP-Thread-1 (job): ... idle for 0.131s
2026-05-01 00:56:40,472 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.036s
2026-05-01 00:56:40,472 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:40,473 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:40,473 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.037s
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:41,475 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:42,476 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.038s
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:42,477 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:43,478 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.039s
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:43,479 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:43] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:44,479 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.040s
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:44,480 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:45,481 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.041s
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:45,482 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:46,270 INFO BGP-Thread-1 (job): ... idle for 0.788s
2026-05-01 00:56:46,271 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.829s
2026-05-01 00:56:46,271 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:46,271 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:46,272 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:46,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:46,422 INFO BGP-Thread-1 (job): ... idle for 0.150s
2026-05-01 00:56:46,422 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.978s
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:46,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:46,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.979s
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:47,424 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:47,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:47,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.980s
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:48,426 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.982s
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:49,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:49] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.982s
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:50,429 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:50,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:50,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:51,430 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.983s
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:51,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): ... idle for 0.935s
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.918s
2026-05-01 00:56:52,366 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-05-01 00:56:52,366 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:52,366 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:52,367 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:52,367 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:52,504 INFO BGP-Thread-1 (job): ... idle for 0.137s
2026-05-01 00:56:52,504 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.054s
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:56:52,504 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Mvpn True
2026-05-01 00:56:52,505 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:52,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.055s
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:53,506 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:54,507 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:54,507 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.055s
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:54,508 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.056s
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:55,509 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:55] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:56,510 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.057s
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:56,511 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:57,512 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:57,512 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.058s
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:57,513 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:56:58] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.059s
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b02000000344001010040020040050400000064800e230002051020010db800010000000000000000000600010c0001ac10002c0065c0a86401
2026-05-01 00:56:58,514 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:58,515 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:58,515 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:56:59,515 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:56:59,515 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.059s
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:56:59,516 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.060s
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:00,517 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:01,541 INFO BGP-Thread-1 (job): ... idle for 1.024s
2026-05-01 00:57:01,541 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.084s
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003902000000224001010040020040050400000064800f11000205010c0001ac10002c0065c0a86401
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:01,542 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:02,543 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:02,543 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.085s
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:02,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.086s
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:03,545 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:03,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:03] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.052381" elapsed="0.002496"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:04.056285" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/mvpn_play.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/mvpn_play.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:57:04.055303" elapsed="0.001062"/>
</kw>
<arg>play.py.out</arg>
<arg>mvpn_play.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.014811" elapsed="0.041659"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-05-01T00:57:03.874295" elapsed="0.182342"/>
</test>
<test id="s1-s16-t28" name="Delete_Bgp_Peer_Configuration" line="168">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:04.062371" elapsed="0.000320"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:04.061995" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.064258" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.064097" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.064069" elapsed="0.000262"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.069307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.069194" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.069175" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.070439" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.070048" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.070947" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:04.070651" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:04.071019" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:04.071179" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.069666" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.076810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.076701" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.076682" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.078046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.077938" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.077921" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:04.078604" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.078264" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.079019" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:04.078797" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.107889" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:04.079598" elapsed="0.028397"/>
</kw>
<msg time="2026-05-01T00:57:04.108162" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:04.108209" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.079210" elapsed="0.029036"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.133807" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:04.108802" elapsed="0.025114"/>
</kw>
<msg time="2026-05-01T00:57:04.134077" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:04.134123" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.108423" elapsed="0.025738"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.134682" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.134240" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.134220" elapsed="0.000551"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.135261" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.134921" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.135705" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.135405" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.135386" elapsed="0.000410"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:04.135832" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:04.138448" elapsed="0.000163"/>
</kw>
<msg time="2026-05-01T00:57:04.138674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.137303" elapsed="0.001504"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.139092" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.139439" elapsed="0.000255"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:04.136688" elapsed="0.003126"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:04.136120" elapsed="0.003758"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:04.077639" elapsed="0.062337"/>
</kw>
<msg time="2026-05-01T00:57:04.140067" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:04.140111" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.077034" elapsed="0.063117"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:04.140337" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:04.140228" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.140210" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.140840" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.141180" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.141251" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:04.076349" elapsed="0.065008"/>
</kw>
<msg time="2026-05-01T00:57:04.141449" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:04.141511" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "l "e "t "e "_ "B "g "p...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.071648" elapsed="0.069900"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.141876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.141624" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.141607" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:04.071443" elapsed="0.070532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:04.071264" elapsed="0.070743"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:04.068830" elapsed="0.073232"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:04.063684" elapsed="0.078432"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.062993" elapsed="0.079167"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:04.058154" elapsed="0.084057"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.185259" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.184875" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:04.186080" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:04.185821" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:04.186259" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:04.185476" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.186858" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.186471" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:04.187190" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:04.187349" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:04.187052" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.187826" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.187551" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.188844" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.188586" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.189320" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.189052" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.190049" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.189737" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.190824" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.190604" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.190901" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:04.191057" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.190267" elapsed="0.000815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.191238" elapsed="0.000254"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:57:04.189595" elapsed="0.001940"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.192107" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.191807" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.192872" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.192664" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.192948" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:04.193099" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.192328" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.193277" elapsed="0.000237"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:57:04.191652" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.194102" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.193805" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.194910" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.194700" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.194986" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:04.195138" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.194317" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.195317" elapsed="0.000442"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:57:04.193669" elapsed="0.002134"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.196356" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.196057" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.197116" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.196906" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.197192" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:04.197342" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.196588" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.197535" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:57:04.195919" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.198337" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.198044" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.199087" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.198880" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.199162" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:04.199317" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.198564" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.199508" elapsed="0.000236"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:04.197910" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.200329" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.200033" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.201084" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.200877" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.201158" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:04.201308" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.200561" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.201505" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:57:04.199898" elapsed="0.001870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:04.189398" elapsed="0.012405"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:04.201847" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:04.202006" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:04.188246" elapsed="0.013786"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.187943" elapsed="0.014121"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.202242" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.202090" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.187922" elapsed="0.014401"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.203161" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.202486" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:04.203238" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.184235" elapsed="0.019127"/>
</kw>
<msg time="2026-05-01T00:57:04.203474" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.171259" elapsed="0.032267"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.216167" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.228647" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.241127" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.241358" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.241561" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.241981" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.241825" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:04.241808" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.242213" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.242383" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.242566" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:04.241767" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.241645" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.242798" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.242879" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:04.243037" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:04.166933" elapsed="0.076133"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.244311" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.244012" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:04.254529" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:04.254579" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:04.254696" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:04.246585" elapsed="0.008137"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.244514" elapsed="0.010249"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.254948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.254789" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.244495" elapsed="0.010536"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.258469" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.256082" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.255855" elapsed="0.002696"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.255837" elapsed="0.002739"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.261157" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.258854" elapsed="0.002349"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.258631" elapsed="0.002607"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.258615" elapsed="0.002648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.261895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.261480" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.262236" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.261993" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.262809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.262508" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.262322" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.261976" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.263416" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.263055" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.263766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.263528" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.264330" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.264037" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.263869" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.263510" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.264585" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:04.265405" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.265101" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.265606" elapsed="0.002467"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:04.255411" elapsed="0.012726"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:04.268185" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:04.270494" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:04.243345" elapsed="0.027177"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:04.270621" elapsed="0.000029"/>
</return>
<arg>${MVPN_DIR}/bgp_peer</arg>
<arg>mapping=${MVPN_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:04.142515" elapsed="0.128236"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:57:04.057227" elapsed="0.213650"/>
</test>
<test id="s1-s16-t29" name="Deconfigure_App_Peer" line="176">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:04.274321" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:04.274053" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.275598" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.275485" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.275465" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.281107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.280991" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.280969" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.282186" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.281808" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.282684" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:04.282374" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:04.282755" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:04.282909" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.281413" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.288567" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.288443" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.288424" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.289820" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.289714" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.289697" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:04.290338" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.290035" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.290758" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:04.290542" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.325955" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:04.291281" elapsed="0.034777"/>
</kw>
<msg time="2026-05-01T00:57:04.326222" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:04.326267" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.290946" elapsed="0.035358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.342741" level="INFO">". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:04.326845" elapsed="0.015999"/>
</kw>
<msg time="2026-05-01T00:57:04.343003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:04.343048" level="INFO">${message_wait} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.326499" elapsed="0.016586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.343389" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.343164" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.343143" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.343997" level="INFO"> ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.343685" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.344355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.344135" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.344116" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:04.344486" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:04.347064" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:57:04.347269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.345935" elapsed="0.001467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.347700" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.348067" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:04.345304" elapsed="0.003080"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:04.344767" elapsed="0.003683"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:04.289393" elapsed="0.059172"/>
</kw>
<msg time="2026-05-01T00:57:04.348658" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:04.348703" level="INFO">${message} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.288792" elapsed="0.059949"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:04.348926" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:04.348819" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.348800" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.349411" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.349773" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.349846" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:04.288105" elapsed="0.061849"/>
</kw>
<msg time="2026-05-01T00:57:04.350048" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:04.350092" level="INFO">${output} =  ". "t "x "t ". "0 "6 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "M "v "p "n ". "D "e "c "o "n "f "i "g "u "r...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.283307" elapsed="0.066823"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.350476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.350204" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.350187" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:04.283162" elapsed="0.067416"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:04.282987" elapsed="0.067621"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:04.280337" elapsed="0.070327"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:04.275180" elapsed="0.075539"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.274753" elapsed="0.076014"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:04.271826" elapsed="0.078996"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.394179" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.393749" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:04.395028" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:04.394767" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:04.395203" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:04.394400" elapsed="0.000828"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.395806" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.395397" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:04.396173" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:04.396340" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:04.395999" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.396791" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.396542" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.397852" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.397596" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.398322" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.398057" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.399028" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.398731" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.399800" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.399580" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.399879" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:04.400043" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.399246" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.400241" elapsed="0.000263"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:04.398592" elapsed="0.001953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.401090" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:04.400795" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:04.402008" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.401633" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:04.402084" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:04.402234" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:04.401302" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.402409" elapsed="0.000242"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:04.400661" elapsed="0.002032"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:04.398400" elapsed="0.004327"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:04.402770" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:04.402925" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:04.397259" elapsed="0.005692"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.396917" elapsed="0.006065"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.403211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.403056" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.396893" elapsed="0.006395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.404031" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.403434" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:04.404145" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.393032" elapsed="0.011244"/>
</kw>
<msg time="2026-05-01T00:57:04.404331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.379871" elapsed="0.024508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.416780" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.429071" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.441340" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.441571" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.441760" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.442158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.442007" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:04.441991" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.442386" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.442571" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.442741" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:04.441956" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.441842" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.442970" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.443049" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:04.443196" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:04.375552" elapsed="0.067739"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.444514" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.444213" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:04.454257" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0croebakoxmw4ld7sob73dyk725.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:04.454324" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:04.454479" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:04.446660" elapsed="0.007860"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.444632" elapsed="0.009944"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.454831" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.454613" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.444614" elapsed="0.010332"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.459938" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.456411" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.456038" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.456014" elapsed="0.004072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.463819" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.460526" elapsed="0.003357"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.460164" elapsed="0.003767"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.460141" elapsed="0.003825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.464804" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.464237" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.465274" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.464939" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.466060" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.465640" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.465388" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.464915" elapsed="0.001260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.466933" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.466409" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.467395" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.467067" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.468166" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.467759" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:04.467528" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.467043" elapsed="0.001272"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.468556" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:04.469625" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:04.469276" elapsed="0.000421"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.469862" elapsed="0.002276"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:04.455471" elapsed="0.016730"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:04.472261" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:04.474511" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:04.443584" elapsed="0.030954"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:04.474592" elapsed="0.000027"/>
</return>
<arg>${MVPN_DIR}/app_peer</arg>
<arg>mapping=${MVPN_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:04.351049" elapsed="0.123667"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:57:04.271286" elapsed="0.203554"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:57:04.475826" elapsed="0.000501"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:04.476585" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:57:04.476510" elapsed="0.000335"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:57:04.475606" elapsed="0.001295"/>
</kw>
<doc>Functional test for bgp - mvpn

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distbmution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising mvpn routes to odl. For advertising play.py is used,
and particular files are stored as *.hex files. There are 7 different
types of routes used for auto-discovery of multicast network. Also 4 more routes
with new attributes specific for mvpn.</doc>
<status status="PASS" start="2026-05-01T00:55:43.846716" elapsed="80.630215"/>
</suite>
<suite id="s1-s17" name="070 Bgp Functional L3Vpn Mcast" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.567173" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:04.562796" elapsed="0.004431"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:57:04.562394" elapsed="0.004902"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.572101" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:04.568402" elapsed="0.003728"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:57:04.572334" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.572217" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.572192" elapsed="0.000212"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.572964" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:04.572607" elapsed="0.000400"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.573491" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:04.573171" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:57:04.574024" elapsed="0.000286"/>
</kw>
<msg time="2026-05-01T00:57:04.574406" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:04.574468" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:04.573686" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.575030" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.574663" elapsed="0.000393"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.576038" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:04.575776" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.576492" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:04.576214" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.576964" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.576677" elapsed="0.000313"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.580096" elapsed="0.000208"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.580892" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.580562" elapsed="0.000356"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.581075" elapsed="0.000230"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.582127" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.581834" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:57:04.582200" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:04.582361" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:04.581539" elapsed="0.000846"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:04.583148" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1923d710&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:57:04.582561" elapsed="0.000727"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.583469" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:57:04.579531" elapsed="0.004189"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:04.579321" elapsed="0.004442"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:57:04.577046" elapsed="0.006749"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.584358" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:04.583960" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.584991" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:04.584593" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.585594" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:04.585198" elapsed="0.000439"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:57:04.575313" elapsed="0.010381"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:57:04.568053" elapsed="0.017696"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:04.585929" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:04.585815" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.585796" elapsed="0.000202"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.589088" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:04.588712" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.589586" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:04.589275" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:04.589656" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:04.589812" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:04.588347" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:04.590832" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.590568" elapsed="0.000291"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.591617" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:04.591718" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:04.591432" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:04.595166" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:04.594592" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:04.594573" elapsed="0.000719"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.595955" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:04.596188" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:04.595509" elapsed="0.000732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.597222" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:04.596556" elapsed="0.000775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.598539" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:04.597622" elapsed="0.000970"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:04.600485" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:57:04.600671" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:04.599953" elapsed="0.000761"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.601060" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:57:04.602757" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:57:05.233084" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:04 UTC 2026

  System load:  0.1                Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:55:44 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:57:04.602346" elapsed="0.630974"/>
</kw>
<msg time="2026-05-01T00:57:05.233439" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.601897" elapsed="0.631839"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:57:04.599038" elapsed="0.634902"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.235173" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:57:05.248208" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:57:05.248543" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:57:05.248678" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:05.234513" elapsed="0.014230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.249250" elapsed="0.000805"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.251700" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:05.250884" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.252445" elapsed="0.000090"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.252077" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.252037" elapsed="0.000670"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:57:05.253126" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-05-01T00:57:05.252826" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.252800" elapsed="0.000571"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.253478" elapsed="0.000026"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.258229" elapsed="0.000626"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.259216" elapsed="0.000405"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.259961" elapsed="0.000282"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:05.254182" elapsed="0.006155"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:57:04.593637" elapsed="0.666943"/>
</kw>
<msg time="2026-05-01T00:57:05.260660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.592984" elapsed="0.667757"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:57:04.592492" elapsed="0.668357"/>
</kw>
<msg time="2026-05-01T00:57:05.260901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.591943" elapsed="0.669017"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.264748" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.265362" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.265815" elapsed="0.000124"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:05.261365" elapsed="0.004631"/>
</kw>
<msg time="2026-05-01T00:57:05.266096" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:57:04.591076" elapsed="0.675045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.266624" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:05.266342" elapsed="0.000325"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:57:05.266712" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:57:04.590194" elapsed="0.676654"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:04.590014" elapsed="0.676873"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:04.589887" elapsed="0.677040"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:57:04.586222" elapsed="0.680767"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:57:05.267153" elapsed="0.000219"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.281687" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.281532" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.281508" elapsed="0.000263"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.282096" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:05.282205" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.281943" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.282737" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:05.282388" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.283329" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:05.283008" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:05.284263" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:57:05.284023" elapsed="0.000358">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:57:05.284512" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:57:05.284560" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.283619" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.284989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:05.284750" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.284728" elapsed="0.000364"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:05.285910" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.285612" elapsed="0.000324"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:57:05.285986" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:05.286144" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:05.285312" elapsed="0.000856"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.286332" elapsed="0.000439"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.287052" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:05.287153" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.286946" elapsed="0.000233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.287332" elapsed="0.002575"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.290630" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:57:05.455437" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.290114" elapsed="0.165529"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.459883" elapsed="0.000391"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.460447" elapsed="0.000206"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.460810" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:05.456995" elapsed="0.003976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:05.456158" elapsed="0.004861"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.281206" elapsed="0.179866"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:05.268135" elapsed="0.192990"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.267760" elapsed="0.193421"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:05.267610" elapsed="0.193616"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:57:05.267435" elapsed="0.193836"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:57:04.567610" elapsed="0.893733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.464165" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.464038" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.464009" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.469236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.469126" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.469107" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.470393" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:05.469899" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.470911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:05.470607" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:05.470982" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:05.471151" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:05.469557" elapsed="0.001619"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.476620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.476510" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.476491" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.477922" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:05.477791" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.477774" elapsed="0.000254"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:05.478572" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.478215" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.478988" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:05.478761" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.515145" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:05.479695" elapsed="0.035607"/>
</kw>
<msg time="2026-05-01T00:57:05.515474" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:05.515527" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.479177" elapsed="0.036387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.589769" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "7 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "l "3 "v "p "n "_ "m "c "a "s "t ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:05.516299" elapsed="0.073718"/>
</kw>
<msg time="2026-05-01T00:57:05.590256" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:05.590314" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.515765" elapsed="0.074595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.590976" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:05.590559" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.590513" elapsed="0.000658"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.591854" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "7 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "l "3 "v "p "n "_ "m "c "a "s "t ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:05.591330" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.592268" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:05.592022" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.592003" elapsed="0.000503"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:05.592553" elapsed="0.000056"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.595288" elapsed="0.000492"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.596136" elapsed="0.000342"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:05.596822" elapsed="0.000247"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:05.594443" elapsed="0.002722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:05.593050" elapsed="0.004258"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:05.477498" elapsed="0.119916"/>
</kw>
<msg time="2026-05-01T00:57:05.597525" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:05.597570" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.476848" elapsed="0.120761"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:05.597801" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:05.597689" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.597670" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.598370" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.599169" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:05.599243" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:05.476203" elapsed="0.123154"/>
</kw>
<msg time="2026-05-01T00:57:05.599464" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:05.599512" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.471588" elapsed="0.127960"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:05.599883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:05.599627" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:05.599609" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:05.471420" elapsed="0.128565"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:05.471236" elapsed="0.128783"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:05.468825" elapsed="0.131251"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:57:05.462044" elapsed="0.138087"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:05.461534" elapsed="0.138639"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:57:04.562059" elapsed="1.038167"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.600776" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:05.600385" elapsed="0.000418"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.601303" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:05.600977" elapsed="0.000368"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:05.603186" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:57:05.603262" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:05.602895" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.603468" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:57:05.604659" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:57:06.248293" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:05 UTC 2026

  System load:  0.08               Processes:             105
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:55:45 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:57:05.604321" elapsed="0.644284"/>
</kw>
<msg time="2026-05-01T00:57:06.248694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.603963" elapsed="0.644811"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:57:05.602364" elapsed="0.646524"/>
</kw>
<msg time="2026-05-01T00:57:06.248943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:05.601947" elapsed="0.647041"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:57:05.601565" elapsed="0.647501"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:06.249752" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1a1d1a90&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:57:06.249304" elapsed="0.000650"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.258774" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:57:06.274779" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:57:06.250130" elapsed="0.024768"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.277069" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:57:06.310363" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:06.310716" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:57:06.310825" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:57:06.310917" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:06.276796" elapsed="0.034172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.313187" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:57:06.312508" elapsed="0.000789"/>
</kw>
<msg time="2026-05-01T00:57:06.313556" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:57:06.313664" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.311597" elapsed="0.002120"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.315180" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.314150" elapsed="0.001091"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.316375" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.315519" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.315435" elapsed="0.001096"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:57:06.316755" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.316610" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.316589" elapsed="0.000307"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.317024" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.316975" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:06.316953" elapsed="0.000175"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.317371" elapsed="0.000033"/>
</kw>
<msg time="2026-05-01T00:57:06.317613" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:57:06.276231" elapsed="0.041418"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:57:06.317882" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.317750" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.317725" elapsed="0.000391"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.318352" elapsed="0.000031"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:57:06.275499" elapsed="0.043022"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:04.561749" elapsed="1.756905"/>
</kw>
<test id="s1-s17-t1" name="Configure_App_Peer" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:06.323509" elapsed="0.000308"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:06.323075" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.325169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.325053" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.325034" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.330460" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.330337" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.330316" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.331575" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.331146" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.332065" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:06.331768" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:06.332135" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.332291" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.330768" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.337805" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.337696" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.337677" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.339066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.338957" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.338939" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:06.339667" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.339287" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.340080" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:06.339858" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.370707" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:06.340634" elapsed="0.030191"/>
</kw>
<msg time="2026-05-01T00:57:06.370994" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:06.371041" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.340269" elapsed="0.030808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.402705" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:06.371678" elapsed="0.031137"/>
</kw>
<msg time="2026-05-01T00:57:06.402976" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:06.403021" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "C "o "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.371259" elapsed="0.031798"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.403382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.403143" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.403119" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.403988" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.403680" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.404344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.404125" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.404108" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:06.404553" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:06.407207" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:57:06.407414" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.406091" elapsed="0.001494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.407862" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.408226" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:06.405439" elapsed="0.002974"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:06.404866" elapsed="0.003636"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:06.338654" elapsed="0.069949"/>
</kw>
<msg time="2026-05-01T00:57:06.408696" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:06.408740" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "C "o "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.338028" elapsed="0.070749"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:06.409164" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.408854" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.408835" elapsed="0.000419"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.409694" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.410039" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.410110" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:06.337344" elapsed="0.072875"/>
</kw>
<msg time="2026-05-01T00:57:06.410311" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:06.410355" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "C "o "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.332726" elapsed="0.077667"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.410746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.410492" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.410473" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:06.332579" elapsed="0.078269"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:06.332376" elapsed="0.078504"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:06.329966" elapsed="0.080968"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:06.324751" elapsed="0.086239"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.324204" elapsed="0.086832"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:06.319703" elapsed="0.091385"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.444609" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.444206" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.445433" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.445140" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.445689" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.444805" elapsed="0.000909"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.446267" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.445881" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.446617" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:06.446792" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:06.446474" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.447225" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.446979" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.448267" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.448011" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.448763" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.448491" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.449463" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.449155" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.450430" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.450203" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.450526" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:06.450685" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.449682" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.450868" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:06.449017" elapsed="0.002136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.451749" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.451404" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.452514" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.452286" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.452590" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.452740" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.451966" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.452919" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:06.451267" elapsed="0.001910"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:06.448841" elapsed="0.004371"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:06.453256" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:06.453418" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:06.447684" elapsed="0.005760"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.447346" elapsed="0.006145"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.453668" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.453517" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.447323" elapsed="0.006421"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.454500" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.453891" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.454613" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.443591" elapsed="0.011152"/>
</kw>
<msg time="2026-05-01T00:57:06.454799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.430794" elapsed="0.024052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.467148" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.480494" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.493932" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.494132" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.494309" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.494712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.494554" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:06.494540" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.494937" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.495105" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.495270" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:06.494509" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.494390" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.495519" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.495597" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:06.495741" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:06.426547" elapsed="0.069221"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.523574" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.523181" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.524351" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.524134" elapsed="0.000284">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.524530" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.523793" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.525102" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.524723" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.525424" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:06.525580" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:06.525290" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.526045" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.525802" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:06.526469" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.526161" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.526993" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.526703" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.526554" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.526142" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.527829" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.527224" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.527909" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.522558" elapsed="0.005479"/>
</kw>
<msg time="2026-05-01T00:57:06.528090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.508371" elapsed="0.019766"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.540411" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.552779" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.565088" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.565284" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.565474" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.565841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.565696" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:06.565681" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.566065" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.566234" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.566407" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:06.565653" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.565551" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.566650" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.566725" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:57:06.566843" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:06.505683" elapsed="0.061188"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.568146" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.567901" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.568303" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.567544" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.568669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.568403" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.569223" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.568933" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.568750" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.568385" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.619468" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.569474" elapsed="0.050038"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:06.619603" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:57:06.619805" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:06.567200" elapsed="0.052660"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.621492" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.621177" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.622014" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.621773" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.622477" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.622216" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.622917" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.622678" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:06.623786" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:06.623587" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:06.624155" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:06.623983" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.624334" elapsed="0.000224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.624963" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.624717" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:06.625049" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.625205" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:06.623167" elapsed="0.002063"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:06.642243" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:57:06.642382" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:57:06 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:06.642863" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:06.627476" elapsed="0.015482"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.625309" elapsed="0.017781"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.643595" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.643165" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.625288" elapsed="0.018509"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.649913" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.646047" elapsed="0.003910"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.645537" elapsed="0.004456"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.645493" elapsed="0.004525"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.652681" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.650298" elapsed="0.002430"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.650074" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.650057" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.653370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.652970" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.653730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.653485" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.654278" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.653978" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.653811" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.653465" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.654958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.654594" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.655291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.655054" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.655851" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.655556" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.655374" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.655036" elapsed="0.000930"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.656124" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:06.656958" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.656666" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.657139" elapsed="0.002345"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:06.644705" elapsed="0.014843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:06.659722" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.659614" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.659597" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.659989" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.660059" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:06.662336" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:06.620267" elapsed="0.042096"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.662427" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:57:06.662599" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:06.415832" elapsed="0.246791"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.662962" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.662723" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.662705" elapsed="0.000351"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.663090" elapsed="0.000025"/>
</return>
<arg>${L3VPN_MCAST_DIR}/app_peer</arg>
<arg>mapping=${L3VPN_MCAST_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:06.411356" elapsed="0.251857"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-05-01T00:57:06.318753" elapsed="0.344584"/>
</test>
<test id="s1-s17-t2" name="Reconfigure_ODL_To_Accept_Connection" line="56">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:06.666770" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:06.666500" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.668060" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.667950" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.667931" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.673269" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.673163" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.673145" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.674380" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.674002" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.674880" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:06.674585" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:06.674951" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.675107" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.673624" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.680707" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.680600" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.680582" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.681962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.681855" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.681837" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:06.682502" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.682181" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.682911" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:06.682695" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.713553" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:06.683439" elapsed="0.030215"/>
</kw>
<msg time="2026-05-01T00:57:06.713822" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:06.713869" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.683100" elapsed="0.030804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.748741" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:06.714420" elapsed="0.034433"/>
</kw>
<msg time="2026-05-01T00:57:06.749014" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:06.749059" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "R "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.714077" elapsed="0.035017"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.749395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.749172" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.749152" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.749947" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.749651" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.750304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.750087" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.750069" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:06.750420" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:06.753134" elapsed="0.000280"/>
</kw>
<msg time="2026-05-01T00:57:06.753496" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.751880" elapsed="0.001752"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.753948" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.754314" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:06.751246" elapsed="0.003275"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:06.750711" elapsed="0.003875"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:06.681551" elapsed="0.073133"/>
</kw>
<msg time="2026-05-01T00:57:06.754776" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:06.754820" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "R "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.680930" elapsed="0.073926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:06.755041" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.754933" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.754915" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.755549" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.755891" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.755962" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:06.680245" elapsed="0.075852"/>
</kw>
<msg time="2026-05-01T00:57:06.756190" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:06.756234" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "R "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.675533" elapsed="0.080736"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.756615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.756345" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.756327" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:06.675371" elapsed="0.081345"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:06.675192" elapsed="0.081554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:06.672804" elapsed="0.083999"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:06.667641" elapsed="0.089217"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.667191" elapsed="0.089713"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:06.664276" elapsed="0.092682"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.791682" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.791288" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.792546" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.792269" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.792720" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.791879" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.793298" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.792912" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.793689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:06.793844" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:06.793548" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.794275" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.794031" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.795326" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.795062" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.796025" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.795560" elapsed="0.000493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.796793" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.796472" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.797588" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.797343" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.797670" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.797825" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.797017" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.798007" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:57:06.796313" elapsed="0.001974"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.798873" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.798557" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.799648" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.799415" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.799725" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.799878" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.799092" elapsed="0.000811"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.800057" elapsed="0.000276"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:57:06.798403" elapsed="0.001976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.800956" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.800648" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.801723" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.801510" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.801799" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.801950" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.801173" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.802128" elapsed="0.000222"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:57:06.800511" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.802959" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.802662" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.803736" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.803522" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.803813" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.803966" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.803182" elapsed="0.000845"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.804217" elapsed="0.000249"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:57:06.802525" elapsed="0.001985"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.805067" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.804768" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.805850" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.805638" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.805927" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.806079" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.805297" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.806260" elapsed="0.000248"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:06.804629" elapsed="0.001921"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.807277" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:06.806802" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:06.808051" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.807841" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:06.808169" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:06.808326" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:06.807520" elapsed="0.000832"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.808529" elapsed="0.000228"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:57:06.806666" elapsed="0.002133"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:06.796128" elapsed="0.012707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:06.808880" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.809044" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:06.794730" elapsed="0.014341"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.794408" elapsed="0.014695"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.809282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.809129" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.794388" elapsed="0.014973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.810182" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.809531" elapsed="0.000681"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.810262" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.790656" elapsed="0.019735"/>
</kw>
<msg time="2026-05-01T00:57:06.810446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.777149" elapsed="0.033363"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.823125" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.835755" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.849162" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.849471" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.849671" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.850090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.849934" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:06.849918" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.850322" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.850512" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.850683" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:06.849880" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.849753" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.850927" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.851010" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:06.851159" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:06.772826" elapsed="0.078361"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.879225" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.878833" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.880043" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.879772" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.880233" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.879420" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.880834" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.880434" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.881164" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:06.881408" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:06.881026" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.881861" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.881614" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:06.882273" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.881979" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.882820" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.882525" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.882360" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.881960" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.883714" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.883051" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.883795" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.878202" elapsed="0.005721"/>
</kw>
<msg time="2026-05-01T00:57:06.883977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.864071" elapsed="0.019954"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.896669" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.909068" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.921483" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.921681" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.921856" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.922219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.922074" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:06.922060" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.922440" elapsed="0.000066"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.922664" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.922834" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:06.922031" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.921929" elapsed="0.000984"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.923061" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.923137" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:06.923259" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:06.861421" elapsed="0.061867"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:06.924661" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:06.924358" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:06.924819" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:06.924001" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.925165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.924915" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.925737" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.925428" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.925246" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.924897" elapsed="0.000924"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.928343" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.925975" elapsed="0.002395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:06.928423" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:57:06.928597" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:06.923673" elapsed="0.004949"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.930012" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.929766" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.930465" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.930214" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.930913" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.930669" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.931349" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.931109" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:06.932221" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:06.932018" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:06.932613" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:06.932423" elapsed="0.000216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.932831" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.933465" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.933204" elapsed="0.000308"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:06.933554" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.933712" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:06.931613" elapsed="0.002124"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:06.944788" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '295', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:57:06.944846" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:06.944937" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:06.935867" elapsed="0.009095"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.933808" elapsed="0.011200"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.945189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.945034" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.933790" elapsed="0.011487"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.948768" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.946245" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.946016" elapsed="0.002832"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.945999" elapsed="0.002874"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.951440" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:06.949153" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.948930" elapsed="0.002609"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.948913" elapsed="0.002651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.952116" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.951733" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.952501" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.952214" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.953048" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.952751" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.952585" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.952196" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.953676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.953300" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.954011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.953772" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.954574" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:06.954259" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:06.954092" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.953754" elapsed="0.000904"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:06.954811" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:06.955675" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:06.955371" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.955859" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:06.945664" elapsed="0.012592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:06.958434" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-05-01T00:57:06.958324" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.958305" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.958691" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.958761" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:06.961133" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:06.928957" elapsed="0.032204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.961226" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:06.961384" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:06.761609" elapsed="0.199802"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:06.961779" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:06.961531" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.961514" elapsed="0.000356"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:06.961903" elapsed="0.000026"/>
</return>
<arg>${L3VPN_MCAST_DIR}/bgp_peer</arg>
<arg>mapping=${L3VPN_MCAST_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:06.757219" elapsed="0.204807"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:57:06.663672" elapsed="0.298482"/>
</test>
<test id="s1-s17-t3" name="Start_Bgp_Peer" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:06.965920" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:06.965651" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.967191" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.967081" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.967062" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.972980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.972872" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.972854" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.974066" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:06.973684" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:06.974570" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:06.974256" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:06.974643" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:06.974800" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:06.973283" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.980269" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.980162" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.980145" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:06.981627" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:06.981511" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:06.981492" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:06.982138" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:06.981843" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:06.982559" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:06.982325" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:07.011075" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:06.983085" elapsed="0.028118"/>
</kw>
<msg time="2026-05-01T00:57:07.011395" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:07.011445" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.982749" elapsed="0.028754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:07.040137" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:07.012095" elapsed="0.028169"/>
</kw>
<msg time="2026-05-01T00:57:07.040490" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:07.040541" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "S "t "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:07.011707" elapsed="0.028871"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.040959" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:07.040682" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:07.040652" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:07.041546" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:07.041201" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.041908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:07.041685" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:07.041666" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:07.042025" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:07.044813" elapsed="0.000347"/>
</kw>
<msg time="2026-05-01T00:57:07.045228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:07.043651" elapsed="0.001715"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.045738" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.046160" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:07.042958" elapsed="0.003405"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:07.042359" elapsed="0.004073"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:06.981187" elapsed="0.065387"/>
</kw>
<msg time="2026-05-01T00:57:07.046671" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:07.046716" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "S "t "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.980582" elapsed="0.066171"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:07.046956" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:57:07.046838" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:07.046818" elapsed="0.000288"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.047610" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.047965" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:07.048038" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:06.979829" elapsed="0.068318"/>
</kw>
<msg time="2026-05-01T00:57:07.048243" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:07.048287" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "S "t "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.975192" elapsed="0.073131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:07.048758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:07.048399" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:07.048382" elapsed="0.000458"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:06.975048" elapsed="0.073817"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:06.974877" elapsed="0.074023"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:06.972505" elapsed="0.076458"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:06.966794" elapsed="0.082227"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:06.966346" elapsed="0.082724"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:06.963389" elapsed="0.085738"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Start_Bgp_Peer">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:07.050985" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:07.050645" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:07.051420" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:07.051175" elapsed="0.000436"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:07.054665" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:57:07.054756" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:07.051768" elapsed="0.003014"/>
</kw>
<arg>--amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug --l3vpn_mcast --wfr 1</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:57:07.050182" elapsed="0.004661"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.057128" level="FAIL">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:57:07.056496" elapsed="6.001456">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.058296" elapsed="0.000039"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:57:07.056176" elapsed="6.002289">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:57:07.055768" elapsed="6.002853"/>
</kw>
<msg time="2026-05-01T00:57:13.058737" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:07.055386" elapsed="6.003378"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:57:13.058966" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-05-01T00:57:13.058864" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.058837" elapsed="0.000334"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.059416" elapsed="0.000029"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.059625" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:57:07.055102" elapsed="6.004605"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-05-01T00:57:07.049830" elapsed="6.009929"/>
</kw>
<arg>3x</arg>
<arg>1s</arg>
<arg>Start Bgp Peer</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:07.049317" elapsed="6.010486"/>
</kw>
<doc>Start Python speaker to connect to ODL. We need to do WUKS until odl really starts to accept incomming bgp connection. The failure happens if the incomming connection comes too quickly after configuring the peer in the previous test case.</doc>
<status status="PASS" start="2026-05-01T00:57:06.962525" elapsed="6.097439"/>
</test>
<test id="s1-s17-t4" name="Odl_To_Play_l3vpn_mcast" line="69">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:13.063716" elapsed="0.000277"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:13.063425" elapsed="0.000626"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.065118" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.064988" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.064970" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.070225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.070118" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.070099" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.071315" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.070926" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.071827" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:13.071526" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:13.071900" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:13.072060" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.070544" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.077741" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.077625" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.077605" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.079030" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.078922" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.078904" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:13.079577" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.079251" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.079986" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:13.079768" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.129554" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:13.080548" elapsed="0.049117"/>
</kw>
<msg time="2026-05-01T00:57:13.129828" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:13.129874" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.080174" elapsed="0.049735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.284688" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "m "c "a "s "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:13.130426" elapsed="0.154525"/>
</kw>
<msg time="2026-05-01T00:57:13.285221" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:13.285370" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.130083" elapsed="0.155328"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.286117" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.285742" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.285700" elapsed="0.000511"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.286831" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "m "c "a "s "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.286368" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.287209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.286982" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.286962" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:13.287329" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:13.290790" elapsed="0.000165"/>
</kw>
<msg time="2026-05-01T00:57:13.291024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.289187" elapsed="0.001981"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.291462" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.291858" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:13.288340" elapsed="0.003788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:13.287724" elapsed="0.004504"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:13.078618" elapsed="0.213759"/>
</kw>
<msg time="2026-05-01T00:57:13.292539" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:13.292600" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.077970" elapsed="0.214684"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:13.292929" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:57:13.292772" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.292742" elapsed="0.000323"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.293668" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.294065" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.294143" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:13.077182" elapsed="0.217080"/>
</kw>
<msg time="2026-05-01T00:57:13.294363" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:13.294411" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.072500" elapsed="0.221951"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.294947" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.294592" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.294570" elapsed="0.000491"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:13.072336" elapsed="0.222751"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:13.072141" elapsed="0.222994"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:13.069755" elapsed="0.225471"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:13.064693" elapsed="0.230618"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.064211" elapsed="0.231243"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:13.060780" elapsed="0.234783"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.296534" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/announce_l3vpn_mcast.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/announce_l3vpn_mcast.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.296752" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.296294" elapsed="0.000486"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:13.297170" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.296944" elapsed="0.000260"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.297591" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/withdraw_l3vpn_mcast.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/withdraw_l3vpn_mcast.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.297726" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.297366" elapsed="0.000386"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:13.298169" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.297960" elapsed="0.000237"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:13.298579" elapsed="0.005382"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.298268" elapsed="0.005781"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.298251" elapsed="0.005857"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.346096" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.345707" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.346917" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.346655" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.347099" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.346297" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.347738" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.347331" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.348069" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.348208" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.347931" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.348662" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.348395" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.349687" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.349410" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.350165" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.349894" elapsed="0.000348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.350969" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.350655" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.351972" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.351545" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.352052" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:13.352212" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.351189" elapsed="0.001049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.352396" elapsed="0.000293"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:13.350506" elapsed="0.002225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.353287" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.352986" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.354401" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.353993" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.354495" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:13.354653" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.353523" elapsed="0.001156"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.354834" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:13.352848" elapsed="0.002252"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.350302" elapsed="0.004833"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.355180" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:13.355388" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:13.349086" elapsed="0.006333"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.348781" elapsed="0.006672"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.355677" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.355494" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.348759" elapsed="0.007012"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.356557" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.355919" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.356637" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.345061" elapsed="0.011702"/>
</kw>
<msg time="2026-05-01T00:57:13.356818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.332292" elapsed="0.024576"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.369381" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.381961" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.394429" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.394646" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.394822" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.395194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.395047" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:13.395032" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.395417" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.395605" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.395774" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:13.395002" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.394898" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.396001" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.396077" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:13.396198" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:13.326794" elapsed="0.069430"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.421003" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.420603" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.421771" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.421552" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.421933" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.421199" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.422593" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.422159" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.422964" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.423105" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.422804" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.423562" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;10.2.34.0/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.16.0.44&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.423298" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:13.424034" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.423733" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.424578" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.424267" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.424118" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.423713" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.425287" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.424810" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.425367" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.419974" elapsed="0.005538"/>
</kw>
<msg time="2026-05-01T00:57:13.425572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.407220" elapsed="0.018402"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.438288" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.450738" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.463156" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.463353" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.463545" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.463914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.463765" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:13.463751" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.464137" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.464305" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.464488" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:13.463723" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.463621" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.464758" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.464836" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:13.464972" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:13.406350" elapsed="0.058651"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.466286" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.466022" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.466441" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.465682" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.466807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.466557" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.467363" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.467071" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.466888" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.466538" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.469801" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.467623" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:13.469880" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:13.470035" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:13.465340" elapsed="0.004720"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.471649" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.471380" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.472088" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;10.2.34.0/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.16.0.44&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.471853" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.472561" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.472300" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.472995" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.472758" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:13.473860" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:13.473664" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:13.474214" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:13.474041" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.474452" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.475086" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.474839" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:13.475174" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:13.475330" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:13.473244" elapsed="0.002111"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:13.488185" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '1045', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;IAABrBAALABlGAoCIgAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;10.2.34.0/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;127.16.0.44&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:13.488335" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4/l3vpn-mcast-route=IAABrBAALABlGAoCIgAAAAA%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:13.488619" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:13.477701" elapsed="0.010979"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.475426" elapsed="0.013358"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.489193" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.488843" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.475408" elapsed="0.013982"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.496583" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.491938" elapsed="0.004694"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.491395" elapsed="0.005277"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.491354" elapsed="0.005345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.499307" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.496995" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.496760" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.496742" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.500022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.499613" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.500362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.500120" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.500929" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.500630" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.500443" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.500102" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.501558" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.501176" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.501947" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.501654" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.502515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.502199" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.502030" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.501636" elapsed="0.000964"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.502762" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:13.503634" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.503313" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.503818" elapsed="0.002318"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:13.490277" elapsed="0.015925"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:13.506389" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:57:13.506277" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.506259" elapsed="0.000243"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.506657" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.506727" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:13.509034" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:13.470423" elapsed="0.038638"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.509134" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:13.509292" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:13.313940" elapsed="0.195377"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.509700" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.509423" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.509406" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.509829" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:13.304738" elapsed="0.205217"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.513410" level="INFO">${update} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.510914" elapsed="0.002526"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.513630" elapsed="0.002310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:13.515992" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:13.510636" elapsed="0.005486"/>
</kw>
<msg time="2026-05-01T00:57:13.516197" level="INFO">${update} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:13.510137" elapsed="0.006086"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.517107" level="INFO">Length is 154.</msg>
<msg time="2026-05-01T00:57:13.517182" level="INFO">${len_1} = 154</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:13.516837" elapsed="0.000368"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.517697" level="INFO">Length is 154.</msg>
<msg time="2026-05-01T00:57:13.517773" level="INFO">${len_2} = 154</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:13.517363" elapsed="0.000433"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.517957" elapsed="0.000309"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.518637" level="INFO">${sum_1} = 1699</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:13.518426" elapsed="0.000237"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.518998" level="INFO">${sum_2} = 1699</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:13.518818" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.519177" elapsed="0.000346"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:13.516442" elapsed="0.003145"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:13.519743" elapsed="0.002434"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.569617" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.569220" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.570397" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.570148" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.570591" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.569813" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.571167" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.570784" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.571513" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.571661" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.571359" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.572087" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.571846" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.573328" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.572856" elapsed="0.000518"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.573848" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.573568" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.574700" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.574256" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.575841" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.575342" elapsed="0.000580"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.576058" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:13.576287" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.574921" elapsed="0.001392"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.576487" elapsed="0.000411"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:13.574115" elapsed="0.002890"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.577715" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.577267" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.578829" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.578344" elapsed="0.000565"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.579048" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:13.579270" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.577931" elapsed="0.001365"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.579453" elapsed="0.000412"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:13.577128" elapsed="0.002778"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.573931" elapsed="0.006010"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.579986" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:13.580143" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:13.572519" elapsed="0.007649"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.572201" elapsed="0.007999"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.580377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.580226" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.572181" elapsed="0.008276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.581218" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.580616" elapsed="0.000631"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.581296" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.568579" elapsed="0.012844"/>
</kw>
<msg time="2026-05-01T00:57:13.581507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.555968" elapsed="0.025591"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.594158" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.606546" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.618857" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.619055" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.619269" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.619662" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.619513" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:13.619496" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.619884" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.620055" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.620222" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:13.619453" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.619347" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.620452" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.620543" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:13.620665" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:13.551671" elapsed="0.069021"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.621805" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.621553" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:13.630670" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:13.630718" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:13.630811" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:13.624161" elapsed="0.006675"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.621918" elapsed="0.008958"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.631058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.630902" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.621900" elapsed="0.009241"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.634728" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.632240" elapsed="0.002549"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.632005" elapsed="0.002832"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.631986" elapsed="0.002887"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.638463" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.635260" elapsed="0.003315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.634951" elapsed="0.003670"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.634928" elapsed="0.003728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.639427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.638895" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.639932" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.639589" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.640790" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.640334" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.640091" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.639564" elapsed="0.001388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.641727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.641193" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.642190" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.641862" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.642998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.642553" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.642302" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.641837" elapsed="0.001278"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.643327" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:13.644219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.643940" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.644402" elapsed="0.002463"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:13.631592" elapsed="0.015336"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:13.646974" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:13.649229" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:13.620960" elapsed="0.028296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.649311" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:13.523688" elapsed="0.125747"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.523034" elapsed="0.126472"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:13.522440" elapsed="0.127124"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.652661" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.650488" elapsed="0.002202"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.652846" elapsed="0.002119"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:13.655016" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:13.650199" elapsed="0.004944"/>
</kw>
<msg time="2026-05-01T00:57:13.655217" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:13.649737" elapsed="0.005505"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.656108" level="INFO">Length is 142.</msg>
<msg time="2026-05-01T00:57:13.656183" level="INFO">${len_1} = 142</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:13.655843" elapsed="0.000363"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.656637" level="INFO">Length is 142.</msg>
<msg time="2026-05-01T00:57:13.656711" level="INFO">${len_2} = 142</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:13.656360" elapsed="0.000374"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.656889" elapsed="0.000302"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.657569" level="INFO">${sum_1} = 1491</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:13.657350" elapsed="0.000246"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:13.657924" level="INFO">${sum_2} = 1491</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:13.657749" elapsed="0.000200"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:13.658166" elapsed="0.000329"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:13.655460" elapsed="0.003096"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.705018" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.704633" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.705879" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.705567" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.706047" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.705214" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.706650" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.706240" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.706981" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.707127" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.706841" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.707573" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.707311" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.708686" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.708408" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.709163" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.708893" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.710108" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.709574" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.711293" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.710842" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.711459" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:57:13.711702" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.710326" elapsed="0.001402"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.711885" elapsed="0.000536"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:13.709418" elapsed="0.003047"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.713251" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.712739" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.714606" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.714116" elapsed="0.000531"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.714766" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:13.714989" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.713482" elapsed="0.001534"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.715172" elapsed="0.000524"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:13.712601" elapsed="0.003179"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.709242" elapsed="0.006574"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.715861" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:13.716020" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:13.708014" elapsed="0.008031"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.707698" elapsed="0.008378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.716252" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.716102" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.707676" elapsed="0.008653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.717102" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.716518" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.717179" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.703926" elapsed="0.013377"/>
</kw>
<msg time="2026-05-01T00:57:13.717359" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.690865" elapsed="0.026554"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.730052" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.742566" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.754999" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.755206" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.755390" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.755800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.755648" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:13.755633" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.756027" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.756198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.756366" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:13.755598" elapsed="0.000913"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.755484" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.756697" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.756775" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:13.756911" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:13.686525" elapsed="0.070414"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.758201" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.757930" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:13.765300" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:13.765735" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family']/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:13.765883" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:13.765928" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.760362" elapsed="0.005964">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:13.758317" elapsed="0.008091">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.766640" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.766443" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:13.758299" elapsed="0.008491">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.771930" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.768265" elapsed="0.003714">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:13.767953" elapsed="0.004115">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:13.767927" elapsed="0.004187">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.775539" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.772550" elapsed="0.003022">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:13.772212" elapsed="0.003423">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:13.772187" elapsed="0.003520">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.776315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.775913" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.776683" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.776414" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.777230" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.776932" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.776764" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.776395" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.777858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.777494" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.778210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.777955" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.778768" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.778456" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.778292" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.777937" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.779005" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:13.779840" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.779538" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:13.782305" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.780024" elapsed="0.002314">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.767320" elapsed="0.015176">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:13.782559" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:13.784917" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:13.784947" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:13.757212" elapsed="0.027764">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.785042" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.659987" elapsed="0.125226">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.659222" elapsed="0.126057"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:13.658787" elapsed="0.126555"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:13.295899" elapsed="0.489497"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.060308" elapsed="0.725230"/>
</test>
<test id="s1-s17-t5" name="Play_To_Odl_l3vpn_mcast" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:13.788967" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:13.788700" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.790249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.790138" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.790120" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.795393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.795286" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.795268" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.796493" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.796094" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.797048" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:13.796686" elapsed="0.000388"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:13.797120" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:13.797275" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.795712" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.802859" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.802749" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.802729" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.804102" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:13.803996" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.803977" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:13.804663" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.804321" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.805077" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:13.804854" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.838228" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:13.805627" elapsed="0.032970"/>
</kw>
<msg time="2026-05-01T00:57:13.839040" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:13.839146" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.805266" elapsed="0.033963"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:13.862778" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "3 "v "p "n "_ "m "c "a "s "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:13.842986" elapsed="0.019939"/>
</kw>
<msg time="2026-05-01T00:57:13.863123" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:13.863171" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.839851" elapsed="0.023355"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.863653" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.863321" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.863285" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.864306" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "3 "v "p "n "_ "m "c "a "s "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.863895" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.864689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.864448" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.864429" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:13.864808" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:13.867594" elapsed="0.000216"/>
</kw>
<msg time="2026-05-01T00:57:13.867875" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.866429" elapsed="0.001584"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.868319" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.868681" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:13.865762" elapsed="0.003111"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:13.865154" elapsed="0.003785"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:13.803693" elapsed="0.065344"/>
</kw>
<msg time="2026-05-01T00:57:13.869132" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:13.869177" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.803082" elapsed="0.066130"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:13.869400" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:13.869290" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.869271" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.869931" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.870278" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.870351" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:13.802371" elapsed="0.068092"/>
</kw>
<msg time="2026-05-01T00:57:13.870573" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:13.870620" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.797736" elapsed="0.072921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.870989" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.870733" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.870716" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:13.797583" elapsed="0.073506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:13.797354" elapsed="0.073770"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:13.794923" elapsed="0.076262"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:13.789849" elapsed="0.081391"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:13.789397" elapsed="0.081888"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:13.786427" elapsed="0.084912"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.872549" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.872010" elapsed="0.000568"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.873201" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.872752" elapsed="0.000478"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.873808" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.873401" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.874208" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/announce_l3vpn_mcast.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/announce_l3vpn_mcast.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.874417" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.873999" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.874816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/withdraw_l3vpn_mcast.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/withdraw_l3vpn_mcast.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.874937" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.874626" elapsed="0.000337"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:13.875118" elapsed="0.004457"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:13.879736" elapsed="0.004430"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.935402" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.934986" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.936288" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.935992" elapsed="0.000383">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.936488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.935645" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.937076" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.936688" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.937418" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:13.937655" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:13.937271" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.938152" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.937894" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.939308" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.938990" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.939827" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.939545" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.940675" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.940244" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.942067" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.941353" elapsed="0.000818"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.942257" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:57:13.942601" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.940895" elapsed="0.001734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.942836" elapsed="0.000422"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:13.940100" elapsed="0.003200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.943988" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:13.943582" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:13.945504" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.944945" elapsed="0.000660"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:13.945684" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:13.945999" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:13.944482" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:13.946183" elapsed="0.000393"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:13.943420" elapsed="0.003199"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.939911" elapsed="0.006744"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:13.946702" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:13.946861" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:13.938660" elapsed="0.008226"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.938290" elapsed="0.008628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.947102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.946945" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.938261" elapsed="0.008919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.947971" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:13.947331" elapsed="0.000668"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:13.948050" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:13.934312" elapsed="0.013863"/>
</kw>
<msg time="2026-05-01T00:57:13.948233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:13.921410" elapsed="0.026874"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.961065" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.973579" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.985975" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.986195" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.986386" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.986904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.986748" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:13.986731" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.987134" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.987305" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.987491" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:13.986680" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.986557" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.987727" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.987808" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:13.987961" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:13.916856" elapsed="0.071133"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.989406" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.989104" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.989596" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.988707" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.989955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:13.989693" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.990539" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:13.990223" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.990037" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.989674" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.993217" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:13.990805" elapsed="0.002439"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:13.993296" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:13.993459" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:13.988328" elapsed="0.005171"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:13.994801" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.994558" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:13.994996" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:13.994143" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:13.995229" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:13.995092" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:13.995073" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.995466" elapsed="0.000035"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:13.995689" elapsed="0.000069"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:13.995811" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:13.997776" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:13.993815" elapsed="0.003988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.999289" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.999032" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:13.999748" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:13.999508" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:14.007602" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:14.007817" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:14.007981" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:14.002014" elapsed="0.006531">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:13.999857" elapsed="0.008812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:14.008936" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:14.008717" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:13.999839" elapsed="0.009224">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:14.009633" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:14.009843" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:14.009789" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:14.009757" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:14.010164" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:14.010262" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.998121" elapsed="0.012291">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:14.010542" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.893756" elapsed="0.116923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:14.011118" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:14.010861" elapsed="0.000362"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:14.010836" elapsed="0.000474"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:14.011371" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:13.889229" elapsed="0.122328">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.066425" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.066028" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.067259" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.066996" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.067433" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.066655" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.068049" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.067648" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.068384" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:16.068606" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:16.068241" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.069090" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.068802" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.070183" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.069874" elapsed="0.000354"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.070707" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.070392" elapsed="0.000341"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.071529" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.071104" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.072786" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.072207" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.072986" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:57:16.073310" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.071750" elapsed="0.001587"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.073518" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:16.070964" elapsed="0.003044"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.074725" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.074273" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.076144" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.075593" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.076323" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:16.076644" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.075109" elapsed="0.001566"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.076848" elapsed="0.000418"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:16.074132" elapsed="0.003178"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.070786" elapsed="0.006560"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.077393" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:16.077575" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:16.069548" elapsed="0.008054"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.069218" elapsed="0.008419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.077826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.077663" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.069193" elapsed="0.008713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.078682" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.078054" elapsed="0.000657"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.078761" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:16.065391" elapsed="0.013499"/>
</kw>
<msg time="2026-05-01T00:57:16.078947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.052725" elapsed="0.026271"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.091873" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.104264" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.116626" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.116877" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.117059" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.117437" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.117288" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:16.117273" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.117681" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.117892" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.118064" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:16.117241" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.117135" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.118292" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.118367" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:16.118512" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:16.048354" elapsed="0.070187"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.119838" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.119583" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.120001" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.119214" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.120350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.120098" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.120930" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.120635" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.120433" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.120080" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.123556" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.121167" elapsed="0.002417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:16.123637" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:16.123793" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.118880" elapsed="0.004938"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.125066" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.124820" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.125223" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.124461" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:16.125458" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:57:16.125318" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.125300" elapsed="0.000297"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.125754" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.125958" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.126033" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:16.127937" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.124133" elapsed="0.003831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.129346" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.129100" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.129806" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.129567" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:16.137365" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:16.137823" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:16.137928" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:16.132085" elapsed="0.005869"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.129917" elapsed="0.008080"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.138229" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.138025" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.129899" elapsed="0.008420"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.141932" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.139353" elapsed="0.002630"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.139129" elapsed="0.002889"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.139111" elapsed="0.002932"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.145444" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.142363" elapsed="0.003167"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.142100" elapsed="0.003480"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.142083" elapsed="0.003532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.146400" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.145853" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.146903" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.146561" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.147684" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.147246" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.147019" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.146535" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.148551" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.148027" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.149074" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.148738" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.149866" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.149421" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.149189" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.148711" elapsed="0.001273"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.150202" elapsed="0.000591"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:16.151257" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.150969" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.151443" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:16.138705" elapsed="0.015134"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.154017" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:16.153910" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.153891" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.157113" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.154240" elapsed="0.002902"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:16.157196" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:16.157353" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:16.128276" elapsed="0.029103"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.157442" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:57:16.157616" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:16.025930" elapsed="0.131712"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.186074" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.185614" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.186907" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.186632" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.187215" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.186270" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.187913" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.187412" elapsed="0.000530"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.188263" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:16.188522" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:16.188106" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.188979" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "127.16.0.44"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "10.2.34.0/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.188713" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:16.189525" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.189101" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.190417" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.189764" elapsed="0.000680"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.189612" elapsed="0.000887"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.189082" elapsed="0.001440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.191227" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.190674" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.191307" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:16.184980" elapsed="0.006457"/>
</kw>
<msg time="2026-05-01T00:57:16.191521" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.172150" elapsed="0.019421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.204230" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.216618" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.229039" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.229239" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.229455" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.229868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.229720" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:16.229705" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.230092" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.230263" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.230432" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:16.229675" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.229567" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.230681" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.230757" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:16.230902" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:16.169500" elapsed="0.061429"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.231108" elapsed="0.002391"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.234737" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.234238" elapsed="0.000528"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.235377" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.234922" elapsed="0.000483"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:16.235589" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:16.233826" elapsed="0.002167"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.233581" elapsed="0.002445"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.236273" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.236052" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.233561" elapsed="0.002797"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:16.158901" elapsed="0.077506"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:16.157969" elapsed="0.078533"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.157726" elapsed="0.078824"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.157709" elapsed="0.078864"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.236608" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:16.021297" elapsed="0.215440"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:13.884348" elapsed="2.352448"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.286372" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.285960" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.287154" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.286931" elapsed="0.000289">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.287316" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.286588" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.287912" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.287525" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.288242" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:16.288379" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:16.288105" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.288920" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.288608" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.290299" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.289683" elapsed="0.000663"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.290831" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.290551" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.291657" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.291224" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.292977" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.292348" elapsed="0.000735"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.293163" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:16.293488" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.291886" elapsed="0.001639"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.293737" elapsed="0.000498"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:16.291085" elapsed="0.003205"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.295010" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.294579" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.296312" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.295728" elapsed="0.000691"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.296529" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:16.296873" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.295241" elapsed="0.001662"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.297062" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:16.294414" elapsed="0.003084"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.290908" elapsed="0.006692"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.297656" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:16.297829" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:16.289335" elapsed="0.008520"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.289036" elapsed="0.008851"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.298118" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.297918" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.289016" elapsed="0.009197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.299009" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.298372" elapsed="0.000665"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.299088" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:16.285239" elapsed="0.013980"/>
</kw>
<msg time="2026-05-01T00:57:16.299275" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.272639" elapsed="0.026687"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.311906" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.324203" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.336679" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.336882" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.337097" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.337493" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.337327" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:16.337312" elapsed="0.000304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.337764" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.337938" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.338106" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:16.337281" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.337177" elapsed="0.001053"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.338404" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.338502" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:16.338630" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:16.268279" elapsed="0.070377"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.339956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.339683" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.340122" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.339318" elapsed="0.000829"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.340491" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.340220" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.341051" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.340758" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.340575" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.340201" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.343717" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.341289" elapsed="0.002456"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:16.343798" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:16.343956" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.338988" elapsed="0.004993"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.345269" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.344984" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.345428" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.344641" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:16.345742" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:16.345557" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.345537" elapsed="0.000294"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.345985" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.346162" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.346228" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:16.348145" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.344292" elapsed="0.003879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.349577" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.349312" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.350040" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.349798" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:16.357759" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:16.357947" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:16.358056" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:16.352274" elapsed="0.005809"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.350186" elapsed="0.007942"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.358312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.358155" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.350167" elapsed="0.008229"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.363372" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.359420" elapsed="0.004023"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.359199" elapsed="0.004319"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.359181" elapsed="0.004374"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.367360" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.363953" elapsed="0.003473"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.363635" elapsed="0.003875"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.363611" elapsed="0.003938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.368395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.367798" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.368978" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.368580" elapsed="0.000492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.369796" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.369344" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.369107" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.368546" elapsed="0.001370"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.370858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.370239" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.371200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.370959" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.371768" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.371452" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.371283" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.370940" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.372010" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:16.372906" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.372578" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.373147" elapsed="0.002641"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:16.358780" elapsed="0.017078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.376045" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:16.375932" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.375913" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.379440" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.376275" elapsed="0.003213"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:16.379543" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:16.379712" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:16.348503" elapsed="0.031235"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.379802" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:16.379951" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:16.245705" elapsed="0.134272"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.408668" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.408150" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.409523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.409211" elapsed="0.000436">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.409827" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.408869" elapsed="0.000984"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.410488" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.410025" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.410885" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:16.411043" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:16.410685" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.411525" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "127.16.0.44"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "10.2.34.0/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.411234" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:16.412152" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.411693" elapsed="0.000538"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.413031" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.412442" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.412259" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.411672" elapsed="0.001447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.413842" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.413273" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.413931" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:16.407528" elapsed="0.006555"/>
</kw>
<msg time="2026-05-01T00:57:16.414144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.394345" elapsed="0.019854"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.426743" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.439084" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.451622" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.451856" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.452035" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.452418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.452270" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:16.452256" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.452660" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.452830" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.452999" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:16.452225" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.452116" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.453272" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.453349" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:16.453515" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:16.391726" elapsed="0.061817"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.453725" elapsed="0.002438"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.457423" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.456928" elapsed="0.000528"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:16.458099" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.457635" elapsed="0.000493"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:16.458288" elapsed="0.000345"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:16.456512" elapsed="0.002182"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.456247" elapsed="0.002486"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.458909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.458758" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.456228" elapsed="0.002757"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:16.381143" elapsed="0.077891"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:16.380311" elapsed="0.078799"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.380060" elapsed="0.079096"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.380043" elapsed="0.079136"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.459212" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:16.241342" elapsed="0.217997"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:16.237015" elapsed="0.222384"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.512129" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.511745" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.512952" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.512703" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.513185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.512331" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.513791" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.513382" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.514126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:16.514279" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:16.513985" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.514732" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.514482" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.515988" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.515493" elapsed="0.000542"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.516498" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.516201" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.517425" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.517003" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.518728" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.518140" elapsed="0.000690"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.518913" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:16.519220" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.517673" elapsed="0.001573"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.519405" elapsed="0.000413"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:16.516858" elapsed="0.003002"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.520546" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:16.520115" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:16.521867" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.521286" elapsed="0.000686"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:16.522052" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:16.522351" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:16.520816" elapsed="0.001562"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:16.522554" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:16.519977" elapsed="0.002998"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.516659" elapsed="0.006352"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:16.523058" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:16.523219" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:16.515149" elapsed="0.008095"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.514850" elapsed="0.008426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.523460" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.523303" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.514829" elapsed="0.008725"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.524294" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:16.523706" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:16.524372" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:16.511101" elapsed="0.013417"/>
</kw>
<msg time="2026-05-01T00:57:16.524614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:16.498254" elapsed="0.026412"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.537308" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.549772" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.562266" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.562486" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.562671" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.563051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.562904" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:16.562888" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.563274" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.563444" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.563634" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:16.562858" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.562754" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.563863" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.563940" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:16.564066" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:16.493975" elapsed="0.070117"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.565440" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.565158" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.565622" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.564767" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.565977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:16.565723" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.566558" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:16.566245" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.566059" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.565702" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.569216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:16.566805" elapsed="0.002439"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:16.569297" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:16.569458" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.564420" elapsed="0.005204"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:16.570947" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:16.570693" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:16.571106" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:16.570317" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:16.571339" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:16.571203" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.571184" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.571591" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:16.571768" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:16.571834" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:16.573770" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:16.569980" elapsed="0.003817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.575244" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.574994" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:16.575710" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:16.575446" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:17.159445" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:17.159888" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '484'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:17.160359" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:16.577927" elapsed="0.582514"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:16.575826" elapsed="0.584775"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.161131" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.160674" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:16.575807" elapsed="0.585559"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.168525" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.164343" elapsed="0.004247"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.163905" elapsed="0.004727"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.163869" elapsed="0.004794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.171452" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.168996" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.168732" elapsed="0.002829"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.168712" elapsed="0.002878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.172260" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.171818" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.172637" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.172365" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.173281" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.172933" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.172724" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.172345" elapsed="0.001036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.173949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.173572" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.174292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.174049" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.174899" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.174562" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.174376" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.174030" elapsed="0.000959"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.175226" elapsed="0.000471"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:17.176310" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.175918" elapsed="0.000425"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.176577" elapsed="0.003152"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:17.162644" elapsed="0.017201"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.180109" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:17.179960" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.179934" elapsed="0.000280"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.183592" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.180403" elapsed="0.003229"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:17.183703" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T00:57:17.184106" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:16.574114" elapsed="0.610117"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.184304" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:17.184487" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:16.470760" elapsed="0.713755"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.215534" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.214948" elapsed="0.000628"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.216507" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.216171" elapsed="0.000470">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:17.216827" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:17.215767" elapsed="0.001086"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.217487" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:17.217027" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.217849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:17.218023" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:17.217683" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.218504" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "127.16.0.44"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "10.2.34.0/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.218213" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:17.219110" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.218643" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.219914" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.219352" elapsed="0.000598"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.219201" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.218616" elapsed="0.001408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.220726" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.220180" elapsed="0.000576"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.220810" elapsed="0.000040"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:17.213936" elapsed="0.007018"/>
</kw>
<msg time="2026-05-01T00:57:17.221084" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.200007" elapsed="0.021142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.233919" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.246365" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.259555" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.259785" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.259977" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.260397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.260244" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:17.260226" elapsed="0.000302"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.260680" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.260851" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.261019" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:17.260186" elapsed="0.000886"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.260064" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.261258" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.261336" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:17.261522" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
        "l3vpn-mcast-route": [
            {
                "route-key": "IAABrBAALABlGAoCIgAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:17.196941" elapsed="0.064611"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.261733" elapsed="0.002525"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.265678" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.265084" elapsed="0.000685"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.266402" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.265935" elapsed="0.000495"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:17.266610" elapsed="0.000335"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:17.264651" elapsed="0.002355"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.264344" elapsed="0.002695"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.267215" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.267065" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.264325" elapsed="0.002967"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:17.185803" elapsed="0.081539"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:17.184905" elapsed="0.082517"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.184606" elapsed="0.082882"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.184588" elapsed="0.082927"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.267551" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:16.463995" elapsed="0.803690"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:16.459636" elapsed="0.808109"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:17.267919" elapsed="0.004082"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.324481" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.324015" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.325362" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.325044" elapsed="0.000487">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:17.325653" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:17.324699" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.326266" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:17.325865" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.326626" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:17.326824" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:17.326481" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.327381" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.327076" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.328973" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.328581" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.329601" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.329248" elapsed="0.000381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.330437" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.330017" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:17.331927" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.331176" elapsed="0.000878"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:17.332163" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:57:17.332578" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:17.330685" elapsed="0.001928"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.332824" elapsed="0.000428"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:17.329874" elapsed="0.003424"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.334026" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.333610" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:17.335510" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.334852" elapsed="0.000761"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:17.335693" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:17.336051" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:17.334263" elapsed="0.001818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.336286" elapsed="0.000412"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:17.333418" elapsed="0.003324"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:17.329687" elapsed="0.007090"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:17.336822" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:17.336983" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:17.327962" elapsed="0.009046"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.327555" elapsed="0.009486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.337225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.337071" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.327525" elapsed="0.009778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.338093" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.337453" elapsed="0.000668"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.338170" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:17.323183" elapsed="0.015113"/>
</kw>
<msg time="2026-05-01T00:57:17.338352" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.310348" elapsed="0.028057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.350944" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.364548" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.377653" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.377883" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.378065" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.378480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.378318" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:17.378303" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.378704" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.378872" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.379039" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:17.378272" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.378141" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.379263" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.379338" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:17.379483" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:17.306103" elapsed="0.073408"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.380820" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.380535" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:17.380988" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:17.380174" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.381334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.381082" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.382115" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.381613" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.381413" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.381064" elapsed="0.001137"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.384588" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:17.382392" elapsed="0.002223"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:17.384668" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:17.384825" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:17.379849" elapsed="0.005000"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.386100" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:17.385908" elapsed="0.000245"/>
</kw>
<msg time="2026-05-01T00:57:17.386236" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:17.385569" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.386514" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:17.386361" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.386312" elapsed="0.000272"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.386910" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:17.387069" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:17.386731" elapsed="0.000362"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:17.387503" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.387253" elapsed="0.000277"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:17.387577" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:17.387733" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:17.385224" elapsed="0.002534"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.389152" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.388905" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.389607" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.389351" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:17.397230" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:17.397801" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '649'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:17.397905" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:17.391803" elapsed="0.006128"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.389716" elapsed="0.008257"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.398158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.398000" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.389699" elapsed="0.008544"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.403024" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"IAABrBAALABlGAoCIgAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv4-next-hop":{"global":"127.16.0.44"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"10.2.34.0/24"}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.399574" elapsed="0.003521"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.399239" elapsed="0.003904"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.399215" elapsed="0.003963"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.407115" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.403653" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.403256" elapsed="0.003970"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.403233" elapsed="0.004027"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.408010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.407534" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.408347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.408106" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.408915" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.408613" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.408427" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.408088" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.409543" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.409162" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.409879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.409641" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.410420" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.410126" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.409961" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.409623" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.410676" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:17.411514" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.411204" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:17.411698" elapsed="0.002293"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:17.398670" elapsed="0.015384"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.414231" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:17.414124" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.414106" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.417425" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.414455" elapsed="0.003003"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:17.417536" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:17.417698" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:17.388072" elapsed="0.029653"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.417788" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:17.417940" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:17.283209" elapsed="0.134757"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.446457" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.445954" elapsed="0.000667"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.447523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.447154" elapsed="0.000505">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:17.447842" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:17.446808" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.448501" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:17.448037" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:17.448860" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:17.449025" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:17.448696" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.449502" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:17.449213" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:17.450091" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.449635" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.450856" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:17.450331" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:17.450182" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:17.449609" elapsed="0.001331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.451625" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:17.451092" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:17.451707" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:17.445233" elapsed="0.006617"/>
</kw>
<msg time="2026-05-01T00:57:17.451907" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.432421" elapsed="0.019536"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.464681" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.477410" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.491130" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.491389" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.491621" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.492122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.491962" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:17.491939" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.492360" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.492551" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.492783" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:17.491871" elapsed="0.000978"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.491733" elapsed="0.001147"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.493039" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.493125" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:17.493305" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:17.429776" elapsed="0.063561"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:17.493541" elapsed="0.004554"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.499285" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.498943" elapsed="0.000373"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:17.500196" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:17.499491" elapsed="0.000736"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:17.500781" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
    "l3vpn-mcast-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "transitive": true,
         "vrf-route-import-extended-community": {
          "inet4-specific-extended-community-common": {
           "global-administrator": "10.0.0.1",
           "local-administrator": "MTA="
          }
         }
        }
       ],
       "ipv4-next-hop": {
        "global": "127.16.0.44"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "path-id": 0,
      "prefix": "10.2.34.0/24",
      "route-distinguisher": "172.16.0.44:101",
      "route-key": "IAABrBAALABlGAoCIgAAAAA="
     }
    ]
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:17.501038" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
+        }
+       ],
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.500389" elapsed="0.000800">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.498457" elapsed="0.002915">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:17.498182" elapsed="0.003471">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:17.501904" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:17.501700" elapsed="0.000268"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:17.498161" elapsed="0.003833">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.419152" elapsed="0.082997">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.418296" elapsed="0.084030">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:17.418051" elapsed="0.084444">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:17.418034" elapsed="0.084503">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:17.502591" elapsed="0.000016"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:17.277677" elapsed="0.225061">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv4-next-hop": {
+        "global": "127.16.0.44"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "10.2.34.0/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "IAABrBAALABlGAoCIgAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.556365" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.555965" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.557223" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.556940" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.557395" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.556598" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.558002" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.557610" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.558338" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.558520" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.558195" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.558978" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.558710" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.560078" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.559763" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.560588" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.560289" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.561444" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.561036" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:19.562714" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.562143" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:19.563121" elapsed="0.000126"/>
</return>
<msg time="2026-05-01T00:57:19.564098" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:19.561683" elapsed="0.002448"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.564325" elapsed="0.000432"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:19.560896" elapsed="0.003905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.565515" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.565064" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:19.566796" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.566219" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:19.567010" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:19.567314" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:19.565746" elapsed="0.001597"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.567521" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:19.564925" elapsed="0.003020"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:19.560717" elapsed="0.007265"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:19.568182" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:19.568350" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:19.559418" elapsed="0.008959"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.559105" elapsed="0.009306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.568614" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.568439" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.559080" elapsed="0.009617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.569530" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.568846" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.569612" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:19.555314" elapsed="0.014430"/>
</kw>
<msg time="2026-05-01T00:57:19.569802" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.542306" elapsed="0.027550"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.582750" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.595523" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.608101" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.608305" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.608501" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.608889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.608739" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:19.608722" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.609118" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.609291" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.609476" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:19.608688" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.608581" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.609710" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.609787" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:19.609913" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:19.537582" elapsed="0.072358"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.611263" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.610983" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.611429" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.610624" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.611822" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.611567" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.612382" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.612086" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.611904" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.611548" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.614837" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.612643" elapsed="0.002221"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:19.614917" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:19.615076" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:19.610272" elapsed="0.004829"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.616389" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.616200" elapsed="0.000294"/>
</kw>
<msg time="2026-05-01T00:57:19.616583" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.615797" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.616814" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.616679" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.616660" elapsed="0.000222"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.617210" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.617361" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.617044" elapsed="0.000341"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:19.617811" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.617574" elapsed="0.000263"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:19.617895" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:19.618069" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:19.615413" elapsed="0.002687"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.619587" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.619293" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.620104" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.619794" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:19.628212" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:19.628504" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '166'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:19.628623" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:19.622553" elapsed="0.006098"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.620222" elapsed="0.008473"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.628889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.628723" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.620203" elapsed="0.008773"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.632566" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.630021" elapsed="0.002593"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.629797" elapsed="0.002853"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.629777" elapsed="0.002898"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.636233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.632987" elapsed="0.003310"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.632732" elapsed="0.003615"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.632715" elapsed="0.003667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.637203" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.636652" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.637703" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.637340" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.638493" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.638055" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.637818" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.637315" elapsed="0.001358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.639432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.638907" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.639954" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.639594" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.640739" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.640299" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.640069" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.639568" elapsed="0.001306"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.641123" elapsed="0.000512"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:19.642281" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.641873" elapsed="0.000445"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.642561" elapsed="0.002983"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:19.629349" elapsed="0.016262"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.645793" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.645683" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.645665" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:19.648818" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.646017" elapsed="0.002830"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:19.648899" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:19.649065" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:19.618432" elapsed="0.030660"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.649155" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:19.649307" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:19.515132" elapsed="0.134202"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.677721" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.677216" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.678580" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.678257" elapsed="0.000455">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.678891" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.677919" elapsed="0.000998"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.679547" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.679087" elapsed="0.000544"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.679974" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.680128" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.679802" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.680623" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.680330" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:19.681152" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.680741" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.681924" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.681389" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.681239" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.680721" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.682665" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.682162" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.682746" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:19.676566" elapsed="0.006309"/>
</kw>
<msg time="2026-05-01T00:57:19.682930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.663840" elapsed="0.019139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.695406" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.707857" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.720342" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.720554" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.720768" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.721209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.721051" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:19.721036" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.721435" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.721626" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.721795" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:19.721005" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.720890" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.722028" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.722105" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:19.722223" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:19.661201" elapsed="0.061049"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.722430" elapsed="0.002211"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:19.725731" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.725411" elapsed="0.000348"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:19.726188" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.725920" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:19.726372" elapsed="0.000342"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:19.724997" elapsed="0.001777"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.724722" elapsed="0.002086"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.726985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.726834" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.724703" elapsed="0.002357"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:19.650489" elapsed="0.076619"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:19.649680" elapsed="0.077503"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.649418" elapsed="0.077809"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.649401" elapsed="0.077850"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.727286" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:19.508918" elapsed="0.218497"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:17.272202" elapsed="2.455290"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:19.727716" elapsed="0.003613"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:13.871617" elapsed="5.859808"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:13.785931" elapsed="5.945642"/>
</test>
<test id="s1-s17-t6" name="Odl_To_Play_l3vpn_mcast_ipv6" line="77">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:19.735343" elapsed="0.000321"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:19.734970" elapsed="0.000771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.737182" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.737026" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.736999" elapsed="0.000281"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.743715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.743607" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.743588" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.744795" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.744395" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.745436" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:19.745140" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:19.745526" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:19.745684" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:19.744014" elapsed="0.001695"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.751188" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.751081" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.751063" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.752414" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:19.752308" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.752290" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:19.752959" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.752660" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:19.753541" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:19.753175" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:19.782679" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:19.754070" elapsed="0.028710"/>
</kw>
<msg time="2026-05-01T00:57:19.782942" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:19.782989" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:19.753733" elapsed="0.029292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:19.812910" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "m "c "a "s "t "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:19.783563" elapsed="0.029470"/>
</kw>
<msg time="2026-05-01T00:57:19.813195" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:19.813241" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:19.783198" elapsed="0.030079"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.813609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.813355" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.813335" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.814166" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "l "3 "v "p "n "_ "m "c "a "s "t "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.813866" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.814605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.814365" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.814347" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:19.814718" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:19.817258" elapsed="0.000294"/>
</kw>
<msg time="2026-05-01T00:57:19.817615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.816179" elapsed="0.001567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.818059" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.818397" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:19.815557" elapsed="0.003051"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:19.815005" elapsed="0.003668"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:19.752008" elapsed="0.066766"/>
</kw>
<msg time="2026-05-01T00:57:19.818865" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:19.818909" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:19.751411" elapsed="0.067535"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:19.819130" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:19.819023" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.819004" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.819641" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.819981" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.820052" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:19.750744" elapsed="0.069416"/>
</kw>
<msg time="2026-05-01T00:57:19.820251" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:19.820295" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "O "d "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:19.746082" elapsed="0.074250"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.820691" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.820406" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.820389" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:19.745935" elapsed="0.074856"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:19.745762" elapsed="0.075059"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:19.743228" elapsed="0.077647"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:19.736591" elapsed="0.084337"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:19.735965" elapsed="0.085008"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:19.732443" elapsed="0.088583"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.821931" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/announce_l3vpn_mcast_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/announce_l3vpn_mcast_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.822101" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.821709" elapsed="0.000449"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:19.822555" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.822323" elapsed="0.000259"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.822930" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/withdraw_l3vpn_mcast_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/withdraw_l3vpn_mcast_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.823056" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.822742" elapsed="0.000341"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:19.823450" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.823247" elapsed="0.000243"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:19.823776" elapsed="0.003312"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.823562" elapsed="0.003562"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.823544" elapsed="0.003606"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.864806" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.864413" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.865594" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.865337" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.865765" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.865001" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.866339" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.865957" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.866718" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.866847" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.866582" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.867272" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.867032" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.868281" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.868028" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.868769" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.868502" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.869451" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.869153" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:19.870410" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.870002" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:19.870523" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:19.870679" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:19.869682" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.870898" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:19.869015" elapsed="0.002167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.871748" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:19.871432" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:19.872703" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.872281" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:19.872779" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:19.872931" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:19.871965" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.873109" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:19.871295" elapsed="0.002074"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:19.868846" elapsed="0.004558"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:19.873450" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:57:19.873624" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:19.867699" elapsed="0.005950"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.867385" elapsed="0.006296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.873857" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.873705" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.867366" elapsed="0.006567"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.874892" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.874079" elapsed="0.000842"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.874971" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:19.863791" elapsed="0.011306"/>
</kw>
<msg time="2026-05-01T00:57:19.875151" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.850931" elapsed="0.024267"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.887555" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.899878" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.912381" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.912679" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.912865" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.913261" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.913107" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:19.913092" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.913508" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.913683" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.913856" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:19.913057" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.912944" elapsed="0.000993"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.914087" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.914164" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:19.914305" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:19.845472" elapsed="0.068861"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.939185" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.938765" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.940055" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.939795" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.940227" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.939428" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.940830" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.940422" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.941164" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:19.941342" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:19.941022" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.941795" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;2001:d00::/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv6-next-hop&gt;
            &lt;global&gt;2001:db8:1::7&lt;/global&gt;
        &lt;/ipv6-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.941550" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:19.942327" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.941992" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.942883" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.942587" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.942415" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.941968" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.943631" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:19.943117" elapsed="0.000545"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:19.943714" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:19.938073" elapsed="0.005778"/>
</kw>
<msg time="2026-05-01T00:57:19.943911" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:19.925418" elapsed="0.018543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.956712" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.969226" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.981619" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.981845" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.982035" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.982466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.982296" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:19.982278" elapsed="0.000275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.982702" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.982877" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.983048" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:19.982239" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.982119" elapsed="0.001070"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.983347" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:19.983426" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:19.983611" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguis...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:19.924510" elapsed="0.059132"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:19.985060" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:19.984769" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:19.985229" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:19.984365" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:19.985611" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:19.985332" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.986166" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:19.985874" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.985691" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.985313" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.988642" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:19.986403" elapsed="0.002265"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:19.988721" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:19.988883" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:19.984012" elapsed="0.004897"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.990483" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.990214" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.990924" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;2001:d00::/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv6-next-hop&gt;
            &lt;global&gt;2001:db8:1::7&lt;/global&gt;
        &lt;/ipv6-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.990689" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.991378" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.991136" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.991867" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.991592" elapsed="0.000319"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:19.992744" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:19.992540" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:19.993326" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:19.993151" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:19.993578" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:19.994200" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:19.993953" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:19.994286" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:19.994442" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:19.992116" elapsed="0.002369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:20.007202" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '1048', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;l3vpn-mcast-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-key&gt;gAABrBAALABlGCABDQAAAAA=&lt;/route-key&gt;
    &lt;route-distinguisher&gt;172.16.0.44:101&lt;/route-distinguisher&gt;
    &lt;prefix&gt;2001:d00::/24&lt;/prefix&gt;
    &lt;attributes&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;extended-communities&gt;
            &lt;transitive&gt;true&lt;/transitive&gt;
            &lt;vrf-route-import-extended-community&gt;
                &lt;inet4-specific-extended-community-common&gt;
                    &lt;global-administrator&gt;10.0.0.1&lt;/global-administrator&gt;
                    &lt;local-administrator&gt;MTA=&lt;/local-administrator&gt;
                &lt;/inet4-specific-extended-community-common&gt;
            &lt;/vrf-route-import-extended-community&gt;
        &lt;/extended-communities&gt;
        &lt;ipv6-next-hop&gt;
            &lt;global&gt;2001:db8:1::7&lt;/global&gt;
        &lt;/ipv6-next-hop&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;as-path/&gt;
    &lt;/attributes&gt;
&lt;/l3vpn-mcast-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:20.007287" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6/l3vpn-mcast-route=gAABrBAALABlGCABDQAAAAA%3D,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:20.007402" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:19.996842" elapsed="0.010587"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.994559" elapsed="0.012956"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.007738" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.007548" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:19.994541" elapsed="0.013290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.014652" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.009133" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.008767" elapsed="0.006062"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.008748" elapsed="0.006139"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.018574" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.015536" elapsed="0.003084"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.015012" elapsed="0.003643"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.014975" elapsed="0.003705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.019278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.018875" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.019636" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.019375" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.020229" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.019893" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.019719" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.019358" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.020854" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.020494" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.021311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.020950" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.021884" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.021586" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.021395" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.020932" elapsed="0.001037"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.022127" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:20.022961" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.022658" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.023143" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:20.008271" elapsed="0.017271"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:20.025728" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:57:20.025618" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.025600" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.025983" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.026051" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:20.028333" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:19.989248" elapsed="0.039113"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.028433" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:57:20.028606" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:19.832324" elapsed="0.196308"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.028994" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.028737" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.028720" elapsed="0.000366"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.029119" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:19.827400" elapsed="0.201843"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.033857" level="INFO">${update} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.030203" elapsed="0.003703"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.034138" elapsed="0.005155"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:20.039373" elapsed="0.000050"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:20.029921" elapsed="0.009687"/>
</kw>
<msg time="2026-05-01T00:57:20.039720" level="INFO">${update} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:20.029424" elapsed="0.010334"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.041058" level="INFO">Length is 178.</msg>
<msg time="2026-05-01T00:57:20.041134" level="INFO">${len_1} = 178</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:20.040725" elapsed="0.000433"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.041683" level="INFO">Length is 178.</msg>
<msg time="2026-05-01T00:57:20.041760" level="INFO">${len_2} = 178</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:20.041405" elapsed="0.000379"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.041943" elapsed="0.000318"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.042632" level="INFO">${sum_1} = 1895</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:20.042423" elapsed="0.000235"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.043007" level="INFO">${sum_2} = 1895</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:20.042815" elapsed="0.000217"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.043190" elapsed="0.000328"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:20.040097" elapsed="0.003482"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:20.043734" elapsed="0.002798"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.092816" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.092379" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.093788" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.093520" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:20.093962" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:20.093161" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.094562" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:20.094158" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.094898" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:20.095068" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:20.094757" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.095518" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.095257" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.096913" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.096314" elapsed="0.000646"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.097408" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.097129" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.098276" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.097847" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.099430" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.098948" elapsed="0.000582"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.099671" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:57:20.099911" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.098521" elapsed="0.001418"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.100100" elapsed="0.000439"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:20.097705" elapsed="0.002928"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.101326" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.100911" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.102482" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.101984" elapsed="0.000581"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.102703" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:20.102925" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.101561" elapsed="0.001390"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.103107" elapsed="0.000420"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:20.100756" elapsed="0.002814"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.097515" elapsed="0.006091"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.103652" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:20.103811" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:20.095985" elapsed="0.007852"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.095644" elapsed="0.008227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.104057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.103898" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.095620" elapsed="0.008516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.104903" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.104285" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.105090" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:20.091740" elapsed="0.013491"/>
</kw>
<msg time="2026-05-01T00:57:20.105287" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.078959" elapsed="0.026381"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.118185" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.130677" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.143053" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.143344" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.143549" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.143960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.143808" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:20.143792" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.144188" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.144360" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.144545" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:20.143754" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.143634" elapsed="0.000993"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.144779" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.144858" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:20.145006" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:20.074512" elapsed="0.070522"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.146259" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.145970" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:20.155497" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:20.155589" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:20.155757" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:20.148768" elapsed="0.007020"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.146378" elapsed="0.009470"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.156118" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.155888" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.146360" elapsed="0.009847"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.160000" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.157407" elapsed="0.002646"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.157151" elapsed="0.002943"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.157129" elapsed="0.002992"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.162772" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.160413" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.160179" elapsed="0.002673"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.160161" elapsed="0.002722"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.163518" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.163091" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.163863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.163618" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.164529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.164201" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.164026" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.163600" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.165150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.164780" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.165506" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.165249" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.166081" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.165786" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.165618" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.165230" elapsed="0.000933"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.166320" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:20.167154" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.166856" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.167337" elapsed="0.002356"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:20.156675" elapsed="0.013087"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:20.169814" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:57:20.172105" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:20.145311" elapsed="0.026821"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.172186" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:20.047543" elapsed="0.124769"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.047092" elapsed="0.125276"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:20.046722" elapsed="0.125706"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.176922" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.173398" elapsed="0.003554"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.177109" elapsed="0.002235"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:20.179397" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:20.173114" elapsed="0.006432"/>
</kw>
<msg time="2026-05-01T00:57:20.179623" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:20.172618" elapsed="0.007031"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.180543" level="INFO">Length is 142.</msg>
<msg time="2026-05-01T00:57:20.180621" level="INFO">${len_1} = 142</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:20.180259" elapsed="0.000387"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.181060" level="INFO">Length is 142.</msg>
<msg time="2026-05-01T00:57:20.181134" level="INFO">${len_2} = 142</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:20.180800" elapsed="0.000358"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.181317" elapsed="0.000327"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.182024" level="INFO">${sum_1} = 1588</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:20.181835" elapsed="0.000214"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:20.182377" level="INFO">${sum_2} = 1588</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:20.182202" elapsed="0.000200"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:20.182644" elapsed="0.000307"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:20.179876" elapsed="0.003136"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.227491" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.227081" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.228329" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.228046" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:20.228516" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:20.227703" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.229126" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:20.228712" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.229489" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:20.229729" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:20.229324" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.230175" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.229922" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.231328" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.231071" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.231828" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.231557" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.232798" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.232219" elapsed="0.000606"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.233979" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.233520" elapsed="0.000501"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.234142" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:20.234402" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.233019" elapsed="0.001409"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.234605" elapsed="0.000512"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:20.232082" elapsed="0.003077"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.235945" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.235414" elapsed="0.000557"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.237272" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.236657" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.237432" elapsed="0.000057"/>
</return>
<msg time="2026-05-01T00:57:20.237683" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.236161" elapsed="0.001548"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.237931" elapsed="0.000581"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:20.235278" elapsed="0.003277"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.231907" elapsed="0.006685"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.238637" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:20.238799" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:20.230705" elapsed="0.008120"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.230354" elapsed="0.008503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.239040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.238884" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.230326" elapsed="0.008792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.239886" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.239264" elapsed="0.000650"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.239963" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:20.226413" elapsed="0.013676"/>
</kw>
<msg time="2026-05-01T00:57:20.240145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.213404" elapsed="0.026804"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.252953" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.265439" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.277956" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.278180" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.278371" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.278816" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.278645" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:20.278628" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.279046" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.279217" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.279474" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:20.278590" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.278457" elapsed="0.001102"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.279712" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.279792" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:20.279941" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:20.208848" elapsed="0.071122"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.281187" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.280903" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:20.288307" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:20.288705" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '403'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv6-address-family'][safi='bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family']/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:20.288861" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:20.288906" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.283406" elapsed="0.005932">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:20.281305" elapsed="0.008116">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.289643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.289476" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:20.281287" elapsed="0.008442">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.293497" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.290867" elapsed="0.002664">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:20.290594" elapsed="0.003001">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:20.290576" elapsed="0.003051">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.296248" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.293922" elapsed="0.002360">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:20.293697" elapsed="0.002704">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:20.293680" elapsed="0.002756">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.297066" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.296658" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.297409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.297166" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.297994" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.297688" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.297516" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.297148" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.298625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.298242" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.298991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.298722" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.299552" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.299238" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.299074" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.298704" elapsed="0.000932"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.299793" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:20.300632" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.300311" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:20.303090" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.300816" elapsed="0.002307">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.290130" elapsed="0.013132">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:20.303327" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:20.305713" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:20.305743" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:20.280250" elapsed="0.025521">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.305839" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.184080" elapsed="0.121932">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.183656" elapsed="0.122420"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:20.183242" elapsed="0.122897"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:19.821315" elapsed="0.484877"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:19.731966" elapsed="0.574344"/>
</test>
<test id="s1-s17-t7" name="Play_To_Odl_l3vpn_mcast_ipv6" line="81">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:20.309784" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:20.309511" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.311188" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:20.311070" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.311049" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.316233" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:20.316126" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.316108" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.317313" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:20.316931" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.317814" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:20.317520" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:20.317884" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:20.318041" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:20.316552" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.323626" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:20.323514" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.323494" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.324912" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:20.324802" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.324784" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:20.325444" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.325130" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:20.325893" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:20.325664" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:20.354196" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:20.326424" elapsed="0.027911"/>
</kw>
<msg time="2026-05-01T00:57:20.354549" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:20.354596" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.326084" elapsed="0.028549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:20.384924" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "3 "v "p "n "_ "m "c "a "s "t "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:20.355455" elapsed="0.029588"/>
</kw>
<msg time="2026-05-01T00:57:20.385210" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:20.385256" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.354839" elapsed="0.030453"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.385676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.385387" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.385359" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.386271" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "l "3 "v "p "n "_ "m "c "a "s "t "_ "i "p "v "6 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.385918" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.386669" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.386422" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.386403" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:20.386904" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:20.389822" elapsed="0.000153"/>
</kw>
<msg time="2026-05-01T00:57:20.390039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.388587" elapsed="0.001591"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.390489" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.390839" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:20.387871" elapsed="0.003160"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:20.387245" elapsed="0.003853"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:20.324498" elapsed="0.066702"/>
</kw>
<msg time="2026-05-01T00:57:20.391296" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:20.391343" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.323851" elapsed="0.067529"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:20.391592" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:20.391478" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.391439" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.392116" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.392497" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.392571" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:20.323125" elapsed="0.069556"/>
</kw>
<msg time="2026-05-01T00:57:20.392776" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:20.392822" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "P "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.318448" elapsed="0.074412"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.393195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.392937" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.392919" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:20.318301" elapsed="0.074997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:20.318122" elapsed="0.075212"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:20.315761" elapsed="0.077668"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:20.310739" elapsed="0.082810"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:20.310270" elapsed="0.083333"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:20.307186" elapsed="0.086476"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.394865" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.394349" elapsed="0.000546"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.395544" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.395068" elapsed="0.000505"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.396187" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.395743" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.396747" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/announce_l3vpn_mcast_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/announce_l3vpn_mcast_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:20.396927" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:20.396426" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.397309" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/withdraw_l3vpn_mcast_ipv6.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/withdraw_l3vpn_mcast_ipv6.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:20.397435" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:20.397118" elapsed="0.000360"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:20.397636" elapsed="0.008410"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:20.406497" elapsed="0.003999"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.464921" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.464513" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.465761" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.465484" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:20.465941" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:20.465126" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.466543" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:20.466135" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.466882" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:20.467068" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:20.466736" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.467522" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.467259" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.468701" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.468293" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.469206" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.468926" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.470063" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.469644" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.471335" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.470767" elapsed="0.000671"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.471542" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:57:20.471850" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.470283" elapsed="0.001594"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.472035" elapsed="0.000462"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:20.469497" elapsed="0.003044"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.473399" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:20.472825" elapsed="0.000600"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:20.474687" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.474113" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:20.474870" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:20.475171" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:20.473640" elapsed="0.001557"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:20.475356" elapsed="0.000392"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:20.472660" elapsed="0.003132"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.469290" elapsed="0.006537"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:20.475871" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:20.476033" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:20.467962" elapsed="0.008097"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.467653" elapsed="0.008437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.476274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.476120" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.467626" elapsed="0.008724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.477139" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:20.476518" elapsed="0.000651"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:20.477220" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:20.463867" elapsed="0.013480"/>
</kw>
<msg time="2026-05-01T00:57:20.477404" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:20.451034" elapsed="0.026437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.490712" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.503197" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.515592" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.515909" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.516102" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.516542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.516371" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:20.516352" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.516774" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.516946" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.517116" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:20.516311" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.516187" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.517383" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.517477" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:20.517635" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:20.446621" elapsed="0.071043"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.519103" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.518784" elapsed="0.000395">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:20.519273" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:20.518365" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.519651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.519368" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.520212" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:20.519917" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.519734" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.519349" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.523059" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:20.520485" elapsed="0.002603"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:20.523142" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:20.523307" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:20.518012" elapsed="0.005321"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:20.524631" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.524357" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:20.524796" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:20.524011" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:20.525036" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:20.524898" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:20.524878" elapsed="0.000298"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.525368" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.525563" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.525632" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:20.527580" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:20.523669" elapsed="0.003939"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.529114" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.528848" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:20.529633" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:20.529364" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:20.537189" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:20.537352" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:20.537478" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.532050" elapsed="0.005812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:20.529750" elapsed="0.008214">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.538169" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.538008" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:20.529731" elapsed="0.008526">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.538678" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.538814" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:20.538776" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:20.538759" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.539027" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.539097" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.527947" elapsed="0.011258">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.539317" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.423790" elapsed="0.115629">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:20.539722" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:20.539536" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:20.539519" elapsed="0.000298"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:20.539853" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:20.418609" elapsed="0.121347">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.593630" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.593213" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.594442" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.594180" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.594634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.593842" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.595217" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.594828" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.595572" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:22.595754" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:22.595408" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.596193" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.595942" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.597287" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.596970" elapsed="0.000362"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.597794" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.597521" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.598630" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.598196" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:22.599921" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.599311" elapsed="0.000716"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:22.600109" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:22.600418" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:22.598850" elapsed="0.001666"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.600682" elapsed="0.000399"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:22.598056" elapsed="0.003068"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.603432" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.601382" elapsed="0.002095"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:22.604739" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.604162" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:22.604923" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:22.605223" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:22.603680" elapsed="0.001570"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.605409" elapsed="0.000475"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:22.601243" elapsed="0.004685"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:22.597872" elapsed="0.008093"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:22.606011" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:22.606173" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:22.596645" elapsed="0.009555"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.596317" elapsed="0.009916"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.606413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.606259" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.596294" elapsed="0.010237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.607270" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.606679" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.607350" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:22.592589" elapsed="0.014906"/>
</kw>
<msg time="2026-05-01T00:57:22.607552" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.579921" elapsed="0.027681"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.620170" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.632570" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.644922" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.645172" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.645355" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.645754" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.645604" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:22.645588" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.645982" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.646156" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.646327" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:22.645556" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.645432" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.646580" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.646660" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:22.646787" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:22.575671" elapsed="0.071144"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.648211" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.647885" elapsed="0.000397">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.648375" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.647534" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.648752" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.648494" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.649319" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.649020" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.648836" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.648473" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.651947" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.649578" elapsed="0.002397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:22.652028" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:22.652199" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:22.647147" elapsed="0.005078"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.653482" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.653231" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.653640" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.652887" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:22.653873" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:22.653736" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.653718" elapsed="0.000278"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.654151" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.654328" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.654395" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:22.656356" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:22.652556" elapsed="0.003828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.657818" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.657564" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.658268" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.658024" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:22.665863" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:22.666493" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:22.666656" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:22.660542" elapsed="0.006152"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.658381" elapsed="0.008375"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.667013" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.666793" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.658362" elapsed="0.008771"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.672039" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.668640" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.668304" elapsed="0.003853"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.668279" elapsed="0.003914"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.675243" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.672656" elapsed="0.002634"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.672319" elapsed="0.003006"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.672293" elapsed="0.003058"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.675947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.675547" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.676315" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.676049" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.676885" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.676584" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.676400" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.676031" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.677519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.677135" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.677906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.677664" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.678472" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.678157" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.677989" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.677645" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.678717" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:22.679552" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.679242" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.679738" elapsed="0.002345"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:22.667682" elapsed="0.014466"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.682326" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:22.682219" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.682200" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.685405" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.682566" elapsed="0.002869"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:22.685507" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:22.685670" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:22.656720" elapsed="0.028977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.685761" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:22.685912" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:22.553316" elapsed="0.132622"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.714498" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.714008" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.715322" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.715037" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.715642" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.714697" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.716277" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.715839" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.716658" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:22.716854" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:22.716487" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.717319" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::7"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "2001:d00::/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.717050" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:22.717863" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.717442" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.718625" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.718099" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.717949" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.717423" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.719347" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.718862" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.719426" elapsed="0.000051"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:22.713362" elapsed="0.006217"/>
</kw>
<msg time="2026-05-01T00:57:22.719640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.700386" elapsed="0.019303"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.732294" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.744737" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.757216" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.757481" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.757665" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.758048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.757900" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:22.757886" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.758272" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.758441" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.758629" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:22.757855" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.757745" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.758858" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.758934" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:22.759079" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:22.697754" elapsed="0.061352"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.759283" elapsed="0.002399"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.762953" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.762432" elapsed="0.000549"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.763622" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.763139" elapsed="0.000511"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:22.763809" elapsed="0.000329"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:22.762012" elapsed="0.002187"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.761765" elapsed="0.002468"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.764409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.764258" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.761746" elapsed="0.002759"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:22.687095" elapsed="0.077460"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:22.686267" elapsed="0.078366"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.686025" elapsed="0.078655"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.686008" elapsed="0.078696"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.764738" elapsed="0.000030"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:22.547421" elapsed="0.217449"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:20.410930" elapsed="2.354043"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.814358" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.813966" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.815207" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.814925" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.815385" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.814584" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.815981" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.815596" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.816312" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:22.816559" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:22.816172" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.816993" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.816749" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.818324" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.817801" elapsed="0.000570"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.818841" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.818565" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.819670" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.819244" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:22.820940" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.820350" elapsed="0.000698"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:22.821129" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:22.821451" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:22.819891" elapsed="0.001603"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.821655" elapsed="0.000388"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:22.819103" elapsed="0.002981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.822761" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.822337" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:22.824003" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.823433" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:22.824196" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:22.824518" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:22.822979" elapsed="0.001565"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.824700" elapsed="0.000369"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:22.822201" elapsed="0.002969"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:22.818922" elapsed="0.006285"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:22.825251" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:22.825411" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:22.817473" elapsed="0.007963"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.817115" elapsed="0.008401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.825698" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.825544" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.817092" elapsed="0.008682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.826535" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.825920" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.826614" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:22.813314" elapsed="0.013425"/>
</kw>
<msg time="2026-05-01T00:57:22.826794" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.800659" elapsed="0.026183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.839643" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.851979" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.864380" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.864596" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.864776" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.865148" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.865000" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:22.864985" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.865370" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.865556" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.865774" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:22.864955" elapsed="0.000907"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.864852" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.866040" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.866117" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:22.866248" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:22.796380" elapsed="0.069896"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.867649" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.867357" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.867818" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.866987" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.868177" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.867919" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.868754" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.868443" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.868259" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.867899" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.871509" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.868997" elapsed="0.002540"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:22.871589" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:22.871749" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:22.866637" elapsed="0.005136"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.872999" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.872767" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.873155" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.872409" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:22.873384" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:22.873250" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.873232" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.873636" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.873808" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.873909" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:22.875830" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:22.872082" elapsed="0.003775"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.877253" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.877003" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.877767" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.877523" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:22.886086" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:22.886434" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:22.886562" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:22.879956" elapsed="0.006632"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.877882" elapsed="0.008749"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.886814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.886657" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.877860" elapsed="0.009038"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.890568" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.887937" elapsed="0.002682"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.887710" elapsed="0.002944"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.887692" elapsed="0.002988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.894242" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.890987" elapsed="0.003320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.890736" elapsed="0.003618"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.890719" elapsed="0.003672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.895206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.894651" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.895704" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.895343" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.896493" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.896054" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.895819" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.895318" elapsed="0.001296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.897344" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.896841" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.897837" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.897502" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.898655" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.898218" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.897949" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.897475" elapsed="0.001296"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.898998" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:22.899898" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.899550" elapsed="0.000374"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:22.900088" elapsed="0.002348"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:22.887274" elapsed="0.015245"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.902699" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:22.902591" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.902572" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.905781" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.902919" elapsed="0.002892"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:22.905864" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:22.906026" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:22.876172" elapsed="0.029881"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.906143" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:22.906300" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:22.773830" elapsed="0.132496"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.934729" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.934191" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.935584" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:22.935273" elapsed="0.000439">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:22.935893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:22.934928" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.936547" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:22.936088" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:22.936902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:22.937060" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:22.936742" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.937529" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::7"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "2001:d00::/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:22.937246" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:22.938104" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.937698" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.938888" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:22.938339" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.938189" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.937679" elapsed="0.001295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:22.939634" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:22.939124" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.939713" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:22.933571" elapsed="0.006271"/>
</kw>
<msg time="2026-05-01T00:57:22.939902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.920702" elapsed="0.019250"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.952402" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.964879" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.977203" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.977410" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.977609" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.978005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.977855" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:22.977840" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.978230" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.978397" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.978581" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:22.977807" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.977695" elapsed="0.001033"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.978886" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:22.978964" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:22.979118" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:22.918017" elapsed="0.061128"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:22.979326" elapsed="0.002377"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.983024" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.982475" elapsed="0.000578"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:22.983698" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:22.983210" elapsed="0.000517"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:22.983886" elapsed="0.000328"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:22.982037" elapsed="0.002237"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.981785" elapsed="0.002521"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:22.984501" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:22.984331" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.981767" elapsed="0.002812"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:22.907497" elapsed="0.077131"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:22.906679" elapsed="0.078027"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:22.906411" elapsed="0.078341"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:22.906394" elapsed="0.078382"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:22.984812" elapsed="0.000030"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:22.769486" elapsed="0.215478"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:22.765176" elapsed="0.219853"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.034550" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.034140" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.035369" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.035109" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.035630" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.034754" elapsed="0.000902"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.036219" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.035825" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.036570" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:23.036731" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.036412" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.037165" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.036918" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.038504" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.037965" elapsed="0.000587"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.039001" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.038722" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.039878" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.039446" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:23.041150" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.040583" elapsed="0.000671"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:23.041335" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:23.041666" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:23.040102" elapsed="0.001591"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.041853" elapsed="0.000398"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:23.039303" elapsed="0.002990"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.042969" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.042564" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:23.044241" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.043691" elapsed="0.000654"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:23.044422" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:57:23.044740" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:23.043212" elapsed="0.001554"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.044921" elapsed="0.000372"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:23.042410" elapsed="0.002924"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:23.039118" elapsed="0.006252"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:23.045417" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:23.045597" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:23.037636" elapsed="0.007986"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.037286" elapsed="0.008369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.045837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.045682" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.037264" elapsed="0.008649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.046687" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.046062" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.046764" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:23.033501" elapsed="0.013389"/>
</kw>
<msg time="2026-05-01T00:57:23.046991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.020823" elapsed="0.026221"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.059692" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.072194" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.084819" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.085162" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.085357" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.085841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.085682" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:23.085664" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.086078" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.086248" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.086415" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:23.085619" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.085446" elapsed="0.001082"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.086682" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.086767" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:23.086942" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:23.016572" elapsed="0.070400"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.088611" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.088280" elapsed="0.000413">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.088789" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.087862" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.089162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.088885" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.089748" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.089435" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.089244" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.088867" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.092497" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.089986" elapsed="0.002540"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:23.092581" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:23.092744" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:23.087362" elapsed="0.005407"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.094028" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.093786" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.094185" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.093429" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:23.094415" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:23.094280" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.094262" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.094667" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.094839" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.094904" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:23.096882" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:23.093094" elapsed="0.003816"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.098327" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.098071" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.098786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.098545" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:23.106842" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:23.106997" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '487'} 
 body={"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}} 
 </msg>
<msg time="2026-05-01T00:57:23.107176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:23.100988" elapsed="0.006215"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.098896" elapsed="0.008352"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.107447" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.107276" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.098878" elapsed="0.008706"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.112976" level="INFO">{"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.108705" elapsed="0.004343"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.108473" elapsed="0.004625"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.108436" elapsed="0.004697"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.116826" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.113550" elapsed="0.003339"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.113211" elapsed="0.003726"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.113188" elapsed="0.003784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.117808" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.117230" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.118282" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.117944" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.119074" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.118657" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.118396" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.117919" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.119983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.119422" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.120319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.120081" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.120876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.120581" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.120399" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.120062" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.121114" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:23.121955" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.121651" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.122137" elapsed="0.002336"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:23.108001" elapsed="0.016540"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.124723" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:23.124612" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.124593" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.127812" level="INFO">${text_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.124944" elapsed="0.002898"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:23.127895" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:23.128062" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:23.097233" elapsed="0.030989"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.128293" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:23.128468" level="INFO">${response_text} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:22.994043" elapsed="0.134453"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.156998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.156492" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.157891" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.157581" elapsed="0.000440">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.158199" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.157209" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.158859" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.158396" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.159222" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:23.159389" level="INFO">${template} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.159057" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.159864" level="INFO">{
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "attributes": {
                    "ipv6-next-hop": {
                        "global": "2001:db8:1::7"
                    },
                    "extended-communities": [
                        {
                            "vrf-route-import-extended-community": {
                                "inet4-specific-extended-community-common": {
                                    "local-administrator": "MTA=",
                                    "global-administrator": "10.0.0.1"
                                }
                            },
                            "transitive": true
                        }
                    ],
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-distinguisher": "172.16.0.44:101",
                "prefix": "2001:d00::/24"
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.159596" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:23.160485" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.160027" elapsed="0.000522"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.161231" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.160727" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.160576" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.160003" elapsed="0.001311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.161986" level="INFO">${final_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.161482" elapsed="0.000534"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.162068" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:23.155803" elapsed="0.006400"/>
</kw>
<msg time="2026-05-01T00:57:23.162321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.142852" elapsed="0.019522"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.175112" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.187779" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.200284" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.200563" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.200761" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.201205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.201048" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:23.201029" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.201440" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.201632" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.201802" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:23.200986" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.200851" elapsed="0.001033"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.202036" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.202117" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:23.202311" level="INFO">${expected_text} = {
    "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
        "l3vpn-mcast-route": [
            {
                "route-key": "gAABrBAALABlGCABDQAAAAA=",
                "path-id": 0,
                "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:23.140195" elapsed="0.062146"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.202542" elapsed="0.002602"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.206574" level="INFO">${expected_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.205988" elapsed="0.000703"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.207322" level="INFO">${actual_normalized} = {
 "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
  "l3vpn-mcast-route": [
   {
    "attributes": {
     "extended-communities": [
      {
       "transitive": true,
       "vrf-route-import-extended-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.206855" elapsed="0.000496"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:23.207532" elapsed="0.000348"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:23.205545" elapsed="0.002397"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.205229" elapsed="0.002747"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.208156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.208003" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.205209" elapsed="0.003023"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:23.129653" elapsed="0.078662"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:23.128827" elapsed="0.079569"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.128580" elapsed="0.079864"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.128563" elapsed="0.079922"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.208522" elapsed="0.000037"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:22.989687" elapsed="0.218975"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:22.985208" elapsed="0.223514"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:23.208894" elapsed="0.004022"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.265319" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.264925" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.266207" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.265888" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.266382" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.265549" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.266982" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.266596" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.267316" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:23.267505" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.267175" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.267938" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.267695" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.269279" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.268962" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.269854" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.269576" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.270687" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.270256" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:23.271937" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.271362" elapsed="0.000676"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:23.272305" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:23.272637" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:23.270908" elapsed="0.001757"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.272935" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:23.270116" elapsed="0.003254"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.274043" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.273643" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:23.275283" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.274738" elapsed="0.000649"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:23.275482" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:23.275798" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:23.274260" elapsed="0.001565"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.275981" elapsed="0.000363"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:23.273504" elapsed="0.002881"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:23.269936" elapsed="0.006485"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:23.276484" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:23.276645" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:23.268368" elapsed="0.008303"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.268060" elapsed="0.008643"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.276915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.276729" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.268037" elapsed="0.008955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.277743" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.277138" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.277820" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:23.264254" elapsed="0.013692"/>
</kw>
<msg time="2026-05-01T00:57:23.278000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.251518" elapsed="0.026531"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.290743" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.303173" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.315694" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.315911" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.316100" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.316525" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.316350" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:23.316333" elapsed="0.000277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.316759" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.316928" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.317116" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:23.316295" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.316182" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.317349" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.317426" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:23.317590" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:23.247161" elapsed="0.070457"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.319011" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.318697" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.319185" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.318296" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.319557" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.319282" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.320372" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.319826" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.319639" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.319264" elapsed="0.001213"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.322870" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.320639" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:23.322951" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:23.323111" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:23.317951" elapsed="0.005186"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.324370" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.324171" elapsed="0.000252"/>
</kw>
<msg time="2026-05-01T00:57:23.324525" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.323832" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.324758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:23.324622" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.324604" elapsed="0.000222"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.325171" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:23.325328" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.324975" elapsed="0.000378"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:23.325768" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.325530" elapsed="0.000265"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:23.325841" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:23.325998" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:23.323501" elapsed="0.002522"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.327416" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.327168" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.327879" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.327637" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:23.335769" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:23.336309" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '652'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:23.336410" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:23.330092" elapsed="0.006344"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.327989" elapsed="0.008507"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.336682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.336523" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.327971" elapsed="0.008796"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.341269" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false},"bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6":{"l3vpn-mcast-route":[{"path-id":0,"route-key":"gAABrBAALABlGCABDQAAAAA=","attributes":{"extended-communities":[{"vrf-route-import-extended-community":{"inet4-specific-extended-community-common":{"global-administrator":"10.0.0.1","local-administrator":"MTA="}},"transitive":true}],"ipv6-next-hop":{"global":"2001:db8:1::7"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-distinguisher":"172.16.0.44:101","prefix":"2001:d00::/24"}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.337840" elapsed="0.003501"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.337616" elapsed="0.003774"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.337598" elapsed="0.003827"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.345350" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.341891" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.341528" elapsed="0.003956"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.341503" elapsed="0.004019"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.346220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.345762" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.346578" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.346318" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.347125" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.346827" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.346661" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.346300" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.347754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.347372" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.348095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.347850" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.348655" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.348342" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.348176" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.347832" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.348892" elapsed="0.000472"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:23.349854" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.349558" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:23.350038" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:23.337132" elapsed="0.015285"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.352611" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:23.352504" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.352484" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.355812" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.352828" elapsed="0.003013"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:23.355894" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:23.356051" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:23.326334" elapsed="0.029744"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.356141" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:23.356293" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:23.224293" elapsed="0.132026"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.384549" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.384078" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.385440" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.385141" elapsed="0.000611">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:23.385966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:23.384799" elapsed="0.001194"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.386671" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:23.386182" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:23.387032" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:23.387305" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:23.386866" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.387784" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:23.387513" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:23.388306" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.387900" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.389068" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:23.388559" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:23.388392" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:23.387881" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.389821" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:23.389302" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:23.389900" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:23.383444" elapsed="0.006583"/>
</kw>
<msg time="2026-05-01T00:57:23.390081" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.370718" elapsed="0.019412"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.402542" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.414841" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.427254" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.427466" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.427649" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.428027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.427881" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:23.427866" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.428248" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.428419" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.428606" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:23.427836" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.427728" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.428835" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.428911" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:23.429030" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:23.368046" elapsed="0.061011"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:23.429234" elapsed="0.002366"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.432647" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.432341" elapsed="0.000334"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:23.433422" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
    "l3vpn-mcast-route": [
     {
   ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:23.432832" elapsed="0.000641"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:23.433987" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
    "l3vpn-mcast-route": [
     {
      "attributes": {
       "extended-communities": [
        {
         "transitive": true,
         "vrf-route-import-extended-community": {
          "inet4-specific-extended-community-common": {
           "global-administrator": "10.0.0.1",
           "local-administrator": "MTA="
          }
         }
        }
       ],
       "ipv6-next-hop": {
        "global": "2001:db8:1::7"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "path-id": 0,
      "prefix": "2001:d00::/24",
      "route-distinguisher": "172.16.0.44:101",
      "route-key": "gAABrBAALABlGCABDQAAAAA="
     }
    ]
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:23.434212" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
+        }
+       ],
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.433638" elapsed="0.000691">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.431927" elapsed="0.002597">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:23.431682" elapsed="0.002938">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:23.434812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:23.434657" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:23.431663" elapsed="0.003228">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.357512" elapsed="0.077527">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.356670" elapsed="0.078540">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:23.356404" elapsed="0.078944">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:23.356387" elapsed="0.079000">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:23.435439" elapsed="0.000034"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:23.217769" elapsed="0.217839">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,38 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6": {
+    "l3vpn-mcast-route": [
+     {
+      "attributes": {
+       "extended-communities": [
+        {
+         "transitive": true,
+         "vrf-route-import-extended-community": {
+          "inet4-specific-extended-community-common": {
+           "global-administrator": "10.0.0.1",
+           "local-administrator": "MTA="
+          }
+         }
    [ Message content over the limit has been removed. ]
+       "ipv6-next-hop": {
+        "global": "2001:db8:1::7"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "prefix": "2001:d00::/24",
+      "route-distinguisher": "172.16.0.44:101",
+      "route-key": "gAABrBAALABlGCABDQAAAAA="
+     }
+    ]
+   },
    "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.492289" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.491884" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.493152" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:25.492864" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:25.493330" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:25.492522" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.493932" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.493548" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.494267" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:25.494485" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:25.494126" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.494948" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.494703" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.496066" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.495754" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.496571" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.496276" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.497479" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.497040" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.498776" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.498165" elapsed="0.000714"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.498961" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:25.499269" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.497702" elapsed="0.001593"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.499475" elapsed="0.000391"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:25.496899" elapsed="0.003009"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.500592" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.500170" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.501962" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.501264" elapsed="0.000801"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.502143" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:25.502439" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.500810" elapsed="0.001674"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.502641" elapsed="0.000387"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:25.500027" elapsed="0.003046"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:25.496717" elapsed="0.006394"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:25.503155" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:25.503314" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:25.495412" elapsed="0.007927"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.495087" elapsed="0.008284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.503573" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.503397" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.495058" elapsed="0.008596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.504572" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.503800" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:25.504651" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.491229" elapsed="0.013546"/>
</kw>
<msg time="2026-05-01T00:57:25.504830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.478221" elapsed="0.026657"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.517422" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.529770" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.542147" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.542401" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.542595" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.542991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.542817" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:25.542802" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.543216" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.543386" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.543572" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:25.542773" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.542670" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.543800" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.543876" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:25.543998" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:25.473717" elapsed="0.070306"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.545272" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:25.545037" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:25.545428" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:25.544697" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.545789" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.545543" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.546342" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.546054" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.545870" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.545524" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.548780" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.546596" elapsed="0.002211"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:25.548858" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:25.549011" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:25.544352" elapsed="0.004684"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.550216" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:25.550018" elapsed="0.000289"/>
</kw>
<msg time="2026-05-01T00:57:25.550394" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:25.549684" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.550642" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.550507" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.550487" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.551040" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:25.551264" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:25.550857" elapsed="0.000433"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:25.551704" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.551469" elapsed="0.000261"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:25.551778" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:25.551932" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:25.549343" elapsed="0.002613"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.553336" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.553092" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.553790" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.553551" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:25.561327" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:25.561614" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '166'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:25.561713" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:25.556167" elapsed="0.005571"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.553898" elapsed="0.007883"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.561967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.561808" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.553880" elapsed="0.008172"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.566117" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.563119" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.562857" elapsed="0.003375"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.562839" elapsed="0.003428"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.569918" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.566681" elapsed="0.003301"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.566345" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.566322" elapsed="0.003743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.570849" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.570298" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.571364" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.570985" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.572128" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.571734" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.571499" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.570960" elapsed="0.001297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.572806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.572423" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.573147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.572904" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.573714" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.573396" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.573229" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.572886" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.573952" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:25.574767" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.574484" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.574951" elapsed="0.002328"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:25.562419" elapsed="0.014923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.577538" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.577413" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.577395" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:25.580404" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.577757" elapsed="0.002676"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:25.580503" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:25.580664" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:25.552269" elapsed="0.028422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:25.580753" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:25.580905" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:25.451129" elapsed="0.129803"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.609681" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.609192" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.610503" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:25.610211" elapsed="0.000413">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:25.610799" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:25.609875" elapsed="0.000950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.611490" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.610993" elapsed="0.000569"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.611893" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:25.612023" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:25.611732" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.612490" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.612209" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:25.613006" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.612605" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.613762" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.613241" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.613092" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.612586" elapsed="0.001260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.614497" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.613994" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:25.614576" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.608573" elapsed="0.006129"/>
</kw>
<msg time="2026-05-01T00:57:25.614755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.595780" elapsed="0.019023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.627197" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.639551" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/empty_routes/ipv6/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.653019" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.653217" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.653397" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.653827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.653678" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:25.653664" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.654051" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.654224" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.654395" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:25.653634" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.653525" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.654643" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.654720" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:25.654837" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv6-address-family",
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family",
      "attributes": {
        "uptodate": ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:25.593060" elapsed="0.061804"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.655042" elapsed="0.002203"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:25.658285" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.658002" elapsed="0.000311"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:25.658863" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv6-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
  }
 ]
...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.658487" elapsed="0.000405"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:25.659051" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:25.657587" elapsed="0.001849"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.657327" elapsed="0.002167"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.659708" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.659522" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.657308" elapsed="0.002483"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:25.582077" elapsed="0.077765"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:25.581258" elapsed="0.078659"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.581015" elapsed="0.078946"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.580998" elapsed="0.078987"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:25.660020" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:25.444653" elapsed="0.215494"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:23.213096" elapsed="2.447109"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:25.660420" elapsed="0.004115"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<arg>ipv6</arg>
<status status="PASS" start="2026-05-01T00:57:20.393941" elapsed="5.270687"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:20.306666" elapsed="5.358081"/>
</test>
<test id="s1-s17-t8" name="Kill_Talking_BGP_Speaker" line="85">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:25.668138" elapsed="0.000366"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:25.667826" elapsed="0.000757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.669973" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.669819" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.669793" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.676963" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.676857" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.676839" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.678039" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.677660" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.678544" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:25.678232" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:25.678615" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:25.678770" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.677264" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.684307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.684200" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.684181" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.685555" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.685423" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.685405" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:25.686071" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.685773" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.686496" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:25.686258" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.717731" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:25.687022" elapsed="0.030826"/>
</kw>
<msg time="2026-05-01T00:57:25.718025" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:25.718072" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.686686" elapsed="0.031423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.747740" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:25.718685" elapsed="0.029163"/>
</kw>
<msg time="2026-05-01T00:57:25.748009" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:25.748054" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "K "i "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.718309" elapsed="0.029818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.748439" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.748205" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.748186" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.748985" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.748688" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.749395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.749175" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.749157" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:25.749530" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:25.752249" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:57:25.752468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.751152" elapsed="0.001451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.752881" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.753220" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:25.750532" elapsed="0.002872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:25.749801" elapsed="0.003683"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:25.685123" elapsed="0.068460"/>
</kw>
<msg time="2026-05-01T00:57:25.753673" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:25.753716" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "K "i "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.684550" elapsed="0.069203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:25.754096" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:25.753828" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.753810" elapsed="0.000373"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.754616" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.754955" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.755026" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:25.683865" elapsed="0.071270"/>
</kw>
<msg time="2026-05-01T00:57:25.755226" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:25.755269" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "K "i "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.679160" elapsed="0.076145"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.755648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.755380" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.755363" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:25.679016" elapsed="0.076733"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:25.678847" elapsed="0.076932"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:25.676499" elapsed="0.079333"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:25.669391" elapsed="0.086494"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.668797" elapsed="0.087131"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:25.665644" elapsed="0.090336"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.757192" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.756888" elapsed="0.000331"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:25.757373" elapsed="0.000227"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:57:25.756620" elapsed="0.001048"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.775488" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:57:25.758197" elapsed="0.017350"/>
</kw>
<msg time="2026-05-01T00:57:25.775639" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:25.775683" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.757865" elapsed="0.017842"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.776349" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:25.788406" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:25.788560" level="INFO">${output_log} = 2026-05-01 00:57:07,129 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:07,129 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:25.776172" elapsed="0.012426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.789217" level="INFO">2026-05-01 00:57:07,129 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:57:07,130 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:57:07,132 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100810206010400020081020641040000fbf0
2026-05-01 00:57:07,135 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100810206010400020081020641040000fbf0'
2026-05-01 00:57:07,135 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100810206010400020081020641040000fbf0
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:07,141 INFO BGP-Thread-1 (job): ... idle for 0.004s
2026-05-01 00:57:07,141 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-05-01 00:57:07,141 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:57:07,141 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:08,144 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.006s
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:09,146 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:09,146 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.007s
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.008s
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:10,149 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.009s
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:12,151 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:12,151 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.009s
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.010s
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,154 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:13,494 INFO BGP-Thread-1 (job): ... idle for 0.340s
2026-05-01 00:57:13,494 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.350s
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004d' (77)
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:13,634 INFO BGP-Thread-1 (job): ... idle for 0.139s
2026-05-01 00:57:13,634 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.489s
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.490s
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.493s
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): ... idle for 1.008s
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.501s
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:17,655 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:57:17,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.507s
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.510s
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:18,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): ... idle for 1.004s
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.513s
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): ... idle for 0.349s
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.863s
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0059' (89)
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:20,157 INFO BGP-Thread-1 (job): ... idle for 0.142s
2026-05-01 00:57:20,157 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.004s
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): ... idle for 1.005s
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.009s
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:21,164 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:21,164 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): ... idle for 1.004s
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.013s
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:23,171 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.016s
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.018s
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:25,177 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.020s
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:25] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.788827" elapsed="0.000805"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:57:25.775896" elapsed="0.013818"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:57:25.789960" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:57:25.789805" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.789779" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.790284" elapsed="0.000030"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.790544" elapsed="0.000030"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:57:25.756285" elapsed="0.034372"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.802526" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:25.837042" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:25.837270" level="INFO">${output_log} = 2026-05-01 00:57:07,129 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:07,129 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:25.802373" elapsed="0.034959"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.838297" level="INFO">2026-05-01 00:57:07,129 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:57:07,129 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:57:07,130 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:57:07,132 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:57:07,133 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:57:07,134 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-05-01 00:57:07,134 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100810206010400020081020641040000fbf0
2026-05-01 00:57:07,135 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100810206010400020081020641040000fbf0'
2026-05-01 00:57:07,135 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eaa9d20020601040001000102060104000100810206010400020081020641040000fbf0
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,136 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,137 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:07,141 INFO BGP-Thread-1 (job): ... idle for 0.004s
2026-05-01 00:57:07,141 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-05-01 00:57:07,141 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:57:07,141 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-05-01 00:57:07,142 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:07,142 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:07,143 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:07,143 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:08,144 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.006s
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:08,145 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:09,146 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:09,146 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.007s
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:09,147 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.008s
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:10,148 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:10,149 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.009s
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:11,150 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:12,151 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:12,151 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.009s
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:12,152 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.010s
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,153 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,154 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:13,494 INFO BGP-Thread-1 (job): ... idle for 0.340s
2026-05-01 00:57:13,494 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.350s
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004d' (77)
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:13,494 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:13,495 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:13,634 INFO BGP-Thread-1 (job): ... idle for 0.139s
2026-05-01 00:57:13,634 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.489s
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:13,634 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:13,635 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:13,635 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.490s
2026-05-01 00:57:14,636 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:14,637 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.493s
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:15,640 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): ... idle for 1.008s
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.501s
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:16,649 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:17] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:17,655 INFO BGP-Thread-1 (job): ... idle for 1.006s
2026-05-01 00:57:17,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.507s
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:17,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.510s
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:18,659 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:18,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): ... idle for 1.004s
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.513s
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:19,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:19] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): ... idle for 0.349s
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.863s
2026-05-01 00:57:20,014 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0059' (89)
2026-05-01 00:57:20,014 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:20,015 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:20,015 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:20,157 INFO BGP-Thread-1 (job): ... idle for 0.142s
2026-05-01 00:57:20,157 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.004s
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:20,157 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-05-01 00:57:20,158 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:20,158 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:20] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): ... idle for 1.005s
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.009s
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:21,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:21,164 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:21,164 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): ... idle for 1.004s
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.013s
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:22,168 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:23,171 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.016s
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:23,172 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:23] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): ... idle for 1.003s
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.018s
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:24,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:25,177 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.020s
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:25,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:25] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.837736" elapsed="0.001208"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.840117" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/l3vpn_mcast_play.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/l3vpn_mcast_play.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:57:25.839343" elapsed="0.000901"/>
</kw>
<arg>play.py.out</arg>
<arg>l3vpn_mcast_play.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.802040" elapsed="0.038339"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-05-01T00:57:25.665131" elapsed="0.175578"/>
</test>
<test id="s1-s17-t9" name="Delete_Bgp_Peer_Configuration" line="91">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:25.845755" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:25.845359" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.847567" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.847387" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.847359" elapsed="0.000308"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.853193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.853086" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.853066" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.854281" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.853896" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.854797" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:25.854495" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:25.854870" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:25.855028" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.853511" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.860563" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.860440" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.860422" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.861803" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:25.861696" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.861678" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:25.862320" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.862021" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.862743" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:25.862528" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.894241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:25.863273" elapsed="0.031077"/>
</kw>
<msg time="2026-05-01T00:57:25.894536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:25.894583" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.862933" elapsed="0.031687"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:25.920977" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:25.895165" elapsed="0.025949"/>
</kw>
<msg time="2026-05-01T00:57:25.921275" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:25.921321" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.894805" elapsed="0.026553"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.921769" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.921441" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.921419" elapsed="0.000433"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.922298" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.921997" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.922675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.922438" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.922420" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:25.922789" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:25.925378" elapsed="0.000167"/>
</kw>
<msg time="2026-05-01T00:57:25.925607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.924263" elapsed="0.001476"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.926021" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.926366" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:25.923639" elapsed="0.002935"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:25.923076" elapsed="0.003563"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:25.861373" elapsed="0.065364"/>
</kw>
<msg time="2026-05-01T00:57:25.926828" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:25.926872" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.860803" elapsed="0.066108"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:25.927095" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:25.926987" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.926969" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.927599" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.927943" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:25.928015" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:25.860103" elapsed="0.068021"/>
</kw>
<msg time="2026-05-01T00:57:25.928217" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:25.928262" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.855422" elapsed="0.072878"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.928643" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.928375" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.928358" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:25.855277" elapsed="0.073468"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:25.855106" elapsed="0.073668"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:25.852715" elapsed="0.076114"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:25.846975" elapsed="0.081911"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:25.846346" elapsed="0.082587"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:25.841992" elapsed="0.086994"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.972045" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:25.971660" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.972854" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:25.972602" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:25.973021" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:25.972248" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.973636" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:25.973215" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:25.973965" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:25.974106" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:25.973829" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.974552" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.974292" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.975559" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:25.975283" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.976034" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.975766" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.976747" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.976428" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.977551" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.977285" elapsed="0.000293"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.977629" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:25.977782" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.976965" elapsed="0.000843"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.977964" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:57:25.976290" elapsed="0.001954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.978815" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.978514" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.979579" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.979349" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.979657" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:25.979811" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.979031" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.979992" elapsed="0.000225"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:57:25.978360" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.980829" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.980529" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.981657" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.981427" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.981735" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:25.981889" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.981085" elapsed="0.000829"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.982069" elapsed="0.000421"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:57:25.980374" elapsed="0.002159"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.983092" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.982789" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.983862" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.983650" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.983938" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:25.984092" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.983310" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.984271" elapsed="0.000240"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:57:25.982651" elapsed="0.001901"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.985100" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.984802" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.985897" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.985686" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.985974" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:25.986126" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.985314" elapsed="0.000837"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.986303" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:25.984667" elapsed="0.001916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.987131" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:25.986834" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:25.987891" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.987680" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:25.987965" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:25.988118" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:25.987346" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:25.988295" elapsed="0.000241"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:57:25.986698" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:25.976113" elapsed="0.012500"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:25.988656" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:25.988816" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:25.974960" elapsed="0.013882"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:25.974666" elapsed="0.014208"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:25.989051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:25.988900" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:25.974647" elapsed="0.014481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:25.989947" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:25.989273" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:25.990025" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:25.971023" elapsed="0.019126"/>
</kw>
<msg time="2026-05-01T00:57:25.990240" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:25.958034" elapsed="0.032254"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.002850" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.015244" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.027743" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.027942" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.028123" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.028519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.028347" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:26.028333" elapsed="0.000268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.028745" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.028917" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.029087" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:26.028303" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.028198" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.029315" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.029391" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:26.029531" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:25.953716" elapsed="0.075855"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.030686" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.030418" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:26.039779" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:26.039826" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:26.039934" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:26.032869" elapsed="0.007091"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.030838" elapsed="0.009163"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.040181" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.040027" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.030819" elapsed="0.009445"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.044293" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.041278" elapsed="0.003076"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.041053" elapsed="0.003350"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.041035" elapsed="0.003403"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.048067" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.044851" elapsed="0.003280"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.044541" elapsed="0.003637"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.044517" elapsed="0.003695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.048991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.048452" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.049483" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.049128" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.050219" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.049860" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.049598" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.049103" elapsed="0.001200"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.050849" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.050482" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.051181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.050946" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.051737" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.051425" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.051262" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.050928" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.051972" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:26.052776" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.052500" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.052959" elapsed="0.002442"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:26.040649" elapsed="0.014832"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:26.055529" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:26.057805" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:26.029840" elapsed="0.027992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:26.057920" elapsed="0.000029"/>
</return>
<arg>${L3VPN_MCAST_DIR}/bgp_peer</arg>
<arg>mapping=${L3VPN_MCAST_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:25.929286" elapsed="0.128762"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:57:25.841195" elapsed="0.216970"/>
</test>
<test id="s1-s17-t10" name="Deconfigure_App_Peer" line="99">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:26.061401" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:26.061137" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.062706" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.062596" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.062577" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.067728" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.067622" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.067604" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.068810" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:26.068400" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.069292" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:26.069000" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:26.069363" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:26.069539" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:26.068024" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.075372" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.075266" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.075247" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.076638" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.076532" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.076514" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:26.077154" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.076852" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.077574" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:26.077339" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.105463" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:26.078110" elapsed="0.027454"/>
</kw>
<msg time="2026-05-01T00:57:26.105725" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:26.105772" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.077762" elapsed="0.028047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.135723" level="INFO">". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:26.106376" elapsed="0.029451"/>
</kw>
<msg time="2026-05-01T00:57:26.135986" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:26.136040" level="INFO">${message_wait} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.106013" elapsed="0.030064"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.136375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.136155" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.136135" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.136980" level="INFO"> ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.136682" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.137336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.137119" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.137101" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:26.137447" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:26.140322" elapsed="0.000164"/>
</kw>
<msg time="2026-05-01T00:57:26.140549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.139090" elapsed="0.001589"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.140956" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.141291" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.138442" elapsed="0.003051"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:26.137730" elapsed="0.003829"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:26.076209" elapsed="0.065447"/>
</kw>
<msg time="2026-05-01T00:57:26.141747" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:26.141790" level="INFO">${message} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.075613" elapsed="0.066214"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:26.142008" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:26.141902" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.141884" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.142534" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.142871" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.142942" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:26.074925" elapsed="0.068123"/>
</kw>
<msg time="2026-05-01T00:57:26.143143" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:26.143186" level="INFO">${output} =  ". "t "x "t ". "0 "7 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "L "3 "V "p "n "[C "M "c "a "s "t ". "D "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.069946" elapsed="0.073277"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.143562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.143297" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.143280" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:26.069801" elapsed="0.073862"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:26.069617" elapsed="0.074075"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:26.067247" elapsed="0.076496"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:26.062288" elapsed="0.081509"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.061860" elapsed="0.081980"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:26.059015" elapsed="0.084875"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.186250" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.185880" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:26.187055" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:26.186821" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:26.187220" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:26.186488" elapsed="0.000756"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.187808" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:26.187406" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:26.188138" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/l3vpn_mcast/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:26.188278" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:26.187998" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.188722" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.188479" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.189728" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.189469" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.190200" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.189934" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.190906" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:26.190608" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:26.191678" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.191446" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:26.191755" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:26.191908" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:26.191127" elapsed="0.000806"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.192088" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:26.190469" elapsed="0.001887"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.192920" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:26.192624" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:26.193825" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.193465" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:26.193902" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:26.194054" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:26.193133" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.194237" elapsed="0.000266"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:26.192488" elapsed="0.002057"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:26.190272" elapsed="0.004308"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:26.194623" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:26.194782" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:26.189132" elapsed="0.005676"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.188836" elapsed="0.006037"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.195052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.194899" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.188817" elapsed="0.006312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.195858" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.195274" elapsed="0.000613"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:26.195936" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:26.185251" elapsed="0.010810"/>
</kw>
<msg time="2026-05-01T00:57:26.196116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.172686" elapsed="0.023475"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.208487" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.220767" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.233047" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.233242" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.233421" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.233805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.233658" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:26.233643" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.234028" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.234198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.234367" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:26.233614" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.233512" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.234636" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.234713" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:26.234877" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:26.168408" elapsed="0.066497"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.236026" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.235769" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:26.244442" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0lqks34x09d3qaou9ksl4msd126.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:26.244538" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:26.244665" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:26.238167" elapsed="0.006535"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.236140" elapsed="0.008617"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.245011" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.244794" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.236122" elapsed="0.009005"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.251689" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.246549" elapsed="0.005201"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.246218" elapsed="0.005582"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.246194" elapsed="0.005641"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.255479" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.252225" elapsed="0.003321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.251913" elapsed="0.003681"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.251890" elapsed="0.003738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.256383" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.255862" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.256880" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.256543" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.257798" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.257355" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.256993" elapsed="0.000892"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.256518" elapsed="0.001398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.258828" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.258143" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.259233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.258963" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.259789" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.259495" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:26.259314" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.258939" elapsed="0.000933"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.260023" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:26.260886" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:26.260606" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.261067" elapsed="0.002308"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:26.245653" elapsed="0.017785"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:26.263501" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:26.265740" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:26.235174" elapsed="0.030593"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:26.265820" elapsed="0.000027"/>
</return>
<arg>${L3VPN_MCAST_DIR}/app_peer</arg>
<arg>mapping=${L3VPN_MCAST_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:26.144112" elapsed="0.121832"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:57:26.058447" elapsed="0.207605"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:57:26.266812" elapsed="0.000391"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:26.267432" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:57:26.267359" elapsed="0.000174"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:57:26.266570" elapsed="0.001015"/>
</kw>
<doc>Functional test for bgp - l3vpn-mutlicast

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distbmution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising l3vpn_mcast routes to odl. For advertising play.py is used,
and particular files are stored as *.hex files.
There are L3vpn-ipv4-multicast routes and L3vpn-ipv6-multicast routes tested.</doc>
<status status="PASS" start="2026-05-01T00:57:04.477734" elapsed="21.789908"/>
</suite>
<suite id="s1-s18" name="080 Bgp Functional Rt Constrain" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.355351" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:26.351078" elapsed="0.004321"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:57:26.350855" elapsed="0.004621"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.360283" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:26.356569" elapsed="0.003742"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:57:26.360512" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.360391" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.360370" elapsed="0.000208"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.361093" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:26.360734" elapsed="0.000402"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.361630" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:26.361302" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:57:26.362152" elapsed="0.000273"/>
</kw>
<msg time="2026-05-01T00:57:26.362538" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:26.362585" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.361820" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.363137" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:26.362775" elapsed="0.000388"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.364192" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:26.363926" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.364641" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:26.364369" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.365110" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.364826" elapsed="0.000311"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.368300" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.369002" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.368679" elapsed="0.000349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.369183" elapsed="0.000239"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.370231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.369935" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:57:26.370303" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:26.370475" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.369640" elapsed="0.000862"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:26.371263" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a1921b410&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:57:26.370659" elapsed="0.000729"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.371569" elapsed="0.000195"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:57:26.367743" elapsed="0.004081"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:26.367549" elapsed="0.004319"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:57:26.365231" elapsed="0.006668"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.372478" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:26.372062" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.373083" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:26.372688" elapsed="0.000437"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.373688" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:26.373289" elapsed="0.000441"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:57:26.363468" elapsed="0.010319"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:57:26.356206" elapsed="0.017637"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.374020" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.373908" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.373889" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.377189" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:26.376813" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.377688" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:26.377376" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:26.377759" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:26.377913" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:26.376486" elapsed="0.001452"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:26.378927" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.378664" elapsed="0.000289"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.379872" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:26.380009" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.379721" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.383394" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.382813" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.382794" elapsed="0.000743"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.384199" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:26.384431" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.383766" elapsed="0.000736"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.385429" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.384769" elapsed="0.000784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.386733" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.385827" elapsed="0.000959"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.388707" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:57:26.388889" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:26.388178" elapsed="0.000754"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.389281" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.390908" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:57:26.751693" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:04 UTC 2026

  System load:  0.1                Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:57:05 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:57:26.390581" elapsed="0.361193"/>
</kw>
<msg time="2026-05-01T00:57:26.751835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.390113" elapsed="0.361830"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:57:26.387228" elapsed="0.364836"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.752794" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:57:26.766168" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:57:26.766565" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:57:26.766795" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:26.752358" elapsed="0.014546"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.767619" elapsed="0.001101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.771252" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.770049" elapsed="0.001490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.772402" elapsed="0.000147"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.771892" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.771844" elapsed="0.000958"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:57:26.773557" elapsed="0.000138"/>
</return>
<status status="PASS" start="2026-05-01T00:57:26.772982" elapsed="0.000890"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.772944" elapsed="0.001091"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.774136" elapsed="0.000018"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.777313" elapsed="0.000462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.778054" elapsed="0.000276"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.778612" elapsed="0.000221"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.774617" elapsed="0.004285"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:57:26.381864" elapsed="0.397210"/>
</kw>
<msg time="2026-05-01T00:57:26.779128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.381220" elapsed="0.397960"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:57:26.380728" elapsed="0.398531"/>
</kw>
<msg time="2026-05-01T00:57:26.779299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.380197" elapsed="0.399147"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.782096" elapsed="0.000328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.782608" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.782901" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.779723" elapsed="0.003325"/>
</kw>
<msg time="2026-05-01T00:57:26.783142" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:57:26.379171" elapsed="0.403996"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.783658" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.783346" elapsed="0.000353"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:57:26.783741" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:57:26.378291" elapsed="0.405572"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:26.378112" elapsed="0.405787"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:26.377987" elapsed="0.405945"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:57:26.374312" elapsed="0.409673"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:57:26.784141" elapsed="0.000207"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.798372" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.798263" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.798244" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.798746" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:26.798848" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.798616" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.799287" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.799032" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.799747" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:26.799504" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:26.800545" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:57:26.800311" elapsed="0.000341">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:57:26.800794" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:57:26.800841" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.799951" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:26.801169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:26.800942" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.800923" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:26.802051" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.801784" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:57:26.802125" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:26.802276" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.801509" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.802473" elapsed="0.000394"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.803140" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:26.803238" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.803037" elapsed="0.000227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.803412" elapsed="0.002187"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.806019" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:57:26.957782" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.805764" elapsed="0.152104"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.961073" elapsed="0.000333"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.961599" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.961899" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:26.958715" elapsed="0.003332"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:26.958164" elapsed="0.003929"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:57:26.797988" elapsed="0.164171"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:26.785065" elapsed="0.177142"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.784698" elapsed="0.177560"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:26.784558" elapsed="0.177740"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:57:26.784401" elapsed="0.177928"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:57:26.355765" elapsed="0.606623"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.965075" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.964964" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.964945" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.969997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.969891" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.969873" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.971039" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:26.970661" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:26.971537" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:26.971227" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:26.971608" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:26.971763" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:26.970316" elapsed="0.001471"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.977236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.977130" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.977112" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:26.978561" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:26.978411" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:26.978394" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:26.979109" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:26.978777" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:26.979538" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:26.979298" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.010546" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:26.980227" elapsed="0.030450"/>
</kw>
<msg time="2026-05-01T00:57:27.010804" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:27.010850" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.979726" elapsed="0.031160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.056399" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "8 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:27.011582" elapsed="0.044986"/>
</kw>
<msg time="2026-05-01T00:57:27.056696" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:27.056742" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.011059" elapsed="0.045719"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.057096" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.056853" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.056834" elapsed="0.000437"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.057790" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "8 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.057420" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.058178" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.057943" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.057925" elapsed="0.000474"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:27.058434" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.060610" elapsed="0.000450"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.061407" elapsed="0.000328"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:27.062070" elapsed="0.000235"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:27.059802" elapsed="0.002595"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:27.058734" elapsed="0.003845"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:26.978106" elapsed="0.084576"/>
</kw>
<msg time="2026-05-01T00:57:27.062774" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.062818" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.977472" elapsed="0.085383"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:27.063039" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.062932" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.062913" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.063592" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.063933" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.064005" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:26.976843" elapsed="0.087268"/>
</kw>
<msg time="2026-05-01T00:57:27.064203" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.064246" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.972152" elapsed="0.092131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.064627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.064358" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.064341" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:26.972007" elapsed="0.092722"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:26.971838" elapsed="0.092920"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:26.969602" elapsed="0.095208"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:57:26.963031" elapsed="0.101832"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:26.962565" elapsed="0.102339"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:57:26.350541" elapsed="0.714413"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.065452" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.065110" elapsed="0.000381"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.065975" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:27.065661" elapsed="0.000357"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.068042" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:57:27.068119" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:27.067416" elapsed="0.000726"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.068301" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.069527" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:57:27.388684" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:05 UTC 2026

  System load:  0.08               Processes:             105
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:57:06 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:57:27.069194" elapsed="0.319571"/>
</kw>
<msg time="2026-05-01T00:57:27.388825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.068835" elapsed="0.320044"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:57:27.066985" elapsed="0.321976"/>
</kw>
<msg time="2026-05-01T00:57:27.389010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.066602" elapsed="0.322451"/>
</kw>
<arg>${TOOLS_SYSTEM_USER}</arg>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:57:27.066216" elapsed="0.322911"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:27.389604" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18ba09d0&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:57:27.389292" elapsed="0.000473"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.398601" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:57:27.419744" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:57:27.389930" elapsed="0.029947"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.421963" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:57:27.454409" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:27.454691" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:57:27.454791" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:57:27.454882" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:27.421779" elapsed="0.033153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.456838" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:57:27.456159" elapsed="0.000781"/>
</kw>
<msg time="2026-05-01T00:57:27.457150" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:57:27.457247" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.455341" elapsed="0.001958"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.458672" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.457715" elapsed="0.001017"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.459695" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.458908" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.458862" elapsed="0.001034"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:57:27.460231" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.460017" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.459983" elapsed="0.000467"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.460685" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.460607" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:27.460571" elapsed="0.000251"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.461147" elapsed="0.000047"/>
</kw>
<msg time="2026-05-01T00:57:27.461499" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:57:27.421382" elapsed="0.040175"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:57:27.462002" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.461794" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.461754" elapsed="0.000425"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.462541" elapsed="0.000049"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:57:27.420695" elapsed="0.042031"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:26.350237" elapsed="1.112603"/>
</kw>
<test id="s1-s18-t1" name="Configure_App_Peer" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:27.467184" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:27.466922" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.468475" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.468347" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.468329" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.473709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.473602" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.473584" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.474783" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.474386" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.475264" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:27.474971" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:27.475334" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:27.475507" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.474006" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.480980" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.480874" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.480855" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.482394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.482289" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.482271" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:27.482932" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.482637" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.483331" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:27.483119" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.513468" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:27.483867" elapsed="0.029701"/>
</kw>
<msg time="2026-05-01T00:57:27.513729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:27.513774" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.483534" elapsed="0.030276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.544444" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:27.514322" elapsed="0.030240"/>
</kw>
<msg time="2026-05-01T00:57:27.544757" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:27.544802" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "C "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.513980" elapsed="0.030859"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.545137" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.544916" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.544897" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.545723" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.545399" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.546075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.545860" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.545842" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:27.546190" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:27.548717" elapsed="0.000141"/>
</kw>
<msg time="2026-05-01T00:57:27.548919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.547633" elapsed="0.001412"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.549321" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.549682" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:27.547005" elapsed="0.002862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:27.546476" elapsed="0.003455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:27.481988" elapsed="0.068040"/>
</kw>
<msg time="2026-05-01T00:57:27.550118" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.550161" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "C "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.481214" elapsed="0.068984"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:27.550554" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.550273" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.550255" elapsed="0.000388"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.551035" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.551370" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.551441" elapsed="0.000051"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:27.480542" elapsed="0.071045"/>
</kw>
<msg time="2026-05-01T00:57:27.551679" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.551722" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "C "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.475905" elapsed="0.075853"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.552080" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.551833" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.551816" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:27.475760" elapsed="0.076420"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:27.475587" elapsed="0.076622"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:27.473222" elapsed="0.079040"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:27.468043" elapsed="0.084274"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.467621" elapsed="0.084740"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:27.464175" elapsed="0.088237"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.585861" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.585488" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.586644" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:27.586391" elapsed="0.000328">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:27.586813" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:27.586054" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.587389" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.587003" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.587732" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:27.587866" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:27.587597" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.588287" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.588049" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.589300" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.589047" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.589798" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.589524" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.590491" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.590177" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.592577" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.592337" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.592655" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:27.592809" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.590708" elapsed="0.002126"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.593018" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:27.590040" elapsed="0.003255"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.593863" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.593563" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.594628" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.594399" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.594704" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.594856" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.594080" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.595038" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:27.593409" elapsed="0.001893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:27.589872" elapsed="0.005465"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:27.595380" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:27.595599" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:27.588709" elapsed="0.006917"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.588400" elapsed="0.007259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.595838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.595684" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.588382" elapsed="0.007533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.596662" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.596059" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.596741" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.584844" elapsed="0.012045"/>
</kw>
<msg time="2026-05-01T00:57:27.596944" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.572283" elapsed="0.024708"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.609473" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.621916" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.634343" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.634555" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.634736" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.635107" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.634960" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:27.634946" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.635330" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.635518" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.635690" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:27.634916" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.634812" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.635920" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.636031" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:27.636155" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:27.568010" elapsed="0.068172"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.662925" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.662547" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.663750" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:27.663540" elapsed="0.000274">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:27.663908" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:27.663183" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.664501" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.664099" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.664828" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:27.664954" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:27.664693" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.665469" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.665144" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:27.665881" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.665590" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.666402" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.666111" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.665963" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.665571" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.667209" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.666654" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.667289" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.661915" elapsed="0.005501"/>
</kw>
<msg time="2026-05-01T00:57:27.667488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.649006" elapsed="0.018530"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.679942" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.692301" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.704762" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.704959" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.705138" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.705550" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.705389" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:27.705374" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.705776" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.705945" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.706111" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:27.705315" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.705211" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.706336" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.706412" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:27.706548" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:27.646261" elapsed="0.060315"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.707828" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:27.707593" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:27.707984" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:27.707240" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.708323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.708078" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.708923" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.708632" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.708439" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.708060" elapsed="0.000947"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.711541" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.709161" elapsed="0.002407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:27.711620" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.711777" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:27.706912" elapsed="0.004890"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.713190" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.712942" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.713700" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.713439" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.714149" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.713906" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.714604" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.714345" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:27.715473" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:27.715264" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:27.715846" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:27.715668" elapsed="0.000204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.716024" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.716646" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.716381" elapsed="0.000311"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:27.716733" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.716889" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:27.714857" elapsed="0.002058"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:27.733039" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:57:27.733098" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:57:27 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:27.733272" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:27.719073" elapsed="0.014255"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.716986" elapsed="0.016440"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.733904" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.733552" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.716967" elapsed="0.017129"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.741972" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.736310" elapsed="0.005759"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.735732" elapsed="0.006409"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.735691" elapsed="0.006477"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.744748" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.742464" elapsed="0.002330"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.742225" elapsed="0.002603"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.742208" elapsed="0.002645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.745397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.745022" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.745788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.745535" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.746335" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.746037" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.745870" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.745498" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.746960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.746600" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.747293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.747056" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.747852" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.747555" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.747374" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.747039" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.748089" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:27.748900" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.748622" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.749081" elapsed="0.002331"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:27.734912" elapsed="0.016579"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:27.751666" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.751560" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.751541" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.751903" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.751972" elapsed="0.000014"/>
</return>
<msg time="2026-05-01T00:57:27.754335" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:27.712132" elapsed="0.042230"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.754426" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:57:27.754605" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:27.557155" elapsed="0.197475"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.754968" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.754727" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.754710" elapsed="0.000350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.755093" elapsed="0.000027"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/app_peer</arg>
<arg>mapping=${RT_CONSTRAIN_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:27.552780" elapsed="0.202476"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-05-01T00:57:27.462961" elapsed="0.292567"/>
</test>
<test id="s1-s18-t2" name="Reconfigure_ODL_To_Accept_Connection" line="56">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:27.758787" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:27.758523" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.760036" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.759926" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.759908" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.765190" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.765084" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.765066" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.766289" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.765911" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.766791" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:27.766494" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:27.766862" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:27.767017" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.765505" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.772540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.772416" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.772397" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.773800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:27.773693" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.773674" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:27.774310" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.774013" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.774729" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:27.774515" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.802210" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:27.775249" elapsed="0.027061"/>
</kw>
<msg time="2026-05-01T00:57:27.802496" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:27.802545" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.774915" elapsed="0.027667"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:27.865696" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:27.803097" elapsed="0.062709"/>
</kw>
<msg time="2026-05-01T00:57:27.865962" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:27.866008" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "R "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.802755" elapsed="0.063310"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.866367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.866144" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.866123" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.866952" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.866653" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.867320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.867099" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.867081" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:27.867431" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:27.870167" elapsed="0.000146"/>
</kw>
<msg time="2026-05-01T00:57:27.870375" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.868906" elapsed="0.001622"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.870973" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.871320" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:27.868241" elapsed="0.003372"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:27.867716" elapsed="0.003966"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:27.773339" elapsed="0.098442"/>
</kw>
<msg time="2026-05-01T00:57:27.871877" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.871922" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "R "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.772764" elapsed="0.099196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:27.872145" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:27.872038" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.872019" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.872652" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.872998" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.873070" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:27.772080" elapsed="0.101099"/>
</kw>
<msg time="2026-05-01T00:57:27.873271" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:27.873314" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "R "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.767405" elapsed="0.105946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.873713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.873425" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.873408" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:27.767261" elapsed="0.106553"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:27.767092" elapsed="0.106750"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:27.764722" elapsed="0.109173"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:27.759642" elapsed="0.114308"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:27.759200" elapsed="0.114795"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:27.756353" elapsed="0.117696"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.907468" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.907074" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.908229" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:27.908011" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:27.908390" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:27.907673" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.908984" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.908599" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.909311" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:27.909441" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:27.909177" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.909888" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.909647" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.910929" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.910672" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.911400" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.911136" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.912261" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.911804" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.913033" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.912820" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.913111" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.913264" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.912496" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.913444" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:57:27.911666" elapsed="0.002066"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.914302" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.913985" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.915060" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.914852" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.915134" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.915284" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.914532" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.915477" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:57:27.913846" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.916283" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.915991" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.917039" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.916831" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.917152" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:27.917307" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.916514" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.917503" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:57:27.915854" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.918356" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.918020" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.919114" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.918907" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.919189" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:27.919339" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.918588" elapsed="0.000776"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.919537" elapsed="0.000223"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:57:27.917883" elapsed="0.001918"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.920347" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.920052" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.921111" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.920896" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.921187" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:27.921337" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.920579" elapsed="0.000783"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.921533" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:27.919915" elapsed="0.001881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.922380" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:27.922044" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:27.923317" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.923108" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:27.923502" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:27.923655" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:27.922613" elapsed="0.001066"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:27.923833" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:57:27.921909" elapsed="0.002187"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:27.911491" elapsed="0.012639"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:27.924172" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:27.924329" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:27.910330" elapsed="0.014025"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.910001" elapsed="0.014385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.924579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.924411" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.909982" elapsed="0.014674"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.925441" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.924801" elapsed="0.000685"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.925536" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.906391" elapsed="0.019270"/>
</kw>
<msg time="2026-05-01T00:57:27.925749" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.893706" elapsed="0.032091"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.938140" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.950506" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.962816" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.963013" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.963191" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.963570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.963406" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:27.963392" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.963793" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.963964" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.964150" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:27.963363" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.963265" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:27.964378" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:27.964472" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:27.964596" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:27.889465" elapsed="0.075158"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.991090" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.990669" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.991907" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:27.991689" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:27.992099" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:27.991338" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.992686" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:27.992290" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:27.993010" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:27.993134" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:27.992876" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.993581" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:27.993321" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:27.993987" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:27.993696" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.994527" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:27.994217" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:27.994070" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:27.993678" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:27.995612" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:27.994799" elapsed="0.000844"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:27.995693" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:27.989935" elapsed="0.005886"/>
</kw>
<msg time="2026-05-01T00:57:27.995874" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:27.977408" elapsed="0.018512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.008269" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.020557" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.032860" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.033087" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.033267" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.033649" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.033501" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:28.033486" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.033872" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.034044" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.034210" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:28.033441" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.033340" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.034436" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.034531" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:28.034653" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:27.974696" elapsed="0.059987"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:28.035956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:28.035724" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:28.036110" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:28.035367" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.036453" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.036204" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.037002" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:28.036715" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.036548" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.036186" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.039429" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:28.037237" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:28.039522" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:28.039677" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:28.035042" elapsed="0.004660"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.041067" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.040823" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.041515" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.041265" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.041956" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.041716" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.042432" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.042193" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:28.043309" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:28.043116" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:28.043782" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:28.043610" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:28.043959" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.044581" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.044316" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:28.044673" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:28.044828" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:28.042700" elapsed="0.002153"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:28.094983" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '295', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.157&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:57:28.095041" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:28.095132" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:28.047217" elapsed="0.047971"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.044924" elapsed="0.050368"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.095737" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.095352" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.044906" elapsed="0.051033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.103424" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.098069" elapsed="0.005487"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.097575" elapsed="0.006059"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.097535" elapsed="0.006155"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.106515" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.104226" elapsed="0.002336"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.103812" elapsed="0.002784"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.103776" elapsed="0.002844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.107176" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:28.106786" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.107528" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.107273" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.108074" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:28.107777" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.107611" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.107255" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.108696" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:28.108320" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.109028" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.108793" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.109739" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:28.109319" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:28.109150" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.108776" elapsed="0.001047"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:28.109977" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:28.110787" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:28.110509" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:28.110969" elapsed="0.002315"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:28.096762" elapsed="0.016584"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:28.113537" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:57:28.113414" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.113396" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.113776" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.113845" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:28.116128" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:28.040024" elapsed="0.076131"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:28.116219" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:28.116370" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:27.878732" elapsed="0.237663"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.116746" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.116508" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.116490" elapsed="0.000346"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:28.116869" elapsed="0.000026"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/bgp_peer</arg>
<arg>mapping=${RT_CONSTRAIN_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:27.874345" elapsed="0.242645"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:57:27.755802" elapsed="0.361300"/>
</test>
<test id="s1-s18-t3" name="Start_Bgp_Peer" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:28.121249" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:28.120981" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.122529" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:28.122393" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.122375" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.127725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:28.127619" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.127601" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.128792" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:28.128394" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.129273" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:28.128979" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:28.129382" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:28.129562" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:28.128021" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.135041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:28.134933" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.134915" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.136304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:28.136198" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.136180" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:28.136844" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:28.136546" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:28.137250" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:28.137032" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:28.170605" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:28.137807" elapsed="0.032905"/>
</kw>
<msg time="2026-05-01T00:57:28.170882" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:28.170929" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:28.137438" elapsed="0.033527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:28.202881" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:28.171539" elapsed="0.031448"/>
</kw>
<msg time="2026-05-01T00:57:28.203146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:28.203191" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "S "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:28.171143" elapsed="0.032085"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.203579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.203306" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.203286" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.204100" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.203806" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.204452" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.204234" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.204216" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:28.204583" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:28.207129" elapsed="0.000310"/>
</kw>
<msg time="2026-05-01T00:57:28.207519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:28.206014" elapsed="0.001642"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.207940" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.208283" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:28.205379" elapsed="0.003117"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:28.204847" elapsed="0.003717"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:28.135898" elapsed="0.072798"/>
</kw>
<msg time="2026-05-01T00:57:28.208788" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:28.208831" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "S "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:28.135296" elapsed="0.073572"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:28.209051" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:28.208944" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.208926" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.209551" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.209889" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:28.209961" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:28.134598" elapsed="0.075470"/>
</kw>
<msg time="2026-05-01T00:57:28.210160" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:28.210203" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "S "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:28.129956" elapsed="0.080284"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:28.210581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:28.210315" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:28.210298" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:28.129812" elapsed="0.080870"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:28.129640" elapsed="0.081072"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:28.127244" elapsed="0.083520"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:28.122110" elapsed="0.088708"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:28.121682" elapsed="0.089180"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:28.118516" elapsed="0.092398"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Start_Bgp_Peer">
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.212669" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:28.212317" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:28.213094" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:28.212856" elapsed="0.000283"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:28.216705" level="INFO">python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-05-01T00:57:28.216801" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.170.157 --myport=17900 --peerip=10.30.170.185 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:28.213390" elapsed="0.003438"/>
</kw>
<arg>--amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --debug --rt_constrain --wfr 1</arg>
<doc>Start the BGP speaker python utility. Redirect its error output to a log file
so it can be dumped into the logs later, when stopping it. This also avoids polluting the
output seen by "Read Until Prompt" with false propmpts so it won't stop prematurely
leading to a spurious test failure, messy log content or other misbehavior.</doc>
<status status="PASS" start="2026-05-01T00:57:28.211885" elapsed="0.005006"/>
</kw>
<kw name="Read_And_Fail_If_Prompt_Is_Seen" owner="BGPcliKeywords">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Read_Text_Before_Prompt" owner="BGPcliKeywords">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.219128" level="FAIL">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-01T00:57:28.218500" elapsed="6.001446">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.220294" elapsed="0.000043"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-05-01T00:57:28.218211" elapsed="6.002273">No match found for '&gt;' in 6 seconds
Output:
[?2004l.</status>
</kw>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-05-01T00:57:28.217807" elapsed="6.002956"/>
</kw>
<msg time="2026-05-01T00:57:34.220909" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>BuiltIn.Run_Keyword_And_Expect_Error</arg>
<arg>No match found for '${ODL_SYSTEM_PROMPT}' in *.</arg>
<arg>Read_Text_Before_Prompt</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:28.217428" elapsed="6.003509"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:57:34.221155" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:57:34.221046" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.221017" elapsed="0.000235"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.221546" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.221734" elapsed="0.000023"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-05-01T00:57:28.217148" elapsed="6.004671"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-05-01T00:57:28.211554" elapsed="6.010316"/>
</kw>
<arg>3x</arg>
<arg>1s</arg>
<arg>Start_Bgp_Peer</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:28.211082" elapsed="6.010834"/>
</kw>
<doc>Start Python speaker to connect to ODL. We need to do WUKS until odl really starts to accept incomming bgp connection. The failure happens if the incomming connection comes too quickly after configuring the peer in the previous test case.</doc>
<status status="PASS" start="2026-05-01T00:57:28.117630" elapsed="6.104427"/>
</test>
<test id="s1-s18-t4" name="Odl_To_Play_rt_constrain_default" line="69">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:34.227801" elapsed="0.000286"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:34.227528" elapsed="0.000617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.229288" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.229153" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.229134" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.234621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.234510" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.234491" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.235726" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.235313" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.236218" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:34.235919" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:34.236289" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:34.236464" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.234929" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.241969" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.241860" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.241841" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.243221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.243114" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.243096" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:34.243772" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.243438" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.244201" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:34.243979" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.275202" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:34.244777" elapsed="0.030527"/>
</kw>
<msg time="2026-05-01T00:57:34.275489" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:34.275537" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.244387" elapsed="0.031233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.339196" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "d "e "f "a "u "l "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:34.276146" elapsed="0.063256"/>
</kw>
<msg time="2026-05-01T00:57:34.339649" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:34.339697" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.275799" elapsed="0.063934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.340160" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.339848" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.339811" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.340806" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "d "e "f "a "u "l "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.340397" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.341185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.340948" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.340930" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:34.341303" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:34.344041" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:57:34.344253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.342895" elapsed="0.001495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.344732" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.345077" elapsed="0.000110"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:34.342227" elapsed="0.003076"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:34.341639" elapsed="0.003731"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:34.242815" elapsed="0.102673"/>
</kw>
<msg time="2026-05-01T00:57:34.345583" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:34.345628" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.242193" elapsed="0.103471"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:34.345852" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:34.345743" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.345724" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.346345" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.346704" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.346776" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:34.241523" elapsed="0.105364"/>
</kw>
<msg time="2026-05-01T00:57:34.346980" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:34.347025" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.236930" elapsed="0.110133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.347502" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.347139" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.347122" elapsed="0.000462"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:34.236755" elapsed="0.110853"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:34.236547" elapsed="0.111096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:34.234125" elapsed="0.113575"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:34.228818" elapsed="0.118937"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.228305" elapsed="0.119494"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:34.223066" elapsed="0.124785"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.348748" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/announce_rt_constrain_default.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/announce_rt_constrain_default.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.348947" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.348541" elapsed="0.000432"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:34.349363" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.349148" elapsed="0.000242"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.350009" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/withdraw_rt_constrain_default.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/withdraw_rt_constrain_default.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.350164" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.349810" elapsed="0.000388"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:34.350662" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.350409" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:34.351078" elapsed="0.002854"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.350794" elapsed="0.003189"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.350770" elapsed="0.003251"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.396823" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.396387" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.397725" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.397416" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:34.397906" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:34.397033" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.398515" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.398106" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.398856" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.399022" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.398711" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.399541" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.399270" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.400616" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.400324" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.401128" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.400847" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.401882" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.401576" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.402897" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.402428" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.402981" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:34.403149" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.402103" elapsed="0.001072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.403339" elapsed="0.000276"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:34.401418" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.404393" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.403917" elapsed="0.000503"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.405408" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.404974" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.405508" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:34.405666" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.404638" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.405848" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:34.403779" elapsed="0.002336"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.401233" elapsed="0.004917"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.406196" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:34.406354" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:34.399991" elapsed="0.006390"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.399672" elapsed="0.006741"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.406613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.406439" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.399648" elapsed="0.007043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.407435" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.406840" elapsed="0.000641"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.407533" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.395753" elapsed="0.011911"/>
</kw>
<msg time="2026-05-01T00:57:34.407720" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.382799" elapsed="0.024971"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.420514" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.432924" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.445603" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.445817" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.445996" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.446370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.446219" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:34.446205" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.446615" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.446786" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.446954" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:34.446175" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.446071" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.447182" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.447258" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:34.447382" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:34.377479" elapsed="0.069933"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.472156" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.471779" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.472927" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.472708" elapsed="0.000284">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:34.473086" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:34.472351" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.473705" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.473277" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.474069" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.474203" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.473932" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.474655" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-constrain-default-route/&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.474391" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:34.475075" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.474776" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.475619" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.475308" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.475158" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.474758" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.476296" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.475853" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.476376" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.471142" elapsed="0.005377"/>
</kw>
<msg time="2026-05-01T00:57:34.476577" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.458310" elapsed="0.018315"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.488979" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.501389" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.515108" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.515382" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.515705" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.516201" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.516015" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:34.515995" elapsed="0.000305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.516503" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.516748" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.516944" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:34.515951" elapsed="0.001071"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.515810" elapsed="0.001254"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.517226" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.517305" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:34.517440" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:34.457457" elapsed="0.060058"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.518845" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.518590" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:34.519007" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:34.518224" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.519355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.519103" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.519942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.519646" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.519437" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.519085" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.522657" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.520183" elapsed="0.002502"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:34.522738" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:34.522896" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:34.517883" elapsed="0.005037"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.524483" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.524217" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.524940" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-constrain-default-route/&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.524693" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.525436" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.525188" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.525929" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.525684" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:34.526812" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:34.526614" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:34.527188" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:34.527014" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.527367" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.527989" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.527744" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:34.528075" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:34.528230" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:34.526182" elapsed="0.002073"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:34.547312" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '541', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;route-target-constrain-default-route/&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:34.547492" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes/route-target-constrain-route=flow1,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:34.547756" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:34.530477" elapsed="0.017338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.528326" elapsed="0.019590"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.548320" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.547975" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.528309" elapsed="0.020270"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.555313" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.550951" elapsed="0.004406"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.550417" elapsed="0.004976"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.550376" elapsed="0.005042"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.558328" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.555715" elapsed="0.002670"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.555490" elapsed="0.002936"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.555472" elapsed="0.002995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.559060" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.558650" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.559402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.559158" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.559967" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.559671" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.559502" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.559140" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.560637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.560256" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.560979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.560740" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.561575" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.561224" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.561060" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.560716" elapsed="0.000955"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.561830" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:34.562648" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.562342" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.562831" elapsed="0.002296"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:34.549383" elapsed="0.015806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:34.565369" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:57:34.565263" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.565244" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.565636" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.565706" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:34.567967" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:34.523255" elapsed="0.044739"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.568064" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:34.568219" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:34.361169" elapsed="0.207075"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.568607" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.568349" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.568332" elapsed="0.000368"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.568734" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:34.354402" elapsed="0.214459"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.582674" level="INFO">${update} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.569819" elapsed="0.012920"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.583130" elapsed="0.004737"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:34.587978" elapsed="0.000065"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:34.569520" elapsed="0.018739"/>
</kw>
<msg time="2026-05-01T00:57:34.588439" level="INFO">${update} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:34.569037" elapsed="0.019504"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.590533" level="INFO">Length is 100.</msg>
<msg time="2026-05-01T00:57:34.590609" level="INFO">${len_1} = 100</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:34.590048" elapsed="0.000585"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.591042" level="INFO">Length is 100.</msg>
<msg time="2026-05-01T00:57:34.591116" level="INFO">${len_2} = 100</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:34.590788" elapsed="0.000352"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.591299" elapsed="0.000326"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.591962" level="INFO">${sum_1} = 1099</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:34.591785" elapsed="0.000203"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.592311" level="INFO">${sum_2} = 1099</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:34.592144" elapsed="0.000193"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.592509" elapsed="0.000313"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:34.589142" elapsed="0.003742"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:34.593035" elapsed="0.003203"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.642368" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.641976" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.643204" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.642941" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:34.643384" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:34.642596" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.643993" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.643607" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.644326" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.644555" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.644187" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.644990" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.644746" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.646127" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.645816" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.646642" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.646338" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.647471" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.647039" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.648602" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.648110" elapsed="0.000574"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.648885" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:34.649123" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.647690" elapsed="0.001459"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.649310" elapsed="0.000655"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:34.646900" elapsed="0.003109"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.650708" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.650266" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.652006" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.651346" elapsed="0.000744"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.652230" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:34.652473" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.650926" elapsed="0.001575"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.652659" elapsed="0.000401"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:34.650127" elapsed="0.002975"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.646721" elapsed="0.006416"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.653182" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:34.653341" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:34.645442" elapsed="0.007925"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.645130" elapsed="0.008268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.653596" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.653426" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.645106" elapsed="0.008567"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.654436" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.653853" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.654531" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.641304" elapsed="0.013353"/>
</kw>
<msg time="2026-05-01T00:57:34.654712" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.628622" elapsed="0.026139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.667242" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.679675" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.692200" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.692630" elapsed="0.000033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.692863" elapsed="0.000026"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.693365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.693199" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:34.693175" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.693622" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.693792" elapsed="0.000051"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.693994" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:34.693123" elapsed="0.000924"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.692967" elapsed="0.001109"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.694228" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.694311" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:34.694504" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:34.624254" elapsed="0.070281"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.695814" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.695494" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:34.704994" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:34.705047" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:34.705153" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:34.698030" elapsed="0.007148"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.695935" elapsed="0.009285"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.705442" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.705249" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.695916" elapsed="0.009691"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.712099" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.707531" elapsed="0.004653"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.707081" elapsed="0.005170"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.707048" elapsed="0.005246"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.715864" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.712827" elapsed="0.003096"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.712399" elapsed="0.003566"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.712367" elapsed="0.003630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.716781" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.716262" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.717301" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.716998" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.718176" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.717802" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.717388" elapsed="0.000863"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.716972" elapsed="0.001305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.718866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.718485" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.719234" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.718975" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.719862" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.719520" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.719326" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.718956" elapsed="0.001002"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.720166" elapsed="0.000433"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:34.721170" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.720790" elapsed="0.000411"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.721407" elapsed="0.002758"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:34.706317" elapsed="0.017924"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:34.724298" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:57:34.726653" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:34.694844" elapsed="0.031837"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.726737" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:34.597260" elapsed="0.129605"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.596840" elapsed="0.130083"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:34.596432" elapsed="0.130552"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.730782" level="INFO">${update} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.728019" elapsed="0.002793"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.730991" elapsed="0.002825"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:34.733914" elapsed="0.000043"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:34.727708" elapsed="0.006387"/>
</kw>
<msg time="2026-05-01T00:57:34.734202" level="INFO">${update} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:34.727162" elapsed="0.007077"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.735482" level="INFO">Length is 88.</msg>
<msg time="2026-05-01T00:57:34.735608" level="INFO">${len_1} = 88</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:34.735084" elapsed="0.000563"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.736263" level="INFO">Length is 88.</msg>
<msg time="2026-05-01T00:57:34.736369" level="INFO">${len_2} = 88</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:34.735899" elapsed="0.000504"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.736657" elapsed="0.000430"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.737572" level="INFO">${sum_1} = 652</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:34.737309" elapsed="0.000299"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:34.738164" level="INFO">${sum_2} = 652</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:34.737823" elapsed="0.000377"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:34.738418" elapsed="0.000452"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:34.734569" elapsed="0.004384"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.798503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.797986" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.799390" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.799100" elapsed="0.000384">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:34.799582" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:34.798726" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.800164" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.799775" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.800520" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.800697" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.800355" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.801136" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.800890" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.802317" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.802055" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.802822" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.802546" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.803813" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.803227" elapsed="0.000612"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.805002" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.804539" elapsed="0.000509"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.805172" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:34.805414" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.804036" elapsed="0.001405"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.805621" elapsed="0.000567"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:34.803086" elapsed="0.003146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.807046" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:34.806514" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:34.808400" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.807770" elapsed="0.000672"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:34.808585" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:34.808811" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:34.807270" elapsed="0.001623"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.809054" elapsed="0.000519"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:34.806352" elapsed="0.003264"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.802902" elapsed="0.006751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:34.809699" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:34.809889" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:34.801679" elapsed="0.008238"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.801273" elapsed="0.008676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.810147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.809976" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.801246" elapsed="0.008979"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.811037" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.810371" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.811122" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.797151" elapsed="0.014117"/>
</kw>
<msg time="2026-05-01T00:57:34.811329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.778433" elapsed="0.032962"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.824971" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.839111" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.851665" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.851898" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.852088" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.852534" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.852361" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:34.852343" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.852771" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.853020" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.853191" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:34.852298" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.852173" elapsed="0.001100"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.853424" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.853521" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:34.853690" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:34.772416" elapsed="0.081307"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.855004" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.854707" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:34.863822" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:34.864613" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '431'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-route-target-constrain:route-target-constrain-subsequent-address-family']/bgp-route-target-constrain:route-target-constrain-routes",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:34.864903" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:34.864984" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.857244" elapsed="0.008526">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:34.855123" elapsed="0.010813">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.866418" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.866015" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:34.855105" elapsed="0.011448">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.870935" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.868069" elapsed="0.002905">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:34.867778" elapsed="0.003265">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:34.867751" elapsed="0.003326">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.873850" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.871503" elapsed="0.002382">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:34.871254" elapsed="0.002696">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:34.871234" elapsed="0.002749">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.874725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.874251" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.875074" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.874828" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.875655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.875330" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.875160" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.874809" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.876277" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.875908" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.876657" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.876376" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.877207" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:34.876911" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.876743" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.876357" elapsed="0.000933"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.877467" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:34.878371" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:34.878018" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:34.880904" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.878580" elapsed="0.002358">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.867130" elapsed="0.013957">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:34.881154" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:34.883927" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:34.883958" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:34.854006" elapsed="0.029982">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:34.884057" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.740563" elapsed="0.143669">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.739869" elapsed="0.144431"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:34.739271" elapsed="0.145093"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:34.348137" elapsed="0.536285"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.222589" elapsed="0.661973"/>
</test>
<test id="s1-s18-t5" name="Play_To_Odl_rt_constrain_default" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:34.889882" elapsed="0.000243"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:34.889568" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.891276" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.891154" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.891131" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.896378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.896268" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.896250" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.897500" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:34.897087" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.897990" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:34.897695" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:34.898061" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:34.898275" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:34.896708" elapsed="0.001599"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.903934" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.903820" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.903800" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.905246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:34.905140" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.905122" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:34.905865" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.905497" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.906404" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:34.906102" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.936088" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:34.907061" elapsed="0.029295"/>
</kw>
<msg time="2026-05-01T00:57:34.936716" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:34.936792" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.906654" elapsed="0.030195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:34.968015" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "d "e "f "a "u "l "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:34.937956" elapsed="0.030355"/>
</kw>
<msg time="2026-05-01T00:57:34.968666" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:34.968739" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.937228" elapsed="0.031562"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.969287" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.968937" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.968898" elapsed="0.000478"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.969936" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "d "e "f "a "u "l "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:34.969548" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.970437" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.970158" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.970138" elapsed="0.000401"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:34.970581" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:34.973796" elapsed="0.000207"/>
</kw>
<msg time="2026-05-01T00:57:34.974087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:34.972264" elapsed="0.002002"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.974706" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.975184" elapsed="0.000102"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:34.971558" elapsed="0.003904"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:34.970938" elapsed="0.004617"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:34.904837" elapsed="0.070868"/>
</kw>
<msg time="2026-05-01T00:57:34.975843" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:34.975908" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.904164" elapsed="0.071793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:34.976198" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:57:34.976060" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.976033" elapsed="0.000274"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.976939" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.977315" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:34.977420" elapsed="0.000042"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:34.903425" elapsed="0.074173"/>
</kw>
<msg time="2026-05-01T00:57:34.977731" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:34.977795" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.898713" elapsed="0.079140"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:34.978288" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:34.977966" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:34.977940" elapsed="0.000504"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:34.898566" elapsed="0.079933"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:34.898369" elapsed="0.080179"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:34.895907" elapsed="0.082711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:34.890854" elapsed="0.087825"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:34.890378" elapsed="0.088370"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:34.885543" elapsed="0.093284"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.980571" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.979824" elapsed="0.000784"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.981427" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.980829" elapsed="0.000795"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:34.982556" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:34.981963" elapsed="0.000633"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.983158" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/announce_rt_constrain_default.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/announce_rt_constrain_default.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.983388" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.982845" elapsed="0.000574"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:34.983861" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/withdraw_rt_constrain_default.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/withdraw_rt_constrain_default.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:34.984006" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:34.983638" elapsed="0.000403"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:34.984261" elapsed="0.004618"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:34.989209" elapsed="0.003409"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.047175" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:35.046765" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:35.048043" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.047754" elapsed="0.000369">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:35.048219" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:35.047391" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.048817" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:35.048414" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:35.049154" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:35.049333" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:35.049010" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.049783" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:35.049536" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.050979" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:35.050663" elapsed="0.000362"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.051509" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:35.051190" elapsed="0.000347"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.052324" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:35.051912" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:35.053613" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:35.053031" elapsed="0.000687"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:35.053882" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:57:35.054195" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:35.052568" elapsed="0.001655"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:35.054384" elapsed="0.000420"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:35.051771" elapsed="0.003076"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.055540" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:35.055103" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:35.056975" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:35.056412" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:35.057155" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:35.057464" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:35.055949" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:35.057652" elapsed="0.000369"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:35.054965" elapsed="0.003099"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:35.051590" elapsed="0.006510"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:35.058145" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:35.058304" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:35.050266" elapsed="0.008064"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:35.049913" elapsed="0.008449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.058591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:35.058389" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:35.049889" elapsed="0.008782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.059416" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:35.058820" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:35.059523" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:35.046076" elapsed="0.013574"/>
</kw>
<msg time="2026-05-01T00:57:35.059706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:35.033087" elapsed="0.026669"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.072553" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.085068" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.097476" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.097723" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.097906" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.098281" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:35.098134" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:35.098119" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.098518" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.098746" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.098920" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:35.098088" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.097982" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.099150" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.099225" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:35.099353" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:35.028325" elapsed="0.071056"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:35.100711" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.100419" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:35.100879" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:35.100065" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.101229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:35.100975" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.101812" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:35.101517" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:35.101312" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:35.100956" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.104421" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:35.102050" elapsed="0.002410"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:35.104515" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:35.104672" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:35.099730" elapsed="0.004967"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:35.105988" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.105737" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:35.106183" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:35.105336" elapsed="0.000873"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:35.106418" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:35.106281" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:35.106262" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.106699" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.106875" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.106941" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:35.108887" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:35.105009" elapsed="0.003905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.110309" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:35.110061" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:35.110793" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:35.110527" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:35.119599" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:35.119756" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:35.119878" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.112974" elapsed="0.007291">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:35.110903" elapsed="0.009451">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.120573" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:35.120390" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:35.110885" elapsed="0.009778">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.121059" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.121191" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:35.121155" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:35.121138" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.121404" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.121491" elapsed="0.000049"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.109233" elapsed="0.012406">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.121715" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:35.004792" elapsed="0.117022">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:35.122094" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:35.121910" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:35.121893" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:35.122222" elapsed="0.000014"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:34.999884" elapsed="0.122435">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.188202" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.187609" elapsed="0.000640"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.189486" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.189048" elapsed="0.000554">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.189735" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.188536" elapsed="0.001235"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.190608" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.190016" elapsed="0.000631"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.191084" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.191304" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.190885" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.191920" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.191584" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.193394" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.193049" elapsed="0.000394"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.193941" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.193652" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.194931" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.194493" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.196522" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.195759" elapsed="0.000900"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.196773" elapsed="0.000058"/>
</return>
<msg time="2026-05-01T00:57:37.197196" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.195172" elapsed="0.002062"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.197478" elapsed="0.000526"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:37.194328" elapsed="0.003736"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.199042" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.198496" elapsed="0.000582"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.201138" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.200386" elapsed="0.000885"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.201381" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:57:37.201823" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.199724" elapsed="0.002135"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.202081" elapsed="0.000629"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.198275" elapsed="0.004493"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.194106" elapsed="0.008714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.202887" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:37.203110" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:37.192637" elapsed="0.010510"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.192109" elapsed="0.011083"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.203485" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.203237" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.192070" elapsed="0.011527"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.204702" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.203812" elapsed="0.000930"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.204807" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.186408" elapsed="0.018562"/>
</kw>
<msg time="2026-05-01T00:57:37.205034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.169991" elapsed="0.035104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.220097" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.234145" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.247813" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.248062" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.248254" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.248706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.248549" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.248530" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.248939" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.249114" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.249286" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.248487" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.248341" elapsed="0.001027"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.249545" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.249627" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:37.249789" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.163747" elapsed="0.086071"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.251442" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.251075" elapsed="0.000486">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.251686" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.250581" elapsed="0.001143"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.252180" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.251829" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.252817" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.252503" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.252268" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.251801" elapsed="0.001103"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.255742" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.253099" elapsed="0.002680"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:37.255856" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:57:37.256076" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.250167" elapsed="0.005938"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.257579" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.257264" elapsed="0.000489">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.257891" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.256891" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:37.258212" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:57:37.258034" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.258007" elapsed="0.000347"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.258587" elapsed="0.000031"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.258824" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.258897" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:37.260841" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.256485" elapsed="0.004384"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.262611" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.262219" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.263179" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.262873" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:37.273118" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:37.273809" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '275'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}} 
 </msg>
<msg time="2026-05-01T00:57:37.274028" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:37.266129" elapsed="0.007954"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.263332" elapsed="0.010841"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.274665" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.274227" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.263304" elapsed="0.011567"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.280561" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.276692" elapsed="0.003943"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.276338" elapsed="0.004347"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.276310" elapsed="0.004411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.283993" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.281186" elapsed="0.002855"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.280871" elapsed="0.003206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.280805" elapsed="0.003298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.284783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.284325" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.285135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.284884" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.285717" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.285390" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.285218" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.284865" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.286631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.286178" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.286978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.286733" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.287620" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.287229" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.287059" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.286714" elapsed="0.001018"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.287957" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:37.289079" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.288661" elapsed="0.000453"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.289335" elapsed="0.002457"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:37.275658" elapsed="0.016210"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.292062" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:37.291945" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.291926" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.295142" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.292295" elapsed="0.002877"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:37.295225" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:37.295402" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:37.261196" elapsed="0.034234"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.295526" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:37.295686" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:37.134829" elapsed="0.160884"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.326857" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.326323" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.327733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.327402" elapsed="0.000462">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.328041" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.327059" elapsed="0.001008"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.328771" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.328237" elapsed="0.000562"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.329133" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.329300" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.328967" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.329782" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-constrain-default-route": {}
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.329505" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:37.330329" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.329904" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.331130" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.330617" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.330418" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.329884" elapsed="0.001333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.331904" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.331369" elapsed="0.000564"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.331988" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.325698" elapsed="0.006429"/>
</kw>
<msg time="2026-05-01T00:57:37.332186" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.312792" elapsed="0.019446"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.344707" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.357062" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.369363" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.369668" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.369861" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.370282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.370127" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.370110" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.370552" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.370729" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.370898" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.370070" elapsed="0.000883"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.369947" elapsed="0.001034"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.371132" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.371210" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:37.371358" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.309357" elapsed="0.062029"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.371582" elapsed="0.002490"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.375319" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.374901" elapsed="0.000447"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.375889" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.375522" elapsed="0.000395"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.376074" elapsed="0.000343"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.374429" elapsed="0.002065"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.374160" elapsed="0.002369"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.376707" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.376556" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.374140" elapsed="0.002642"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:37.296945" elapsed="0.079886"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:37.296076" elapsed="0.080834"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.295801" elapsed="0.081157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.295784" elapsed="0.081199"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.377020" elapsed="0.000035"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:37.128907" elapsed="0.248253"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:34.992940" elapsed="2.384338"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.428157" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.427712" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.429026" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.428751" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.429206" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.428378" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.429805" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.429401" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.430142" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.430316" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.429998" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.430779" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.430518" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.432185" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.431621" elapsed="0.000611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.432703" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.432398" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.433533" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.433107" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.434817" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.434216" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.435003" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:37.435308" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.433757" elapsed="0.001579"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.435517" elapsed="0.000390"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:37.432965" elapsed="0.002984"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.436629" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.436206" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.437863" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.437298" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.438047" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:37.438338" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.436846" elapsed="0.001519"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.438543" elapsed="0.000441"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.436068" elapsed="0.002960"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.432785" elapsed="0.006279"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.439107" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:37.439266" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:37.431279" elapsed="0.008032"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.430910" elapsed="0.008433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.439564" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.439370" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.430884" elapsed="0.008760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.440386" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.439792" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.440486" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.426975" elapsed="0.013642"/>
</kw>
<msg time="2026-05-01T00:57:37.440674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.414070" elapsed="0.026653"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.453218" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.465535" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.477883" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.478100" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.478283" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.478712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.478540" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.478524" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.478941" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.479111" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.479334" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.478488" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.478363" elapsed="0.001053"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.479582" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.479661" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:37.479796" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.409436" elapsed="0.070387"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.481139" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.480877" elapsed="0.000335">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.481307" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.480513" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.481676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.481405" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.482236" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.481943" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.481760" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.481387" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.486119" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.482490" elapsed="0.003658"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:37.486236" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:37.486397" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.480162" elapsed="0.006261"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.487738" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.487445" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.487900" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.487100" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:37.488134" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:37.487997" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.487978" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.488369" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.488564" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.488634" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:37.490575" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.486768" elapsed="0.003834"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.492098" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.491793" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.492575" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.492305" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:37.500867" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:37.501016" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '275'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}} 
 </msg>
<msg time="2026-05-01T00:57:37.501123" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:37.494774" elapsed="0.006375"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.492688" elapsed="0.008504"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.501376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.501219" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.492670" elapsed="0.008816"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.504928" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.502507" elapsed="0.002471"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.502269" elapsed="0.002744"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.502251" elapsed="0.002788"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.507825" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.505322" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.505096" elapsed="0.002814"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.505079" elapsed="0.002857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.508515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.508108" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.508862" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.508617" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.509414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.509114" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.508945" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.508599" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.510045" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.509681" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.510380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.510143" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.510965" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.510644" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.510477" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.510125" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.511201" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:37.512019" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.511727" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.512240" elapsed="0.002388"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:37.501849" elapsed="0.012842"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.514895" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:37.514787" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.514769" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.517850" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.515110" elapsed="0.002770"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:37.517933" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:37.518089" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:37.490951" elapsed="0.027165"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.518179" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:37.518330" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:37.386776" elapsed="0.131580"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.546659" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.546168" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.547600" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.547306" elapsed="0.000415">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.547901" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.546946" elapsed="0.000980"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.548567" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.548095" elapsed="0.000501"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.548926" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.549082" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.548763" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.549558" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-constrain-default-route": {}
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.549270" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:37.550129" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.549678" elapsed="0.000513"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.550938" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.550368" elapsed="0.000598"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.550217" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.549659" elapsed="0.001368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.551694" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.551178" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.551775" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.545550" elapsed="0.006355"/>
</kw>
<msg time="2026-05-01T00:57:37.551962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.532740" elapsed="0.019271"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.564440" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.576817" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.589149" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.589346" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.589538" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.589915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.589768" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.589754" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.590138" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.590309" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.590491" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.589724" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.589619" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.590787" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.590892" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:37.591015" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.530064" elapsed="0.060978"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.591221" elapsed="0.002355"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.594708" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.594312" elapsed="0.000424"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.595300" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.594932" elapsed="0.000395"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.595500" elapsed="0.000331"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.593902" elapsed="0.001989"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.593658" elapsed="0.002266"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.596099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.595949" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.593640" elapsed="0.002536"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:37.519515" elapsed="0.076710"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:37.518694" elapsed="0.077605"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.518439" elapsed="0.077905"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.518422" elapsed="0.077946"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.596402" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:37.381855" elapsed="0.214690"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:37.377474" elapsed="0.219129"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.645978" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.645604" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.646758" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.646524" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.646953" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.646172" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.647615" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.647201" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.647946" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.648092" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.647808" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.648539" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.648277" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.649768" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.649275" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.650259" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.649982" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.651103" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.650683" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.652347" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.651799" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.652544" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:37.652842" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.651325" elapsed="0.001542"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.653026" elapsed="0.000384"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.650542" elapsed="0.002926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.654129" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.653729" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.655383" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.654812" elapsed="0.000694"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.655587" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:37.655881" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.654345" elapsed="0.001562"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.656063" elapsed="0.000362"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.653592" elapsed="0.002893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.650338" elapsed="0.006184"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.656566" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:37.656727" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:37.648954" elapsed="0.007798"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.648655" elapsed="0.008130"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.656965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.656811" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.648634" elapsed="0.008407"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.657785" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.657187" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.657865" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.644976" elapsed="0.013014"/>
</kw>
<msg time="2026-05-01T00:57:37.658083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.632307" elapsed="0.025826"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.671266" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.683630" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.696148" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.696368" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.696571" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.696979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.696825" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.696809" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.697208" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.697379" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.697563" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.696769" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.696654" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.697797" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.697877" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:37.698026" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.628032" elapsed="0.070022"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.699508" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.699219" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.699678" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.698814" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.700040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.699776" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.700624" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.700309" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.700123" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.699757" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.703345" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.700865" elapsed="0.002508"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:37.703428" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:57:37.703617" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.698439" elapsed="0.005204"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.704888" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.704646" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.705047" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.704289" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:37.705282" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:37.705144" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.705126" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.705534" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.705710" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.705777" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:37.707725" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.703958" elapsed="0.003794"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.709152" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.708900" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.709614" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.709354" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:37.717549" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:37.717697" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '275'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}} 
 </msg>
<msg time="2026-05-01T00:57:37.717834" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:37.711993" elapsed="0.005867"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.709724" elapsed="0.008178"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.718086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.717929" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.709706" elapsed="0.008465"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.722748" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.719240" elapsed="0.003578"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.718976" elapsed="0.003891"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.718958" elapsed="0.003946"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.726607" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.723357" elapsed="0.003315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.722985" elapsed="0.003735"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.722961" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.727618" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.727018" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.727960" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.727718" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.728528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.728211" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.728043" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.727700" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.729148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.728784" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.729500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.729246" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.730040" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.729747" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.729581" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.729228" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.730283" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:37.731139" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.730816" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.731323" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:37.718555" elapsed="0.015183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.733926" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:37.733813" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.733794" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.737240" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.734154" elapsed="0.003116"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:37.737324" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:57:37.737524" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:37.708068" elapsed="0.029484"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.737895" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:37.738060" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:37.605526" elapsed="0.132561"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.767212" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.766690" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.768115" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.767804" elapsed="0.000439">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.768421" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.767428" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.769081" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.768637" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.769441" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.769632" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.769277" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.770090" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-constrain-default-route": {}
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.769821" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:37.770648" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.770216" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.771434" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.770886" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.770736" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.770193" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.772182" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.771689" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.772263" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.766044" elapsed="0.006355"/>
</kw>
<msg time="2026-05-01T00:57:37.772477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.752902" elapsed="0.019679"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.784985" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.797334" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.809704" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.809900" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.810078" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.810478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.810314" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.810300" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.810703" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.810873" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.811040" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.810270" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.810160" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.811284" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.811362" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:37.811499" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "",
                "path-id": 0,
             ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.750035" elapsed="0.061492"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.811707" elapsed="0.002348"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.815247" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.814810" elapsed="0.000506"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.815864" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.815494" elapsed="0.000398"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.816049" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:37.814381" elapsed="0.002053"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.814136" elapsed="0.002348"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.816662" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.816511" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.814117" elapsed="0.002620"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:37.739402" elapsed="0.077383"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:37.738481" elapsed="0.078380"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.738175" elapsed="0.078732"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.738157" elapsed="0.078773"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.816965" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:37.601056" elapsed="0.216039"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:37.596780" elapsed="0.220375"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:37.817323" elapsed="0.003004"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.872194" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.871820" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.872973" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.872740" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.873136" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.872388" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.873726" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.873327" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.874051" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.874194" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.873916" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.874642" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.874382" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.875870" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.875582" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.876394" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.876119" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.877214" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.876811" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.878461" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.877906" elapsed="0.000660"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.878647" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:37.878946" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.877434" elapsed="0.001538"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.879133" elapsed="0.000433"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.876671" elapsed="0.002937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.880266" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.879865" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:37.881516" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.880955" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:37.881700" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:37.881995" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:37.880497" elapsed="0.001524"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.882178" elapsed="0.000386"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:37.879726" elapsed="0.002880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.876494" elapsed="0.006149"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:37.882688" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:37.882847" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:37.875048" elapsed="0.007825"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.874754" elapsed="0.008152"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.883086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.882932" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.874736" elapsed="0.008427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.883936" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.883340" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.884015" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.871161" elapsed="0.012981"/>
</kw>
<msg time="2026-05-01T00:57:37.884197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.858603" elapsed="0.025642"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.896713" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.909122" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.921497" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.921706" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.921890" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.922277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.922127" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:37.922112" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.922520" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.922696" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.922865" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:37.922077" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.921967" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.923258" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.923353" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:37.923508" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.854346" elapsed="0.069191"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.924861" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.924589" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.925026" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.924210" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.925375" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.925122" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.926182" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.925660" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.925472" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.925104" elapsed="0.001162"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.928646" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.926424" elapsed="0.002249"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:37.928726" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:37.928884" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.923870" elapsed="0.005040"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.930137" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.929946" elapsed="0.000244"/>
</kw>
<msg time="2026-05-01T00:57:37.930287" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.929606" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.930601" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:37.930420" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.930396" elapsed="0.000275"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.930989" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.931142" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.930819" elapsed="0.000348"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:37.931600" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.931327" elapsed="0.000300"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:37.931675" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:37.931834" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:37.929262" elapsed="0.002597"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.933265" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.933013" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.933727" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.933482" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:37.940881" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:37.941316" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '451'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:37.941415" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:37.935951" elapsed="0.005490"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.933838" elapsed="0.007669"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.941695" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.941534" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.933819" elapsed="0.007962"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.945543" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"route-target-constrain-default-route":{}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.942817" elapsed="0.002796"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.942592" elapsed="0.003071"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.942574" elapsed="0.003125"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.949568" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.946138" elapsed="0.003496"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.945777" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.945754" elapsed="0.003965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.950514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.949959" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.950989" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.950653" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.951975" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.951334" elapsed="0.000677"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.951103" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.950627" elapsed="0.001465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.952763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.952320" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:37.953095" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.952858" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.953645" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.953338" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.953175" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.952841" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.953878" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:37.954689" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.954385" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:37.954873" elapsed="0.002324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:37.942147" elapsed="0.015112"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:37.957433" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:37.957328" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.957311" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:37.960492" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:37.957666" elapsed="0.002855"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:37.960574" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:37.960734" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:37.932179" elapsed="0.028581"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.960824" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:37.960975" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:37.831851" elapsed="0.129150"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.990297" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.989801" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.991232" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.990932" elapsed="0.000426">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:37.991580" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:37.990588" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.992219" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:37.991775" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:37.992589" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:37.992747" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:37.992411" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.993202" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:37.992935" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:37.993775" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:37.993324" elapsed="0.000514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.994531" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:37.994015" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:37.993865" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:37.993302" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:37.995252" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:37.994767" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:37.995333" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:37.989134" elapsed="0.006369"/>
</kw>
<msg time="2026-05-01T00:57:37.995560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:37.975315" elapsed="0.020296"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.008058" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.020601" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.033175" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.033399" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.033604" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.034025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:38.033872" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:38.033855" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.034255" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.034426" elapsed="0.000033"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.034616" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:38.033816" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:38.033691" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.034851" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:38.034933" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:38.035087" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:37.972701" elapsed="0.062415"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:38.035299" elapsed="0.002489"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:38.038888" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:38.038575" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:38.039687" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:38.039076" elapsed="0.000640"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:38.040206" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-constrain-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "path-id": 0,
      "route-key": "",
      "route-target-constrain-default-route": {}
     }
    ]
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:38.040400" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:38.039878" elapsed="0.000618">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:38.038122" elapsed="0.002553">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:38.037870" elapsed="0.002882">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:38.040941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:38.040787" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:38.037851" elapsed="0.003169">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.962134" elapsed="0.079006">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.961327" elapsed="0.079957">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:37.961085" elapsed="0.080287">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:37.961068" elapsed="0.080339">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:38.041471" elapsed="0.000017"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:37.825511" elapsed="0.216081">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,26 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "path-id": 0,
+      "route-key": "",
+      "route-target-constrain-default-route": {}
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.097050" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.096605" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.097928" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.097653" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.098105" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.097274" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.098753" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.098334" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.099098" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.099277" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.098951" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.099733" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.099484" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.100914" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.100593" elapsed="0.000366"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.101401" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.101126" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.102296" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.101858" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.103650" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.103071" elapsed="0.000680"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.103835" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:40.104145" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.102540" elapsed="0.001632"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.104334" elapsed="0.000407"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:40.101714" elapsed="0.003069"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.105443" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.105038" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.106717" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.106132" elapsed="0.000686"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.106900" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:40.107196" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.105678" elapsed="0.001545"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.107381" elapsed="0.000389"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:40.104901" elapsed="0.002911"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.101523" elapsed="0.006326"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.107894" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:40.108055" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:40.100242" elapsed="0.007890"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.099868" elapsed="0.008299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.108349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.108194" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.099842" elapsed="0.008585"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.109366" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.108591" elapsed="0.000804"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.109466" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.095862" elapsed="0.013736"/>
</kw>
<msg time="2026-05-01T00:57:40.109654" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.082846" elapsed="0.026858"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.122317" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.134779" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.147258" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.147486" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.147675" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.148081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.147925" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.147908" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.148313" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.148500" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.148672" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.147871" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.147755" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.148903" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.149046" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:40.149196" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.078281" elapsed="0.070943"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.150691" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.150374" elapsed="0.000394">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.150864" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.149946" elapsed="0.000944"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.151228" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.150963" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.151813" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.151516" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.151310" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.150944" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.154267" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.152052" elapsed="0.002242"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:40.154362" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:40.154537" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:40.149585" elapsed="0.004978"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.155761" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.155566" elapsed="0.000249"/>
</kw>
<msg time="2026-05-01T00:57:40.155900" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.155210" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.156130" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.155994" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.155975" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.156527" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.156694" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.156346" elapsed="0.000373"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:40.157121" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.156880" elapsed="0.000266"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:40.157193" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:40.157347" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:40.154881" elapsed="0.002491"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.158823" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.158572" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.159265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.159024" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:40.167003" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:40.167377" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '177'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:40.167569" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:40.161732" elapsed="0.005880"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.159415" elapsed="0.008259"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.167934" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.167711" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.159397" elapsed="0.008659"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.172914" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.169508" elapsed="0.003474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.169176" elapsed="0.003855"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.169151" elapsed="0.003917"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.176131" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.173485" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.173148" elapsed="0.003065"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.173124" elapsed="0.003114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.176818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.176411" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.177166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.176918" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.177739" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.177417" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.177250" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.176899" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.178375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.177992" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.178748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.178499" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.179290" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.178995" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.178830" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.178480" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.179547" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:40.180365" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.180067" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.180563" elapsed="0.002352"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:40.168591" elapsed="0.014389"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.183204" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.183053" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.183035" elapsed="0.000243"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:40.186107" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.183430" elapsed="0.002706"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:40.186189" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:40.186352" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:40.157707" elapsed="0.028695"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.186483" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:40.186641" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:40.055842" elapsed="0.130827"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.215262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.214793" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.216110" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.215824" elapsed="0.000410">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.216409" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.215481" elapsed="0.000954"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.217072" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.216630" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.217425" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.217587" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.217266" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.218168" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.217902" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:40.218720" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.218285" elapsed="0.000498"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.219481" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.218960" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.218809" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.218266" elapsed="0.001303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.220366" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.219881" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.220502" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.214136" elapsed="0.006501"/>
</kw>
<msg time="2026-05-01T00:57:40.220691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.201415" elapsed="0.019326"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.233299" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.245773" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.258277" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.258514" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.258713" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.259098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.258950" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.258936" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.259321" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.259506" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.259677" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.258904" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.258795" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.259905" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.259981" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:40.260099" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.198771" elapsed="0.061355"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.260345" elapsed="0.002250"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:40.263649" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.263333" elapsed="0.000344"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:40.264107" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.263834" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.264294" elapsed="0.000345"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.262924" elapsed="0.001776"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.262678" elapsed="0.002056"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.264912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.264760" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.262659" elapsed="0.002330"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:40.187862" elapsed="0.077175"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:40.187004" elapsed="0.078108"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.186754" elapsed="0.078404"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.186737" elapsed="0.078444"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.265216" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:40.049698" elapsed="0.215646"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:37.820523" elapsed="2.444882"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:40.265644" elapsed="0.002541"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:34.979196" elapsed="5.289048"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:34.885006" elapsed="5.383360"/>
</test>
<test id="s1-s18-t6" name="Odl_To_Play_rt_constrain_type_0" line="77">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:40.271743" elapsed="0.000293"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:40.271401" elapsed="0.000714"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.273538" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.273357" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.273331" elapsed="0.000306"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.280517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.280392" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.280374" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.281596" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.281197" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.282080" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:40.281786" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:40.282152" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:40.282309" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.280821" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.288623" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.288484" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.288434" elapsed="0.000269"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.290101" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.289979" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.289959" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:40.290718" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.290347" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.291139" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:40.290913" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.319489" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:40.291686" elapsed="0.027910"/>
</kw>
<msg time="2026-05-01T00:57:40.319772" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:40.319821" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.291327" elapsed="0.028529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.351359" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:40.320403" elapsed="0.031085"/>
</kw>
<msg time="2026-05-01T00:57:40.351658" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:40.351704" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.320039" elapsed="0.031700"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.352054" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.351821" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.351800" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.352624" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.352285" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.352991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.352767" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.352749" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:40.353105" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:40.355784" elapsed="0.000301"/>
</kw>
<msg time="2026-05-01T00:57:40.356151" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.354648" elapsed="0.001638"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.356605" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.356949" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:40.353961" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:40.353391" elapsed="0.003812"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:40.289631" elapsed="0.067669"/>
</kw>
<msg time="2026-05-01T00:57:40.357394" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:40.357438" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.288886" elapsed="0.068611"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:40.357729" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:40.357617" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.357597" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.358222" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.358608" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.358698" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:40.288078" elapsed="0.070754"/>
</kw>
<msg time="2026-05-01T00:57:40.358935" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:40.358980" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.282802" elapsed="0.076214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.359350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.359093" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.359075" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:40.282654" elapsed="0.076814"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:40.282427" elapsed="0.077074"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:40.280023" elapsed="0.079536"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:40.272952" elapsed="0.086666"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.272329" elapsed="0.087335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:40.269220" elapsed="0.090497"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.360627" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.360781" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.360395" elapsed="0.000413"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:40.361185" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.360969" elapsed="0.000243"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.361647" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.361780" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.361372" elapsed="0.000434"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:40.362168" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.361966" elapsed="0.000229"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:40.362499" elapsed="0.005904"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.362265" elapsed="0.006175"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.362248" elapsed="0.006242"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.405020" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.404640" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.405883" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.405632" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.406060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.405266" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.406681" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.406255" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.407066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.407202" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.406924" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.407656" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.407388" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.408679" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.408400" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.409162" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.408889" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.409880" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.409574" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.410913" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.410416" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.410991" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:40.411149" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.410096" elapsed="0.001078"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.411332" elapsed="0.000272"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:40.409418" elapsed="0.002228"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.412193" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.411897" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.413160" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.412752" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.413238" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:40.413390" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.412409" elapsed="0.001005"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.413586" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:40.411760" elapsed="0.002091"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.409241" elapsed="0.004644"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.413928" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:40.414084" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:40.408077" elapsed="0.006032"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.407775" elapsed="0.006367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.414321" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.414167" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.407755" elapsed="0.006727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.415461" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.414655" elapsed="0.000838"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.415544" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.403993" elapsed="0.011680"/>
</kw>
<msg time="2026-05-01T00:57:40.415729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.391226" elapsed="0.024551"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.428411" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.441269" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.453437" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.453658" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.453844" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.454226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.454074" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.454060" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.454465" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.454640" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.454847" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.454028" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.453922" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.455078" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.455153" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:40.455281" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.386712" elapsed="0.068648"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.479994" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.479616" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.480775" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.480536" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.480986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.480188" elapsed="0.000831"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.481600" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.481195" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.481930" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.482090" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.481795" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.482538" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-extended-community&gt;
        &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
        &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
    &lt;/route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.482280" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:40.482976" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.482663" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.483515" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.483208" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.483060" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.482643" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.484192" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.483746" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.484270" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.478987" elapsed="0.005410"/>
</kw>
<msg time="2026-05-01T00:57:40.484469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.466361" elapsed="0.018158"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.497042" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.509290" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.521548" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.521756" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.521941" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.522329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.522179" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.522165" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.522568" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.522743" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.522940" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.522132" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.522021" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.523171" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.523248" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:40.523392" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.465496" elapsed="0.057926"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.524782" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.524505" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.524945" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.524120" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.525339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.525083" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.525921" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.525627" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.525420" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.525063" elapsed="0.000943"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.528365" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.526163" elapsed="0.002229"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:40.528444" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:57:40.528616" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:40.523779" elapsed="0.004862"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.530167" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.529921" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.530621" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-extended-community&gt;
        &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
        &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
    &lt;/route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.530369" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.531083" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.530842" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.531528" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.531277" elapsed="0.000294"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:40.532380" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:40.532178" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:40.532754" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:40.532579" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.532931" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.533597" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.533337" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:40.533685" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:40.533841" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:40.531774" elapsed="0.002092"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:40.548698" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '726', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-extended-community&gt;
        &lt;global-administrator&gt;64496&lt;/global-administrator&gt;
        &lt;local-administrator&gt;AAAAZQ==&lt;/local-administrator&gt;
    &lt;/route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:40.548861" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes/route-target-constrain-route=flow1,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:40.549030" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:40.537499" elapsed="0.011568"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.533937" elapsed="0.015202"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.549418" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.549179" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.533920" elapsed="0.015646"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.554727" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.551183" elapsed="0.003605"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.550788" elapsed="0.004116"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.550760" elapsed="0.004185"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.558576" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.555343" elapsed="0.003303"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.555026" elapsed="0.003670"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.555002" elapsed="0.003729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.559639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.559046" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.559984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.559740" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.560555" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.560237" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.560067" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.559721" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.561174" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.560811" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.561526" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.561272" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.562065" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.561775" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.561609" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.561254" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.562307" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:40.563187" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.562865" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.563370" elapsed="0.002321"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:40.550107" elapsed="0.015649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:40.566053" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-05-01T00:57:40.565830" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.565811" elapsed="0.000349"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.566315" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.566383" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:40.568746" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:40.528973" elapsed="0.039801"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.568890" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:40.569051" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:40.373984" elapsed="0.195093"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.569430" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.569185" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.569167" elapsed="0.000373"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.569574" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:40.368745" elapsed="0.200954"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.575808" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.570638" elapsed="0.005200"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.575995" elapsed="0.003058"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:40.579129" elapsed="0.000042"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:40.570344" elapsed="0.008968"/>
</kw>
<msg time="2026-05-01T00:57:40.579416" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:40.569874" elapsed="0.009596"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.580696" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:40.580801" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:40.580290" elapsed="0.000543"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.581404" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:40.581533" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:40.581053" elapsed="0.000516"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.581794" elapsed="0.000424"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.582706" level="INFO">${sum_1} = 2331</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:40.582436" elapsed="0.000305"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.583244" level="INFO">${sum_2} = 2331</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:40.582999" elapsed="0.000280"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.583516" elapsed="0.000424"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:40.579781" elapsed="0.004243"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:40.584236" elapsed="0.002777"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.632874" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.632468" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.633738" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.633435" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.634043" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.633094" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.634652" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.634244" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.635031" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.635200" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.634849" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.635659" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.635393" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.637020" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.636702" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.637534" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.637233" elapsed="0.000328"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.638366" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.637945" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.639593" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.639096" elapsed="0.000577"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.639829" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:57:40.640145" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.638647" elapsed="0.001530"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.640352" elapsed="0.000498"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:40.637804" elapsed="0.003089"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.641593" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.641150" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.642730" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.642236" elapsed="0.000576"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.642999" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:40.643236" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.641813" elapsed="0.001450"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.643418" elapsed="0.000460"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:40.641011" elapsed="0.002909"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.637619" elapsed="0.006336"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.644001" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:40.644157" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:40.636122" elapsed="0.008060"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.635789" elapsed="0.008425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.644394" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.644240" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.635763" elapsed="0.008725"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.645221" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.644637" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.645298" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.631807" elapsed="0.013672"/>
</kw>
<msg time="2026-05-01T00:57:40.645537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.617855" elapsed="0.027732"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.658044" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.670355" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.682998" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.683323" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.683548" elapsed="0.000042"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.684031" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.683872" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.683855" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.684265" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.684436" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.684625" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.683813" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.683666" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.684861" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.684942" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:40.685121" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.613464" elapsed="0.071687"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.686577" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.686238" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:40.698569" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:40.698648" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:40.698789" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:40.689143" elapsed="0.009684"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.686704" elapsed="0.012184"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.699237" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.698932" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.686685" elapsed="0.012683"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.707097" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.701614" elapsed="0.005587"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.701079" elapsed="0.006200"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.701039" elapsed="0.006298"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.710075" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.707779" elapsed="0.002341"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.707494" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.707427" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.710792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.710372" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.711160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.710889" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.711728" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.711411" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.711243" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.710871" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.712336" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.711975" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.712687" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.712431" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.713225" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.712931" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.712767" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.712414" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.713479" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:40.714299" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.713995" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.714497" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:40.700134" elapsed="0.016790"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:40.717034" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:57:40.719379" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:40.685577" elapsed="0.033833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.719489" elapsed="0.000030"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:40.588084" elapsed="0.131536"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.587617" elapsed="0.132060"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:40.587207" elapsed="0.132532"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.727245" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.720685" elapsed="0.006611"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.727597" elapsed="0.003313"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:40.730985" elapsed="0.000063"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:40.720390" elapsed="0.010829"/>
</kw>
<msg time="2026-05-01T00:57:40.731355" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:40.719911" elapsed="0.011487"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.732729" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:40.732839" level="INFO">${len_1} = 112</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:40.732304" elapsed="0.000570"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.733497" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:40.733608" level="INFO">${len_2} = 112</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:40.733105" elapsed="0.000537"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.733876" elapsed="0.000450"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.734845" level="INFO">${sum_1} = 1884</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:40.734583" elapsed="0.000300"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:40.735481" level="INFO">${sum_2} = 1884</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:40.735177" elapsed="0.000344"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:40.735753" elapsed="0.000450"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:40.731759" elapsed="0.004531"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.782984" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.782614" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.783877" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.783614" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:40.784047" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:40.783239" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.784636" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.784236" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.784963" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.785161" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.784827" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.785608" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.785346" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.786662" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.786388" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.787167" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.786870" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.788130" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.787584" elapsed="0.000573"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.789314" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.788859" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.789491" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:40.789717" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.788350" elapsed="0.001393"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.789898" elapsed="0.000499"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:40.787426" elapsed="0.003013"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.791282" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:40.790713" elapsed="0.000601"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:40.792643" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.792173" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:40.792805" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:40.793031" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:40.791541" elapsed="0.001516"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.793213" elapsed="0.000527"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:40.790573" elapsed="0.003209"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.787249" elapsed="0.006569"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:40.793861" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:40.794020" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:40.786032" elapsed="0.008014"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.785726" elapsed="0.008352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.794255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.794103" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.785706" elapsed="0.008625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.795067" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.794493" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.795171" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.781958" elapsed="0.013364"/>
</kw>
<msg time="2026-05-01T00:57:40.795383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.769034" elapsed="0.026412"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.808250" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.820828" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.833371" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.833590" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.833771" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.834152" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.834002" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:40.833986" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.834374" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.834558" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.834727" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:40.833955" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.833848" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.834953" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.835027" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:40.835173" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:40.764636" elapsed="0.070570"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.836368" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.836109" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:40.844506" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:40.844701" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '431'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-route-target-constrain:route-target-constrain-subsequent-address-family']/bgp-route-target-constrain:route-target-constrain-routes",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:40.844843" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:40.844886" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.838568" elapsed="0.006702">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:40.836498" elapsed="0.008855">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.845561" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.845388" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:40.836479" elapsed="0.009174">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.850080" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.846707" elapsed="0.003422">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:40.846481" elapsed="0.003738">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:40.846462" elapsed="0.003804">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.854015" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.850710" elapsed="0.003354">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:40.850365" elapsed="0.003789">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:40.850341" elapsed="0.003858">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.855025" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.854485" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.855630" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.855164" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.856189" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.855887" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.855720" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.855139" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.856816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.856436" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.857150" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.856912" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.857706" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:40.857397" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.857232" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.856894" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.857942" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:40.858790" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:40.858500" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:40.861304" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.858973" elapsed="0.002364">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.846033" elapsed="0.015457">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:40.861552" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:40.863992" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:40.864022" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:40.835495" elapsed="0.028556">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:40.864117" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.738170" elapsed="0.126118">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.737230" elapsed="0.127123"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:40.736651" elapsed="0.127764"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:40.360018" elapsed="0.504467"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.268719" elapsed="0.595885"/>
</test>
<test id="s1-s18-t7" name="Play_To_Odl_rt_constrain_type_0" line="81">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:40.868105" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:40.867694" elapsed="0.000676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.869378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.869266" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.869247" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.874517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.874392" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.874374" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.875644" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:40.875207" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.876128" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:40.875835" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:40.876198" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:40.876351" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:40.874816" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.881890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.881781" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.881762" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.883298" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:40.883153" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.883134" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:40.883838" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.883540" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.884288" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:40.884064" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.915637" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:40.884835" elapsed="0.030911"/>
</kw>
<msg time="2026-05-01T00:57:40.915916" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:40.915963" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.884493" elapsed="0.031507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:40.946731" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:40.916720" elapsed="0.030258"/>
</kw>
<msg time="2026-05-01T00:57:40.947401" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:40.947547" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.916183" elapsed="0.031446"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.948327" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.947813" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.947766" elapsed="0.000798"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.949601" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "0 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:40.948900" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.950403" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.949915" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.949875" elapsed="0.000735"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:40.950687" elapsed="0.000065"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:40.956040" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:57:40.956248" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:40.953986" elapsed="0.002390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.956689" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.957030" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:40.952578" elapsed="0.004638"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:40.951280" elapsed="0.006000"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:40.882851" elapsed="0.074529"/>
</kw>
<msg time="2026-05-01T00:57:40.957491" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:40.957537" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.882112" elapsed="0.075461"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:40.957765" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:40.957656" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.957636" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.958254" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.958607" elapsed="0.000061"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:40.958718" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:40.881431" elapsed="0.077398"/>
</kw>
<msg time="2026-05-01T00:57:40.958921" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:40.958964" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.876762" elapsed="0.082237"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:40.959344" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:40.959074" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:40.959057" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:40.876616" elapsed="0.082830"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:40.876429" elapsed="0.083063"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:40.874030" elapsed="0.085520"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:40.868975" elapsed="0.090630"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:40.868540" elapsed="0.091111"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:40.865402" elapsed="0.094301"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.960841" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.960330" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.961567" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.961039" elapsed="0.000557"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:40.962143" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:40.961769" elapsed="0.000401"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.962548" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.962705" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.962332" elapsed="0.000400"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:40.963079" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:40.963200" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:40.962890" elapsed="0.000336"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:40.963431" elapsed="0.002977"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:40.966621" elapsed="0.001735"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.022921" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:41.022536" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:41.023742" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:41.023497" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:41.023967" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:41.023122" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.024569" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:41.024163" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:41.024907" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:41.025044" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:41.024768" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.025490" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:41.025231" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.026557" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:41.026250" elapsed="0.000352"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.027037" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:41.026769" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.027924" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:41.027511" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:41.029169" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:41.028618" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:41.029350" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:41.029667" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:41.028143" elapsed="0.001551"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:41.029853" elapsed="0.000383"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:41.027288" elapsed="0.002989"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.031109" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:41.030547" elapsed="0.000588"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:41.032376" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:41.031835" elapsed="0.000660"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:41.032575" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:41.032868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:41.031327" elapsed="0.001567"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:41.033050" elapsed="0.000364"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:41.030393" elapsed="0.003078"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:41.027114" elapsed="0.006394"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:41.033554" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:41.033716" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:41.025925" elapsed="0.007816"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:41.025614" elapsed="0.008159"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.033952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:41.033799" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:41.025591" elapsed="0.008438"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.034778" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:41.034176" elapsed="0.000631"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:41.034892" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:41.021894" elapsed="0.013127"/>
</kw>
<msg time="2026-05-01T00:57:41.035076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:41.009227" elapsed="0.025898"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.047696" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.060137" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.072548" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.072753" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.072935" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.073315" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:41.073166" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:41.073150" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.073553" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.073724" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.073890" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:41.073119" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.073012" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.074117" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.074192" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:41.074322" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:41.004964" elapsed="0.069385"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:41.075722" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:41.075440" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:41.075884" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:41.075071" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.076241" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:41.075979" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.076861" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:41.076566" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:41.076350" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:41.075960" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.079463" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:41.077097" elapsed="0.002396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:41.079546" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:41.079705" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:41.074738" elapsed="0.004991"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:41.080961" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:41.080725" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:41.081118" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:41.080364" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:41.081349" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:41.081213" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:41.081195" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.081600" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.081773" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.081838" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:41.083767" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:41.080039" elapsed="0.003754"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.085196" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:41.084946" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:41.085652" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:41.085396" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:41.093509" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:41.093678" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:41.093852" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:41.087988" elapsed="0.006259">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:41.085760" elapsed="0.008575">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.094561" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:41.094373" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:41.085741" elapsed="0.008911">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.095060" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.095196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:41.095158" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:41.095141" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.095412" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.095535" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:41.084109" elapsed="0.011548">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.095734" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.981154" elapsed="0.114678">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:41.096115" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:41.095929" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:41.095911" elapsed="0.000301"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:41.096244" elapsed="0.000014"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:40.973861" elapsed="0.122481">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.156710" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.156276" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.157702" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.157273" elapsed="0.000587">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.157960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.156931" elapsed="0.001054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.158569" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.158156" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.158907" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:43.159071" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:43.158762" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.159522" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.159261" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.160639" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.160313" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.161127" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.160852" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.161981" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.161552" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.163257" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.162687" elapsed="0.000672"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.163441" elapsed="0.000056"/>
</return>
<msg time="2026-05-01T00:57:43.163771" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.162204" elapsed="0.001594"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.163959" elapsed="0.000390"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:43.161390" elapsed="0.003000"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.165090" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.164665" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.166576" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.166013" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.166762" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:43.167058" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.165512" elapsed="0.001572"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.167241" elapsed="0.000393"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:43.164526" elapsed="0.003150"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.161210" elapsed="0.006502"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.167758" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:43.167915" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:43.159987" elapsed="0.007954"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.159652" elapsed="0.008321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.168153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.168000" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.159627" elapsed="0.008603"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.169007" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.168379" elapsed="0.000732"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.169164" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:43.155629" elapsed="0.013661"/>
</kw>
<msg time="2026-05-01T00:57:43.169346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.142898" elapsed="0.026498"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.182028" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.194624" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.207161" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.207392" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.207620" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.208046" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.207889" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:43.207871" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.208277" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.208460" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.208633" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:43.207829" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.207709" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.208867" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.208949" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:43.209107" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:43.138632" elapsed="0.070504"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.210815" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.210531" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.210987" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.210121" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.211348" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.211085" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.211942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.211639" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.211432" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.211066" elapsed="0.000961"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.214602" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.212183" elapsed="0.002446"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:43.214682" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:43.214838" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.209554" elapsed="0.005309"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.216088" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.215856" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.216244" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.215517" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:43.216492" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:43.216340" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.216321" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.216729" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.216901" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.216969" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:43.219173" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.215174" elapsed="0.004031"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.220834" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.220578" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.221281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.221041" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:43.471318" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:43.471609" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '361'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:57:43.471934" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:43.223617" elapsed="0.248360"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.221393" elapsed="0.250660"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.472404" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.472103" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.221373" elapsed="0.251181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.478060" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.474277" elapsed="0.003857"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.473922" elapsed="0.004263"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.473892" elapsed="0.004331"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.482368" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.478661" elapsed="0.003776"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.478306" elapsed="0.004202"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.478282" elapsed="0.004265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.483397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.482822" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.483927" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.483567" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.484768" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.484300" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.484050" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.483540" elapsed="0.001353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.485686" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.485136" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.486225" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.485868" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.486931" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.486611" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.486344" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.485841" elapsed="0.001174"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.487171" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:43.488004" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.487703" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.488186" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:43.473156" elapsed="0.017471"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.490813" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:43.490699" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.490680" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.493863" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.491035" elapsed="0.002859"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:43.493945" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:43.494112" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:43.219552" elapsed="0.274587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.494252" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:43.494409" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:43.114864" elapsed="0.379572"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.524419" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.523896" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.525372" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.525011" elapsed="0.000513">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.525713" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.524667" elapsed="0.001091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.526372" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.525931" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.526754" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:43.526937" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:43.526583" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.527388" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-extended-community": {
                    "global-administrator": 64496,
                    "local-administrator": "AAAAZQ=="
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.527125" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:43.527962" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.527532" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.528728" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.528204" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.528052" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.527509" elapsed="0.001308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.529487" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.528968" elapsed="0.000549"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.529569" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:43.523245" elapsed="0.006461"/>
</kw>
<msg time="2026-05-01T00:57:43.529878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.510103" elapsed="0.019828"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.542422" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.555108" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.569436" elapsed="0.000071"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.569828" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.570034" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.570581" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.570373" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:43.570354" elapsed="0.000347"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.570928" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.571172" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.571404" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:43.570306" elapsed="0.001193"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.570142" elapsed="0.001397"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.571750" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.571859" elapsed="0.000024"/>
</return>
<msg time="2026-05-01T00:57:43.572105" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:43.507220" elapsed="0.064919"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.572351" elapsed="0.002708"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.576477" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.575988" elapsed="0.000630"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.577179" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.576785" elapsed="0.000422"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:43.577406" elapsed="0.000417"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:43.575470" elapsed="0.002418"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.575149" elapsed="0.002773"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.578122" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.577951" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.575128" elapsed="0.003078"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:43.495604" elapsed="0.082655"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:43.494785" elapsed="0.083560"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.494537" elapsed="0.083857"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.494520" elapsed="0.083900"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.578471" elapsed="0.000045"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:43.108282" elapsed="0.470350"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:40.968545" elapsed="2.610152"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.632897" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.632317" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.634054" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.633692" elapsed="0.000470">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.634292" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.633186" elapsed="0.001142"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.635107" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.634586" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.635594" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:43.635816" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:43.635376" elapsed="0.000480"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.636432" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.636088" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.638351" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.637532" elapsed="0.000886"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.639144" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.638757" elapsed="0.000424"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.640280" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.639717" elapsed="0.000601"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.642047" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.641238" elapsed="0.000953"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.642305" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T00:57:43.642747" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.640606" elapsed="0.002178"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.643002" elapsed="0.000562"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:43.639518" elapsed="0.004106"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.644561" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.643979" elapsed="0.000620"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.646269" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.645519" elapsed="0.000886"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.646532" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:57:43.646942" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.644861" elapsed="0.002119"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.647200" elapsed="0.000541"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:43.643782" elapsed="0.004015"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.639254" elapsed="0.008593"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.647911" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:57:43.648129" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:43.637059" elapsed="0.011108"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.636640" elapsed="0.011572"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.648484" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.648249" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.636606" elapsed="0.011990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.649614" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.648806" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.649770" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:43.631346" elapsed="0.018603"/>
</kw>
<msg time="2026-05-01T00:57:43.650027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.615222" elapsed="0.034879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.667150" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.684350" elapsed="0.000177"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.701173" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.701533" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.701848" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.702477" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.702232" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:43.702208" elapsed="0.000392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.702815" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.703054" elapsed="0.000032"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.703305" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:43.702148" elapsed="0.001236"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.701972" elapsed="0.001451"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.703664" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.703780" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:43.704007" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:43.610865" elapsed="0.093184"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.706082" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.705632" elapsed="0.000559">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.706320" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.705048" elapsed="0.001307"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.706847" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.706470" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.707655" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.707231" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.706963" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.706427" elapsed="0.001344"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.711529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.707994" elapsed="0.003577"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:43.711651" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:57:43.711992" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.704540" elapsed="0.007489"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.713930" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.713531" elapsed="0.000505">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.714170" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.713008" elapsed="0.001198"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:43.714521" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-05-01T00:57:43.714308" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.714282" elapsed="0.000370"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.714874" elapsed="0.000031"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.715133" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.715233" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:57:43.717883" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.712521" elapsed="0.005398"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.719731" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.719381" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.720276" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.719987" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:43.729204" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:43.729406" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '361'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:57:43.729572" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:43.723022" elapsed="0.006584"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.720410" elapsed="0.009252"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.729951" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.729698" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.720387" elapsed="0.009679"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.735920" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.731839" elapsed="0.004170"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.731371" elapsed="0.004702"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.731335" elapsed="0.004787"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.740888" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.736636" elapsed="0.004343"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.736229" elapsed="0.004920"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.736198" elapsed="0.005003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.742354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.741568" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.742928" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.742562" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.743675" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.743265" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.743035" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.742527" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.744495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.744008" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.744937" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.744622" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.745628" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.745257" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.745042" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.744598" elapsed="0.001159"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.745971" elapsed="0.000442"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:43.747067" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.746661" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.747315" elapsed="0.002958"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:43.730611" elapsed="0.019741"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.750589" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:43.750438" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.750415" elapsed="0.000264"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.754210" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.750864" elapsed="0.003379"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:43.754304" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:43.754493" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:43.718339" elapsed="0.036183"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.754588" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:43.754744" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:43.587928" elapsed="0.166843"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.784439" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.783937" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.785525" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.785127" elapsed="0.000559">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.785951" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.784747" elapsed="0.001239"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.786784" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.786209" elapsed="0.000605"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.787226" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:43.787412" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:43.787016" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.787984" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-extended-community": {
                    "global-administrator": 64496,
                    "local-administrator": "AAAAZQ=="
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.787662" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:43.788662" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.788122" elapsed="0.000614"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.789599" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.788973" elapsed="0.000662"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.788774" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.788093" elapsed="0.001614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.790568" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.789941" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.790668" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:43.783266" elapsed="0.007573"/>
</kw>
<msg time="2026-05-01T00:57:43.790909" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.770247" elapsed="0.020722"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.806510" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.818971" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.832722" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.832956" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.833147" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.833590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.833411" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:43.833392" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.833839" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.834012" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.834183" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:43.833352" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.833231" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.834418" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.834514" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:43.834690" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:43.767404" elapsed="0.067315"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.834903" elapsed="0.002475"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.838642" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.838187" elapsed="0.000484"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.839210" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.838827" elapsed="0.000411"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:43.839396" elapsed="0.000352"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:43.837754" elapsed="0.002054"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.837476" elapsed="0.002365"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.840040" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.839866" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.837441" elapsed="0.002682"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:43.755957" elapsed="0.084217"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:43.755125" elapsed="0.085129"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.754860" elapsed="0.085507"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.754842" elapsed="0.085558"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.840462" elapsed="0.000041"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:43.583505" elapsed="0.257126"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:43.578882" elapsed="0.261825"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.894889" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.894489" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.895738" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.895434" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.895921" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.895098" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.896640" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.896154" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.896998" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:43.897182" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:43.896852" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.897789" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.897426" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.899240" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.898676" elapsed="0.000610"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.899762" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.899483" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.900629" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.900173" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.902082" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.901439" elapsed="0.000774"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.902310" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:57:43.902699" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.900896" elapsed="0.001832"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.902895" elapsed="0.000468"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:43.900031" elapsed="0.003388"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.904112" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.903703" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:43.905435" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.904815" elapsed="0.000752"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:43.905650" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:43.906052" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:43.904329" elapsed="0.001757"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.906285" elapsed="0.000428"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:43.903563" elapsed="0.003200"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.899847" elapsed="0.006952"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:43.906853" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:43.907049" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:43.898272" elapsed="0.008807"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.897949" elapsed="0.009172"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.907348" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.907154" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.897916" elapsed="0.009527"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.908264" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.907624" elapsed="0.000675"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.908358" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:43.893844" elapsed="0.014707"/>
</kw>
<msg time="2026-05-01T00:57:43.908610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.879906" elapsed="0.028754"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.921707" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.936228" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.949536" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.949847" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.950089" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.950640" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.950421" elapsed="0.000353"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:43.950398" elapsed="0.000415"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.950982" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.951203" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.951432" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:43.950344" elapsed="0.001176"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.950195" elapsed="0.001354"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.951704" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.951786" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:43.951938" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:43.874766" elapsed="0.077201"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.953363" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.953078" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.953555" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.952684" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.953938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.953656" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.954552" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.954233" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.954022" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.953636" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.958855" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:43.954796" elapsed="0.004088"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:43.958940" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:43.959104" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.952309" elapsed="0.006821"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:43.960418" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:43.960165" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:43.960603" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:43.959814" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:43.960848" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:57:43.960709" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.960689" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.961087" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.961264" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.961386" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:43.963384" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:43.959469" elapsed="0.003943"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.964862" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.964600" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.965314" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.965069" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:43.974081" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:43.974305" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '361'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:57:43.974504" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:43.967637" elapsed="0.006907"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.965430" elapsed="0.009178"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.974871" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.974647" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.965411" elapsed="0.009584"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.979924" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.976499" elapsed="0.003495"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.976143" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.976117" elapsed="0.003963"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.983672" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:43.980500" elapsed="0.003220"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.980159" elapsed="0.003598"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.980135" elapsed="0.003648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.984375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.983975" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.984743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.984494" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.985434" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.985131" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.984827" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.984474" elapsed="0.001069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.986114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.985724" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:43.986475" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:43.986215" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:43.987088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:43.986761" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.986575" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.986196" elapsed="0.001052"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:43.987409" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:43.988256" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:43.987954" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:43.988440" elapsed="0.002396"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:43.975549" elapsed="0.015353"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:43.991085" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:43.990975" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.990955" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:43.994134" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:43.991308" elapsed="0.002856"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:43.994217" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:43.994385" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:43.963760" elapsed="0.030652"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:43.994494" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:43.994650" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:43.850192" elapsed="0.144484"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.023370" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.022901" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.024227" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.023930" elapsed="0.000427">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:44.024554" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:44.023591" elapsed="0.000989"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.025212" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:44.024751" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.025593" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:44.025759" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:44.025406" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.026215" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-extended-community": {
                    "global-administrator": 64496,
                    "local-administrator": "AAAAZQ=="
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.025949" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:44.026829" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.026387" elapsed="0.000504"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.027589" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.027067" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.026918" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.026366" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.028324" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.027826" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:44.028403" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:44.022259" elapsed="0.006302"/>
</kw>
<msg time="2026-05-01T00:57:44.028620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.009411" elapsed="0.019261"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.041147" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.053656" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.066216" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.066472" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.066674" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.067118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.066958" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:44.066939" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.067355" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.067551" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.067726" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:44.066893" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.066762" elapsed="0.001132"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.068053" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.068137" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:44.068333" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:44.006774" elapsed="0.061590"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.068566" elapsed="0.002559"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:44.072357" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.071919" elapsed="0.000467"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:44.072959" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.072560" elapsed="0.000429"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:44.073149" elapsed="0.000360"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:44.071478" elapsed="0.002093"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.071207" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.073783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.073630" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.071188" elapsed="0.002673"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:43.995921" elapsed="0.077991"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:43.995076" elapsed="0.078917"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:43.994761" elapsed="0.079282"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:43.994744" elapsed="0.079324"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:44.074103" elapsed="0.000036"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:43.845514" elapsed="0.228728"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:43.840920" elapsed="0.233383"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:44.074495" elapsed="0.004200"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.132210" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.131764" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.133063" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.132796" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:44.133341" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:44.132429" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.133947" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:44.133555" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.134285" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:44.134467" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:44.134140" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.134906" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.134658" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.136288" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.135977" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.136806" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.136531" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.137632" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.137208" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:44.138890" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.138321" elapsed="0.000672"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:44.139075" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:44.139383" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:44.137862" elapsed="0.001548"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.139587" elapsed="0.000422"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:44.137066" elapsed="0.002985"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.140730" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.140306" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:44.141965" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.141401" elapsed="0.000666"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:44.142144" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:44.142438" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:44.140947" elapsed="0.001533"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.142638" elapsed="0.000373"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:44.140167" elapsed="0.002886"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:44.136887" elapsed="0.006201"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:44.143133" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:44.143292" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:44.135371" elapsed="0.007947"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.135034" elapsed="0.008316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.143545" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.143376" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.135009" elapsed="0.008616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.144387" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.143800" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:44.144485" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:44.131068" elapsed="0.013588"/>
</kw>
<msg time="2026-05-01T00:57:44.144712" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.118344" elapsed="0.026419"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.157905" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.173086" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.187991" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.188210" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.188396" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.188885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.188722" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:44.188701" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.189118" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.189330" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.189522" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:44.188642" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.188494" elapsed="0.001113"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.189787" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.189878" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:44.190030" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:44.114058" elapsed="0.076002"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.191892" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.191464" elapsed="0.000518">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:44.192087" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:44.190941" elapsed="0.001180"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.192566" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.192216" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.193557" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.192925" elapsed="0.000665"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.192678" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.192192" elapsed="0.001471"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.196596" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:44.193862" elapsed="0.002763"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:44.196679" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:44.196856" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:44.190529" elapsed="0.006363"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.198405" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:44.198179" elapsed="0.000301"/>
</kw>
<msg time="2026-05-01T00:57:44.198591" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:44.197751" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.198864" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:44.198719" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.198697" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.199276" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:44.199431" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:44.199104" elapsed="0.000371"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:44.199883" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.199640" elapsed="0.000270"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:44.199959" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:44.200121" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:44.197290" elapsed="0.002856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.201577" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.201305" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.202028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.201786" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:44.209983" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:44.210503" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '537'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:44.210660" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:44.204280" elapsed="0.006407"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.202140" elapsed="0.008590"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.210934" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.210757" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.202121" elapsed="0.008900"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.214519" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.212084" elapsed="0.002486"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.211858" elapsed="0.002747"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.211840" elapsed="0.002791"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.218089" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.214948" elapsed="0.003206"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.214687" elapsed="0.003516"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.214670" elapsed="0.003568"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.219113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.218507" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.219619" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.219254" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.220552" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.220113" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.219737" elapsed="0.000903"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.219228" elapsed="0.001442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.221401" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.220900" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.221895" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.221559" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.222668" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.222236" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.222007" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.221534" elapsed="0.001269"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.223020" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:44.224167" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.223761" elapsed="0.000443"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:44.224423" elapsed="0.003332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:44.211405" elapsed="0.016423"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.228012" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:44.227902" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.227882" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:44.231131" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.228238" elapsed="0.002923"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:44.231213" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:44.231376" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:44.200487" elapsed="0.030952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:44.231525" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:44.231682" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:44.088760" elapsed="0.142948"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.259968" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.259496" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.260829" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.260529" elapsed="0.000431">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:44.261137" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:44.260166" elapsed="0.000996"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.261787" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:44.261330" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:44.262137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:44.262309" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:44.261978" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.262808" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:44.262540" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:44.263334" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.262926" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.264104" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:44.263596" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:44.263421" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:44.262907" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.264837" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:44.264338" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:44.264916" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:44.258858" elapsed="0.006188"/>
</kw>
<msg time="2026-05-01T00:57:44.265101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.246153" elapsed="0.018997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.277783" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.290788" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.303820" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.304030" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.304213" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.304695" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.304519" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:44.304493" elapsed="0.000286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.304928" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.305097" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.305265" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:44.304427" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.304296" elapsed="0.001051"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.305513" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.305593" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:44.305746" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:44.243496" elapsed="0.062278"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:44.306024" elapsed="0.002465"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:44.309671" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.309322" elapsed="0.000378"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:44.310546" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:44.309859" elapsed="0.000760"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:44.311113" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-constrain-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "origin-as": 64511,
      "path-id": 0,
      "route-key": "AAL78AAAAGU=",
      "route-target-extended-community": {
       "global-administrator": 64496,
       "local-administrator": "AAAAZQ=="
      }
     }
    ]
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:44.311308" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.310787" elapsed="0.000596">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.308891" elapsed="0.002693">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:44.308571" elapsed="0.003128">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:44.311902" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:44.311742" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:44.308553" elapsed="0.003430">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.232864" elapsed="0.079241">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.232044" elapsed="0.080206">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:44.231798" elapsed="0.080582">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:44.231781" elapsed="0.080636">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:44.312484" elapsed="0.000018"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:44.083210" elapsed="0.229402">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AAL78AAAAGU=",
+      "route-target-extended-community": {
+       "global-administrator": 64496,
+       "local-administrator": "AAAAZQ=="
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.367345" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.366949" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.368177" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.367913" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.368354" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.367575" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.368950" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.368563" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.369285" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.369467" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.369143" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.369899" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.369656" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.371030" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.370718" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.371584" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.371288" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.372405" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.371995" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.373670" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.373103" elapsed="0.000667"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.373852" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:46.374155" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.372645" elapsed="0.001536"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.374355" elapsed="0.000425"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:46.371856" elapsed="0.002966"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.375498" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.375081" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.376741" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.376171" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.376917" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:46.377208" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.375713" elapsed="0.001522"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.377389" elapsed="0.000389"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:46.374944" elapsed="0.002877"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.371672" elapsed="0.006187"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.377905" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:46.378062" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:46.370366" elapsed="0.007721"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.370025" elapsed="0.008095"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.378310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.378147" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.370001" elapsed="0.008387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.379342" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.378594" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.379421" elapsed="0.000081"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.366209" elapsed="0.013401"/>
</kw>
<msg time="2026-05-01T00:57:46.379664" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.353509" elapsed="0.026206"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.392614" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.404790" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.417372" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.417599" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.417781" elapsed="0.000041"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.418198" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.418046" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:46.418030" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.418427" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.418618" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.418786" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:46.417997" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.417880" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.419015" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.419092" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:46.419223" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:46.349048" elapsed="0.070202"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.420578" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.420302" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.420742" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.419940" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.421090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.420838" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.421666" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.421358" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.421170" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.420820" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.424075" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.421911" elapsed="0.002191"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:46.424153" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:46.424308" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:46.419604" elapsed="0.004729"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.425528" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.425316" elapsed="0.000332"/>
</kw>
<msg time="2026-05-01T00:57:46.425749" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.424982" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.425980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.425845" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.425826" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.426363" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.426533" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.426200" elapsed="0.000358"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:46.426950" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.426716" elapsed="0.000259"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:46.427021" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:46.427177" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:46.424656" elapsed="0.002545"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.428612" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.428350" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.429059" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.428812" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:46.437156" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:46.437301" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '177'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:46.437397" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:46.431443" elapsed="0.005980"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.429168" elapsed="0.008320"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.437686" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.437516" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.429150" elapsed="0.008624"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.441246" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.438809" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.438587" elapsed="0.002741"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.438568" elapsed="0.002786"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.444889" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.441681" elapsed="0.003271"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.441410" elapsed="0.003590"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.441393" elapsed="0.003642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.445838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.445268" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.446319" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.445976" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.447113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.446689" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.446433" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.445951" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.448040" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.447528" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.448530" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.448177" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.449286" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.448877" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.448646" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.448152" elapsed="0.001251"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.449662" elapsed="0.000494"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:46.450814" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.450390" elapsed="0.000461"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.451070" elapsed="0.003182"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:46.438149" elapsed="0.016166"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.454508" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.454385" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.454367" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:46.457396" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.454726" elapsed="0.002709"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:46.457512" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:46.457677" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:46.427535" elapsed="0.030169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.457768" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:46.457920" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:46.326563" elapsed="0.131384"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.487960" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.487500" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.488780" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.488514" elapsed="0.000384">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.489075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.488155" elapsed="0.000945"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.489766" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.489299" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.490152" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.490281" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.489993" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.490751" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.490483" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:46.491265" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.490867" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.492027" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.491518" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.491351" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.490848" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.492755" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.492261" elapsed="0.000523"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.492834" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.486862" elapsed="0.006099"/>
</kw>
<msg time="2026-05-01T00:57:46.493015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.473958" elapsed="0.019105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.505487" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.517875" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.530329" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.530541" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.530722" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.531171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.531023" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:46.531009" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.531394" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.531587" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.531756" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:46.530979" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.530869" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.531985" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.532061" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:46.532178" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:46.471245" elapsed="0.060959"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.532383" elapsed="0.002317"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:46.535745" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.535440" elapsed="0.000334"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:46.536242" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.535965" elapsed="0.000304"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.536425" elapsed="0.000375"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.535030" elapsed="0.001831"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.534782" elapsed="0.002113"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.537070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.536920" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.534763" elapsed="0.002382"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:46.459091" elapsed="0.078102"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:46.458274" elapsed="0.078993"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.458031" elapsed="0.079280"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.458014" elapsed="0.079320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.537368" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:46.322108" elapsed="0.215405"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:44.078876" elapsed="2.458695"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:46.537785" elapsed="0.004740"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:40.959953" elapsed="5.582668"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:40.864928" elapsed="5.677813"/>
</test>
<test id="s1-s18-t8" name="Odl_To_Play_rt_constrain_type_1" line="85">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:46.546157" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:46.545885" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.547438" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.547327" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.547308" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.554141" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.553992" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.553966" elapsed="0.000272"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.555661" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.555110" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.556336" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:46.555928" elapsed="0.000443"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:46.556434" elapsed="0.000073"/>
</return>
<msg time="2026-05-01T00:57:46.556692" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.554579" elapsed="0.002147"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.563497" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.563372" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.563354" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.564783" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:46.564676" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.564658" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:46.565298" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.564999" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:46.565729" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:46.565507" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:46.594907" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:46.566255" elapsed="0.028754"/>
</kw>
<msg time="2026-05-01T00:57:46.595172" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:46.595219" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.565918" elapsed="0.029337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:46.632282" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:46.595794" elapsed="0.036780"/>
</kw>
<msg time="2026-05-01T00:57:46.632949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:46.633053" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.595428" elapsed="0.037707"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.633880" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.633313" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.633267" elapsed="0.000793"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.635087" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.634384" elapsed="0.001021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.636105" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.635592" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.635551" elapsed="0.000727"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:46.636354" elapsed="0.000067"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:46.642119" elapsed="0.000681"/>
</kw>
<msg time="2026-05-01T00:57:46.642946" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.639715" elapsed="0.003525"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.643970" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.644316" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:46.638230" elapsed="0.006292"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:46.637001" elapsed="0.007587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:46.564316" elapsed="0.080370"/>
</kw>
<msg time="2026-05-01T00:57:46.644777" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:46.644823" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.563721" elapsed="0.081140"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:46.645047" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:46.644939" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.644920" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.645560" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.645907" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.645978" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:46.563020" elapsed="0.083068"/>
</kw>
<msg time="2026-05-01T00:57:46.646181" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:46.646225" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.557239" elapsed="0.089023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.646640" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.646347" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.646329" elapsed="0.000390"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:46.557037" elapsed="0.089706"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:46.556800" elapsed="0.089975"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:46.553485" elapsed="0.093346"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:46.547041" elapsed="0.099849"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.546602" elapsed="0.100337"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:46.543711" elapsed="0.103285"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.647908" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.648070" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.647704" elapsed="0.000423"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:46.648523" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.648291" elapsed="0.000258"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.648897" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.649046" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.648708" elapsed="0.000364"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:46.649506" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.649268" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:46.649824" elapsed="0.002562"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.649607" elapsed="0.002816"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.649589" elapsed="0.002875"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.686654" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.686259" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.687472" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.687212" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.687644" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.686852" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.688224" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.687840" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.688574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.688704" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.688416" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.689134" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.688893" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.690139" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.689882" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.690633" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.690346" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.691365" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.691019" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.692340" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.691928" elapsed="0.000438"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.692417" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:57:46.692598" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.691604" elapsed="0.001019"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.692816" elapsed="0.000394"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:46.690881" elapsed="0.002370"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.693837" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.693535" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.694798" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.694374" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.694876" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:46.695029" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.694057" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.695219" elapsed="0.000246"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:46.693364" elapsed="0.002144"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.690709" elapsed="0.004835"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.695588" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:46.695743" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:46.689560" elapsed="0.006208"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.689248" elapsed="0.006552"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.695977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.695825" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.689229" elapsed="0.006825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.696809" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.696202" elapsed="0.000636"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.696892" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.685639" elapsed="0.011378"/>
</kw>
<msg time="2026-05-01T00:57:46.697072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.672957" elapsed="0.024163"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.709724" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.722088" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.734415" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.734676" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.734896" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.735268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.735120" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:46.735105" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.735510" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.735684" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.735852" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:46.735076" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.734972" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.736081" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.736157" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:46.736277" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:46.668512" elapsed="0.067791"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.760857" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.760481" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.761613" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.761382" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.761772" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.761051" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.762343" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.761963" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.762709" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.762858" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.762571" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.763292" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-ipv4&gt;
        &lt;global-administrator&gt;192.0.2.2&lt;/global-administrator&gt;
        &lt;local-administrator&gt;123&lt;/local-administrator&gt;
    &lt;/route-target-ipv4&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.763049" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:46.763767" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.763467" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.764294" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.764000" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.763851" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.763431" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.764984" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.764541" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.765064" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.759853" elapsed="0.005339"/>
</kw>
<msg time="2026-05-01T00:57:46.765248" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.747331" elapsed="0.017964"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.777775" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.790049" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.802533" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.802730" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.802910" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.803278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.803133" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:46.803118" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.803518" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.803692" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.803859" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:46.803089" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.802984" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.804127" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.804203" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:46.804332" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:46.746443" elapsed="0.057917"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.805651" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.805384" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.805808" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.805043" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.806185" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.805902" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.806763" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.806470" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.806270" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.805884" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.809163" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.806999" elapsed="0.002191"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:46.809241" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:46.809393" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:46.804718" elapsed="0.004701"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.810959" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.810716" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.811392" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-ipv4&gt;
        &lt;global-administrator&gt;192.0.2.2&lt;/global-administrator&gt;
        &lt;local-administrator&gt;123&lt;/local-administrator&gt;
    &lt;/route-target-ipv4&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.811159" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.811853" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.811612" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.812282" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.812046" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:46.813139" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:46.812945" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:46.813515" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:46.813326" elapsed="0.000214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.813690" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.814357" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.814105" elapsed="0.000296"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:46.814462" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:46.814620" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:46.812543" elapsed="0.002102"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:46.827944" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '697', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;route-target-ipv4&gt;
        &lt;global-administrator&gt;192.0.2.2&lt;/global-administrator&gt;
        &lt;local-administrator&gt;123&lt;/local-administrator&gt;
    &lt;/route-target-ipv4&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:46.828087" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes/route-target-constrain-route=flow1,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:46.828330" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:46.816957" elapsed="0.011432"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.814715" elapsed="0.013812"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.828948" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.828589" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.814698" elapsed="0.014450"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.836906" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.831586" elapsed="0.005419"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.831045" elapsed="0.006041"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.831004" elapsed="0.006140"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.840755" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.837852" elapsed="0.002949"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.837268" elapsed="0.003569"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.837231" elapsed="0.003632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.841431" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.841042" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.841800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.841546" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.842357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.842055" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.841882" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.841529" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.842983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.842623" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.843316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.843079" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.843872" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.843577" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.843396" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.843061" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.844233" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:46.845066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.844772" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.845248" elapsed="0.002360"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:46.830015" elapsed="0.017658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:46.847855" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:57:46.847747" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.847729" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.848105" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.848174" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:46.850464" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:46.809763" elapsed="0.040728"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.850562" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:46.850719" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:46.657286" elapsed="0.193459"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.851093" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.850850" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.850833" elapsed="0.000352"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.851220" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:46.652720" elapsed="0.198624"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.854783" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.852299" elapsed="0.002513"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.854974" elapsed="0.002260"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:46.857289" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:46.852029" elapsed="0.005386"/>
</kw>
<msg time="2026-05-01T00:57:46.857530" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:46.851535" elapsed="0.006023"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.858409" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:46.858500" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:46.858144" elapsed="0.000381"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.858933" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:46.859007" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:46.858681" elapsed="0.000349"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.859186" elapsed="0.000320"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.859843" level="INFO">${sum_1} = 2059</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:46.859665" elapsed="0.000203"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.860234" level="INFO">${sum_2} = 2059</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:46.860057" elapsed="0.000203"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.860413" elapsed="0.000330"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:46.857777" elapsed="0.003025"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:46.860953" elapsed="0.002888"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.910046" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.909675" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.910820" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:46.910586" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:46.910989" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:46.910239" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.911577" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:46.911180" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:46.911902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:46.912039" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:46.911767" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.912472" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.912220" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.913693" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.913365" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.914176" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.913906" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.915007" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.914593" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.916138" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.915662" elapsed="0.000557"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.916356" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:46.916598" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.915225" elapsed="0.001400"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.916782" elapsed="0.000426"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:46.914431" elapsed="0.002819"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.917936" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.917524" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:46.919056" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.918587" elapsed="0.000550"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:46.919309" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:46.919557" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:46.918154" elapsed="0.001429"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.919739" elapsed="0.000399"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:46.917368" elapsed="0.002812"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.914254" elapsed="0.005962"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:46.920260" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:46.920420" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:46.912882" elapsed="0.007563"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.912585" elapsed="0.007910"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.920672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.920520" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.912567" elapsed="0.008184"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.921514" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.920928" elapsed="0.000615"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.921592" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:46.909040" elapsed="0.012678"/>
</kw>
<msg time="2026-05-01T00:57:46.921773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.896529" elapsed="0.025292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.934180" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.946406" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.958998" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.959198" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.959377" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.959770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.959623" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:46.959608" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.960033" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.960206" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.960376" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:46.959578" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.959471" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.960642" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:46.960719" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:46.960840" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:46.892270" elapsed="0.068597"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.961967" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.961720" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:46.971060" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:46.971109" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:46.971198" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:46.964110" elapsed="0.007114"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.962082" elapsed="0.009182"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.971465" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.971290" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.962064" elapsed="0.009487"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.976266" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.972885" elapsed="0.003442"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.972575" elapsed="0.003802"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.972546" elapsed="0.003879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.980027" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:46.976848" elapsed="0.003243"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.976534" elapsed="0.003605"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.976510" elapsed="0.003664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.980948" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.980437" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.981285" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.981046" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.981846" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.981548" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.981366" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.981027" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.982503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.982128" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:46.982837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:46.982600" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.983370" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:46.983081" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.982917" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:46.982582" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:46.983620" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:46.984461" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:46.984153" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:46.984645" elapsed="0.002581"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:46.971949" elapsed="0.015339"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:46.987333" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:46.989598" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:46.961133" elapsed="0.028492"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:46.989679" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:46.864843" elapsed="0.124959"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:46.864397" elapsed="0.125460"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:46.864029" elapsed="0.125887"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.994598" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:46.990821" elapsed="0.003806"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.994782" elapsed="0.002086"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:46.996919" elapsed="0.000029"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:46.990553" elapsed="0.006510"/>
</kw>
<msg time="2026-05-01T00:57:46.997141" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:46.990083" elapsed="0.007083"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.998018" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:46.998093" level="INFO">${len_1} = 112</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:46.997758" elapsed="0.000358"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:46.998539" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:46.998613" level="INFO">${len_2} = 112</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:46.998272" elapsed="0.000364"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.998794" elapsed="0.000303"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.999424" level="INFO">${sum_1} = 1612</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:46.999252" elapsed="0.000210"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:46.999787" level="INFO">${sum_2} = 1612</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:46.999617" elapsed="0.000195"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:46.999969" elapsed="0.000326"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:46.997378" elapsed="0.002976"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.051054" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:47.050516" elapsed="0.000576"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.052167" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.051806" elapsed="0.000457">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:47.052395" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:47.051311" elapsed="0.001120"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.053248" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:47.052699" elapsed="0.000589"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.053738" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:47.053975" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:47.053540" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.054615" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.054247" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.056191" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.055809" elapsed="0.000446"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.056898" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.056510" elapsed="0.000426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.058257" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:47.057468" elapsed="0.000827"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:47.060187" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.059432" elapsed="0.000821"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:47.060462" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:57:47.060764" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:47.058605" elapsed="0.002192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.061010" elapsed="0.000651"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:47.057250" elapsed="0.004466"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.062622" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:47.062041" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:47.063881" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.063348" elapsed="0.000578"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:47.064048" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:47.064277" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:47.062852" elapsed="0.001452"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.064497" elapsed="0.000508"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:47.061868" elapsed="0.003180"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:47.057007" elapsed="0.008079"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:47.065132" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:47.065358" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:47.055258" elapsed="0.010127"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.054794" elapsed="0.010626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.065633" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.065470" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.054762" elapsed="0.010953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.066501" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:47.065872" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:47.066583" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:47.049517" elapsed="0.017193"/>
</kw>
<msg time="2026-05-01T00:57:47.066767" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:47.034817" elapsed="0.032013"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.079961" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.092392" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.104832" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.105032" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.105210" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.105601" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.105436" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:47.105421" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.105824" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.105992" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.106155" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:47.105390" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.105285" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.106383" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.106512" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:47.106639" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:47.029213" elapsed="0.077453"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.107848" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.107593" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:47.115921" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:47.116079" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '431'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-route-target-constrain:route-target-constrain-subsequent-address-family']/bgp-route-target-constrain:route-target-constrain-routes",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:47.116231" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:47.116274" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.110017" elapsed="0.006690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:47.107963" elapsed="0.008826">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.116983" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.116825" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:47.107945" elapsed="0.009132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.120677" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.118176" elapsed="0.002536">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:47.117954" elapsed="0.002821">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:47.117936" elapsed="0.002871">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.123588" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.121099" elapsed="0.002522">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:47.120876" elapsed="0.002809">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:47.120859" elapsed="0.002859">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.124575" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:47.124001" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.125054" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.124714" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.125850" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:47.125402" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.125168" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.124688" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.126766" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:47.126239" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.127248" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.126903" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.128036" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:47.127618" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.127363" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.126877" elapsed="0.001276"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:47.128365" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:47.129516" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:47.129104" elapsed="0.000450"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:47.132965" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.129772" elapsed="0.003238">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.117515" elapsed="0.015686">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:47.133286" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:57:47.136487" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:47.136520" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:47.106936" elapsed="0.029613">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:47.136617" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.001712" elapsed="0.135077">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.001115" elapsed="0.135736"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:47.000603" elapsed="0.136310"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:46.647302" elapsed="0.489663"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:46.543149" elapsed="0.593934"/>
</test>
<test id="s1-s18-t9" name="Play_To_Odl_rt_constrain_type_1" line="89">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:47.140300" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:47.140038" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.141579" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:47.141468" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.141435" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.147109" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:47.146977" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.146957" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.148247" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:47.147861" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.148755" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:47.148442" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:47.148827" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:47.148984" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:47.147472" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.154485" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:47.154360" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.154341" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.155786" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:47.155676" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.155657" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:47.156314" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.156009" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:47.156752" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:47.156527" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:47.185133" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:47.157297" elapsed="0.028206"/>
</kw>
<msg time="2026-05-01T00:57:47.186084" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:47.186274" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.156949" elapsed="0.029455"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:47.215312" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:47.188351" elapsed="0.027096"/>
</kw>
<msg time="2026-05-01T00:57:47.215644" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:47.215692" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.187212" elapsed="0.028517"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.216135" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.215845" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.215809" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.216733" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.216383" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.217111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.216888" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.216869" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:47.217233" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:47.220325" elapsed="0.000414"/>
</kw>
<msg time="2026-05-01T00:57:47.220892" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:47.219116" elapsed="0.001920"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.221330" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.221709" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:47.218286" elapsed="0.003620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:47.217640" elapsed="0.004334"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:47.155336" elapsed="0.066740"/>
</kw>
<msg time="2026-05-01T00:57:47.222171" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:47.222216" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.154711" elapsed="0.067544"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:47.222498" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:47.222361" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.222338" elapsed="0.000248"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.223016" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.223369" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.223442" elapsed="0.000043"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:47.154025" elapsed="0.069559"/>
</kw>
<msg time="2026-05-01T00:57:47.223679" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:47.223725" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.149384" elapsed="0.074378"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.224098" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.223839" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.223821" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:47.149237" elapsed="0.074965"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:47.149063" elapsed="0.075175"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:47.146566" elapsed="0.077732"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:47.141167" elapsed="0.083193"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:47.140737" elapsed="0.083673"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:47.137904" elapsed="0.086641"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.225713" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.225207" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.226411" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.225918" elapsed="0.000541"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.227022" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.226633" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.227426" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:47.227667" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:47.227216" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.228050" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:47.228175" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:47.227855" elapsed="0.000346"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:47.228357" elapsed="0.002438"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:47.230980" elapsed="0.015796"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.301334" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:47.300938" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.302188" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.301916" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:47.302367" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:47.301563" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.302967" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:47.302579" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.303301" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:47.303480" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:47.303159" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.303914" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.303668" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.305018" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.304707" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.305530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.305226" elapsed="0.000349"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.306553" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:47.305961" elapsed="0.000619"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:47.307807" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.307231" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:47.307994" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:47.308304" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:47.306774" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.308508" elapsed="0.000399"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:47.305819" elapsed="0.003130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.309725" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:47.309254" elapsed="0.000498"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:47.310968" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.310404" elapsed="0.000666"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:47.311148" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:47.311460" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:47.309947" elapsed="0.001541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:47.311645" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:47.309114" elapsed="0.002941"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:47.305631" elapsed="0.006460"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:47.312136" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:47.312296" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:47.304363" elapsed="0.007958"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.304040" elapsed="0.008314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.312550" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.312380" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.304016" elapsed="0.008612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.313622" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:47.312779" elapsed="0.000873"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:47.313702" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:47.300296" elapsed="0.013534"/>
</kw>
<msg time="2026-05-01T00:57:47.313891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:47.287580" elapsed="0.026359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.326477" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.338742" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.350957" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.351159" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.351378" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.351775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.351623" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:47.351608" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.352004" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.352173" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.352340" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:47.351578" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.351467" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.352584" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.352660" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:47.352787" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:47.283277" elapsed="0.069537"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.354173" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.353917" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:47.354335" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:47.353565" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.354699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.354430" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.355265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:47.354974" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.354781" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.354412" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.357699" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:47.355518" elapsed="0.002208"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:47.357777" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:47.357933" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:47.353171" elapsed="0.004786"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:47.359220" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.358953" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:47.359379" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:47.358611" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:47.359629" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:47.359491" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:47.359471" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.359867" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.360082" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.360149" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:47.362283" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:47.358270" elapsed="0.004040"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.363734" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.363482" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:47.364176" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:47.363937" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:47.372610" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:47.372774" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:47.372883" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.366406" elapsed="0.006900">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:47.364285" elapsed="0.009111">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.373613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.373431" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:47.364267" elapsed="0.009435">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.374094" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.374226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:47.374190" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:47.374173" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.374437" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.374523" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.362647" elapsed="0.011987">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.374742" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.260541" elapsed="0.114303">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:47.375127" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:47.374940" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:47.374923" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:47.375257" elapsed="0.000014"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:47.256164" elapsed="0.119190">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.438273" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.437837" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.439169" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.438899" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.439360" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.438541" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.439978" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.439588" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.440374" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:49.440573" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:49.440186" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.441039" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.440769" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.442290" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.441944" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.442832" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.442552" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.443756" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.443271" elapsed="0.000512"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.445110" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.444496" elapsed="0.000740"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.445322" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:57:49.445759" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.443984" elapsed="0.001802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.445973" elapsed="0.000427"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:49.443124" elapsed="0.003320"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.447162" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.446736" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.448511" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.447902" elapsed="0.000716"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.448699" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:49.449006" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.447393" elapsed="0.001639"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.449240" elapsed="0.000411"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:49.446579" elapsed="0.003116"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.442914" elapsed="0.006826"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.449801" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:49.449967" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:49.441577" elapsed="0.008415"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.441191" elapsed="0.008833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.450213" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.450051" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.441164" elapsed="0.009128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.451312" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.450478" elapsed="0.000863"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.451392" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:49.437090" elapsed="0.014460"/>
</kw>
<msg time="2026-05-01T00:57:49.451618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.421196" elapsed="0.030488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.464723" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.477589" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.490537" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.490879" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.491077" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.491547" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.491371" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:49.491353" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.491788" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.492005" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.492182" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:49.491311" elapsed="0.000925"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.491174" elapsed="0.001090"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.492431" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.492531" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:49.492693" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.416899" elapsed="0.075824"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.494265" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.493965" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.494441" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.493523" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.494856" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.494558" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.495439" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.495138" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.494946" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.494539" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.498013" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.495730" elapsed="0.002311"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:49.498095" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:49.498257" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.493137" elapsed="0.005145"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.499628" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.499343" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.499792" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.498972" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:49.500039" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:57:49.499891" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.499871" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.500357" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.500554" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.500624" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:49.502839" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.498638" elapsed="0.004229"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.504378" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.504120" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.504906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.504630" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:49.513397" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:49.513844" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '346'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:57:49.513951" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:49.507188" elapsed="0.006789"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.505022" elapsed="0.008999"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.514208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.514047" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.505002" elapsed="0.009292"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.518009" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.515389" elapsed="0.002690"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.515142" elapsed="0.002979"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.515124" elapsed="0.003024"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.520862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.518436" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.518206" elapsed="0.002751"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.518189" elapsed="0.002831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.521996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.521368" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.522514" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.522146" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.523335" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.522866" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.522632" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.522120" elapsed="0.001361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.524272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.523715" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.524852" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.524485" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.525832" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.525350" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.524997" elapsed="0.000927"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.524436" elapsed="0.001518"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.526182" elapsed="0.000559"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:49.527431" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.526983" elapsed="0.000509"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.527717" elapsed="0.003668"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:49.514719" elapsed="0.016783"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.531754" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:49.531604" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.531578" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.535421" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.532107" elapsed="0.003360"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:49.535523" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:49.535713" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:49.503246" elapsed="0.032495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.535806" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:49.535961" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:49.389821" elapsed="0.146167"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.566106" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.565587" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.567096" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.566752" elapsed="0.000519">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.567477" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.566338" elapsed="0.001166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.568131" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.567678" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.568574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:49.568810" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:49.568379" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.569306" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-ipv4": {
                    "global-administrator": "192.0.2.2",
                    "local-administrator": 123
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.569027" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:49.569886" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.569438" elapsed="0.000513"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.570751" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.570170" elapsed="0.000611"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.569982" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.569413" elapsed="0.001446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.571592" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.571024" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.571674" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:49.564910" elapsed="0.006902"/>
</kw>
<msg time="2026-05-01T00:57:49.571872" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.551598" elapsed="0.020329"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.586942" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.599438" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.611991" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.612259" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.612471" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.612995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.612828" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:49.612810" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.613232" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.613404" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.613592" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:49.612765" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.612557" elapsed="0.001120"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.613831" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.613912" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:49.614096" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.548746" elapsed="0.065379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.614309" elapsed="0.002399"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.618018" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.617560" elapsed="0.000487"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.618630" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.618209" elapsed="0.000450"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:49.618842" elapsed="0.000357"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:49.617095" elapsed="0.002166"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.616801" elapsed="0.002494"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.619491" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.619321" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.616776" elapsed="0.002797"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:49.537227" elapsed="0.082394"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:49.536349" elapsed="0.083348"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.536071" elapsed="0.083675"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.536054" elapsed="0.083717"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.619806" elapsed="0.000036"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:49.382510" elapsed="0.237434"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:47.247242" elapsed="2.372781"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.670651" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.670248" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.671476" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.671194" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.671677" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.670855" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.672260" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.671873" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.672614" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:49.672777" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:49.672469" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.673216" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.672971" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.674298" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.673989" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.674816" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.674543" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.675652" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.675210" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.676920" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.676340" elapsed="0.000685"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.677105" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:49.677409" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.675875" elapsed="0.001561"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.677612" elapsed="0.000395"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:49.675071" elapsed="0.002977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.678740" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.678303" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.679993" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.679417" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.680174" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:49.680486" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.678957" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.680668" elapsed="0.000368"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:49.678166" elapsed="0.002910"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.674894" elapsed="0.006217"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.681154" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:49.681359" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:49.673662" elapsed="0.007723"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.673340" elapsed="0.008077"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.681615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.681444" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.673316" elapsed="0.008377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.682630" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.681842" elapsed="0.000817"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.682709" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:49.669626" elapsed="0.013209"/>
</kw>
<msg time="2026-05-01T00:57:49.682891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.656976" elapsed="0.025964"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.695503" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.707822" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.720072" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.720298" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.720500" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.720914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.720759" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:49.720742" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.721144" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.721314" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.721497" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:49.720702" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.720584" elapsed="0.000995"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.721799" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.721880" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:49.722029" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.652702" elapsed="0.069356"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.723480" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.723155" elapsed="0.000403">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.723653" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.722767" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.724018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.723751" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.724595" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.724286" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.724099" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.723732" elapsed="0.000947"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.727002" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.724833" elapsed="0.002196"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:49.727081" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:49.727251" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.722396" elapsed="0.004881"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.728523" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.728275" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.728680" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.727940" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:49.728911" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:49.728776" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.728758" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.729346" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.729535" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.729603" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:49.731725" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.727610" elapsed="0.004142"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.733172" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.732914" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.733642" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.733379" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:49.741594" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:49.741749" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '346'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:57:49.741864" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:49.735873" elapsed="0.006019"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.733791" elapsed="0.008144"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.742120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.741963" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.733771" elapsed="0.008437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.745882" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.743427" elapsed="0.002503"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.743012" elapsed="0.002953"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.742994" elapsed="0.002996"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.748588" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.746268" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.746045" elapsed="0.002622"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.746029" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.749271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.748872" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.749629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.749370" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.750177" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.749879" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.749711" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.749351" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.750806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.750425" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.751165" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.750903" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.751730" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.751414" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.751249" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.750885" elapsed="0.000929"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.751972" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:49.752798" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.752497" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.752981" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:49.742588" elapsed="0.012819"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.755609" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:49.755499" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.755480" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.758611" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.755829" elapsed="0.002813"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:49.758694" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:49.758855" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:49.732070" elapsed="0.026812"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.758946" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:49.759113" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:49.629970" elapsed="0.129171"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.787503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.786993" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.788354" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.788043" elapsed="0.000460">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.788684" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.787704" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.789332" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.788881" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.789704" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:49.789875" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:49.789541" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.790333" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-ipv4": {
                    "global-administrator": "192.0.2.2",
                    "local-administrator": 123
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.790066" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:49.790901" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.790471" elapsed="0.000492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.791740" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.791193" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.791036" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.790434" elapsed="0.001392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.792492" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.791976" elapsed="0.000545"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.792572" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:49.786337" elapsed="0.006365"/>
</kw>
<msg time="2026-05-01T00:57:49.792761" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.773730" elapsed="0.019080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.805291" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.817587" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.830072" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.830276" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.830471" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.830889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.830739" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:49.830725" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.831114" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.831285" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.831466" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:49.830691" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.830574" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.831703" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.831823" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:49.831972" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.771081" elapsed="0.060919"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.832182" elapsed="0.002216"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.835644" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.835185" elapsed="0.000488"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.836210" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.835830" elapsed="0.000408"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:49.836397" elapsed="0.000348"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:49.834768" elapsed="0.002037"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.834495" elapsed="0.002344"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.837016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.836864" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.834474" elapsed="0.002619"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:49.760284" elapsed="0.076857"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:49.759486" elapsed="0.077730"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.759227" elapsed="0.078035"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.759209" elapsed="0.078077"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.837320" elapsed="0.000030"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:49.625010" elapsed="0.212455"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:49.620349" elapsed="0.217180"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.886998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.886603" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.887826" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.887565" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.888011" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.887207" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.888708" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.888291" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.889047" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:49.889205" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:49.888904" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.889664" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.889395" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.890791" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.890480" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.891274" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.891003" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.892119" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.891712" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.893365" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.892813" elapsed="0.000667"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.893562" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:49.893862" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.892339" elapsed="0.001549"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.894053" elapsed="0.000414"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:49.891572" elapsed="0.002938"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.895160" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.894763" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:49.896416" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.895859" elapsed="0.000682"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:49.896620" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:49.896915" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:49.895374" elapsed="0.001567"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.897100" elapsed="0.000382"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:49.894627" elapsed="0.002897"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.891352" elapsed="0.006207"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:49.897602" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:49.897759" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:49.890104" elapsed="0.007680"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.889788" elapsed="0.008029"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.897994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.897842" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.889766" elapsed="0.008304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.899004" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.898230" elapsed="0.000803"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.899084" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:49.885932" elapsed="0.013278"/>
</kw>
<msg time="2026-05-01T00:57:49.899311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.873228" elapsed="0.026133"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.911878" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.924105" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.936340" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.936550" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.936731" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.937097" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.936951" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:49.936937" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.937317" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.937502" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.937673" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:49.936907" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.936804" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.937922" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.938000" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:49.938120" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.868792" elapsed="0.069355"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.939396" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.939156" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.939608" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.938817" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.939954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.939705" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.940530" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.940223" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.940036" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.939687" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.942941" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:49.940769" elapsed="0.002199"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:49.943020" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:49.943175" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.938489" elapsed="0.004711"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:49.944429" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:49.944188" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:49.944602" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:49.943846" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:49.944833" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:49.944698" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.944680" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.945068" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.945243" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.945308" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:49.947399" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:49.943523" elapsed="0.003903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.948838" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.948588" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.949282" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.949041" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:49.956257" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:49.956408" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '346'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:57:49.956549" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:49.951733" elapsed="0.004843"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.949393" elapsed="0.007226"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.956801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.956645" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.949375" elapsed="0.007545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.960396" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.957996" elapsed="0.002449"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.957772" elapsed="0.002723"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.957753" elapsed="0.002767"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.963098" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:49.960800" elapsed="0.002345"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.960577" elapsed="0.002603"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.960560" elapsed="0.002646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.963772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.963374" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.964112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.963870" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.964678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.964362" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.964194" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.963852" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.965282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.964925" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:49.965628" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:49.965377" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:49.966178" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:49.965884" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.965720" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.965359" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.966412" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:49.967218" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:49.966936" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:49.967400" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:49.957294" elapsed="0.012507"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:49.969977" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:49.969871" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.969853" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:49.972942" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:49.970196" elapsed="0.002775"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:49.973022" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:49.973180" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:49.947760" elapsed="0.025446"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:49.973270" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:49.973471" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:49.846378" elapsed="0.127122"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.001577" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.001082" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.002378" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.002111" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:50.002692" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:50.001773" elapsed="0.000944"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.003319" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:50.002883" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.003681" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:50.003826" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:50.003524" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.004272" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-ipv4": {
                    "global-administrator": "192.0.2.2",
                    "local-administrator": 123
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.004011" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:50.004807" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.004389" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.005667" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.005042" elapsed="0.000652"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.004893" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.004370" elapsed="0.001382"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.006383" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.005901" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:50.006482" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:50.000445" elapsed="0.006166"/>
</kw>
<msg time="2026-05-01T00:57:50.006669" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:49.987978" elapsed="0.018740"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.019223" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.031361" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.043701" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.043900" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.044079" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.044464" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.044305" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:50.044291" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.044687" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.044854" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.045025" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:50.044262" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.044157" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.045260" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.045336" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:50.045490" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:49.985341" elapsed="0.060178"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:50.045698" elapsed="0.002184"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:50.049034" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.048632" elapsed="0.000430"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:50.049637" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.049229" elapsed="0.000467"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:50.049860" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:50.048208" elapsed="0.002039"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.047962" elapsed="0.002320"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.050474" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.050308" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.047944" elapsed="0.002610"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:49.974652" elapsed="0.075949"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:49.973839" elapsed="0.076835"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:49.973585" elapsed="0.077134"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:49.973568" elapsed="0.077174"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:50.050776" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:49.841956" elapsed="0.208945"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:49.837709" elapsed="0.213252"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:50.051132" elapsed="0.017204"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.117507" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.117042" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.118290" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.118041" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:50.118472" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:50.117706" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.119054" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:50.118666" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.119380" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:50.119540" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:50.119244" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.119965" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.119724" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.121017" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.120712" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.121519" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.121225" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.122311" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.121909" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:50.123618" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.123046" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:50.123800" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:50.124101" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:50.122588" elapsed="0.001540"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.124287" elapsed="0.000406"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:50.121771" elapsed="0.002989"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.125488" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.125039" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:50.126740" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.126168" elapsed="0.000675"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:50.126919" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:50.127214" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:50.125708" elapsed="0.001532"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.127397" elapsed="0.000386"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:50.124878" elapsed="0.002946"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:50.121597" elapsed="0.006262"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:50.127902" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:50.128058" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:50.120374" elapsed="0.007709"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.120079" elapsed="0.008036"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.128290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.128140" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.120059" elapsed="0.008307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.130418" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.128527" elapsed="0.002001"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:50.130582" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:50.116400" elapsed="0.014312"/>
</kw>
<msg time="2026-05-01T00:57:50.130768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:50.103836" elapsed="0.026980"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.143333" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.155639" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.168151" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.168349" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.168550" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.168919" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.168772" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:50.168757" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.169142" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.169312" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.169494" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:50.168728" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.168626" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.169723" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.169799" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:50.169919" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:50.099463" elapsed="0.070482"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.171213" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.170962" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:50.171371" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:50.170617" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.171733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.171482" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.172288" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.171997" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.171815" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.171462" elapsed="0.000909"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.174734" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:50.172564" elapsed="0.002196"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:50.174813" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:50.174968" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:50.170271" elapsed="0.004722"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.176161" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:50.175975" elapsed="0.000276"/>
</kw>
<msg time="2026-05-01T00:57:50.176337" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:50.175640" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.176602" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:50.176463" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.176414" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.176982" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:50.177115" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:50.176818" elapsed="0.000321"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:50.177545" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.177297" elapsed="0.000273"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:50.177617" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:50.177772" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:50.175298" elapsed="0.002498"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.179179" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.178933" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.179639" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.179381" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:50.187643" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:50.188126" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '522'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:50.188238" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:50.182024" elapsed="0.006241"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.179748" elapsed="0.008559"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.188521" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.188333" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.179730" elapsed="0.008879"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.192041" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.189635" elapsed="0.002456"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.189397" elapsed="0.002729"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.189379" elapsed="0.002773"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.194781" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.192486" elapsed="0.002342"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.192209" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.192192" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.195437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.195059" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.195828" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.195585" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.196389" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.196077" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.195911" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.195566" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.197026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.196660" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.197359" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.197122" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.197915" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.197623" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.197440" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.197105" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:50.198156" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:50.198963" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.198681" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:50.199146" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:50.188973" elapsed="0.012575"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.201725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:50.201618" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.201600" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:50.204779" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.201942" elapsed="0.002865"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:50.204859" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:50.205036" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:50.178106" elapsed="0.026962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:50.205143" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:50.205291" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:50.077156" elapsed="0.128161"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.233644" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.233162" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.234443" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.234174" elapsed="0.000406">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:50.234790" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:50.233839" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.235430" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:50.234986" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:50.235800" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:50.235932" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:50.235642" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.236404" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:50.236134" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:50.236943" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.236540" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.237712" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:50.237180" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:50.237030" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:50.236521" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.238428" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:50.237947" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:50.238527" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:50.232549" elapsed="0.006107"/>
</kw>
<msg time="2026-05-01T00:57:50.238710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:50.219832" elapsed="0.018926"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.251145" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.263474" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.276060" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.276291" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.276488" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.276865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.276719" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:50.276705" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.277085" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.277255" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.277423" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:50.276675" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.276567" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.277669" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.277745" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:50.277862" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:50.217195" elapsed="0.060695"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:50.278068" elapsed="0.002190"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:50.281296" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.281010" elapsed="0.000315"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:50.282068" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:50.281497" elapsed="0.000600"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:50.282600" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-constrain-route": [
     {
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "origin-as": 64511,
      "path-id": 0,
      "route-key": "AQLAAAICAHs=",
      "route-target-ipv4": {
       "global-administrator": "192.0.2.2",
       "local-administrator": 123
      }
     }
    ]
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:50.282789" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.282256" elapsed="0.000600">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.280598" elapsed="0.002440">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:50.280338" elapsed="0.002779">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:50.283304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:50.283151" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:50.280320" elapsed="0.003063">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.206443" elapsed="0.077077">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.205657" elapsed="0.078008">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:50.205399" elapsed="0.078354">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:50.205383" elapsed="0.078425">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:50.283861" elapsed="0.000016"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:50.072823" elapsed="0.211158">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,30 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AQLAAAICAHs=",
+      "route-target-ipv4": {
+       "global-administrator": "192.0.2.2",
+       "local-administrator": 123
+      }
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.339661" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.339233" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.340537" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.340245" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.340719" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.339881" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.341339" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.340932" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.341701" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.341875" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.341553" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.342322" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.342071" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.343502" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.343148" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.344004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.343723" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.344914" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.344437" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.346231" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.345657" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.346417" elapsed="0.000057"/>
</return>
<msg time="2026-05-01T00:57:52.346749" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.345148" elapsed="0.001628"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.346940" elapsed="0.000410"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:52.344291" elapsed="0.003102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.348096" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.347678" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.349417" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.348850" elapsed="0.000702"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.349633" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:52.349934" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.348326" elapsed="0.001634"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.350119" elapsed="0.000419"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:52.347536" elapsed="0.003045"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.344098" elapsed="0.006520"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.350662" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:52.350827" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:52.342795" elapsed="0.008112"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.342467" elapsed="0.008476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.351128" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.350970" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.342426" elapsed="0.008789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.352293" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.351381" elapsed="0.000942"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.352375" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.338580" elapsed="0.013945"/>
</kw>
<msg time="2026-05-01T00:57:52.352607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.325575" elapsed="0.027096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.365431" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.378480" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.391296" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.391538" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.391731" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.392161" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.392002" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:52.391984" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.392390" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.392589" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.392759" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:52.391940" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.391814" elapsed="0.001026"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.392990" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.393142" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:57:52.393304" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:52.321176" elapsed="0.072157"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.394780" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.394483" elapsed="0.000373">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.394951" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.394058" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.395512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.395049" elapsed="0.000522"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.396082" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.395787" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.395596" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.395030" elapsed="0.001135"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.398590" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.396320" elapsed="0.002296"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:52.398668" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:52.398825" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:52.393690" elapsed="0.005160"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.400034" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.399843" elapsed="0.000249"/>
</kw>
<msg time="2026-05-01T00:57:52.400175" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.399503" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.400403" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.400269" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.400250" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.400813" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.400972" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.400647" elapsed="0.000350"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:52.401394" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.401156" elapsed="0.000263"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:52.401481" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:52.401637" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:52.399162" elapsed="0.002500"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.403062" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.402813" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.403519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.403263" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:52.411154" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:52.411303" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '177'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:52.411400" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:52.405959" elapsed="0.005467"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.403666" elapsed="0.007825"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.411679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.411519" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.403648" elapsed="0.008116"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.415351" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.412922" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.412686" elapsed="0.002747"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.412666" elapsed="0.002807"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.418538" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.415755" elapsed="0.002848"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.415531" elapsed="0.003120"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.415514" elapsed="0.003172"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.419479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.418922" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.419956" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.419618" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.420756" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.420300" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.420069" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.419593" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.421634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.421106" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.422100" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.421767" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.422871" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.422442" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.422212" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.421743" elapsed="0.001243"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.423202" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:52.424328" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.423933" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.424618" elapsed="0.003194"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:52.412189" elapsed="0.015710"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.428190" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.427998" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.427972" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:52.431390" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.428556" elapsed="0.002864"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:52.431488" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:52.431649" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:52.401978" elapsed="0.029698"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.431739" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:52.431892" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:52.297631" elapsed="0.134287"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.460234" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.459766" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.461096" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.460829" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.461389" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.460491" elapsed="0.000924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.462041" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.461601" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.462393" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.462545" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.462234" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.462995" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.462731" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:52.463531" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.463109" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.464289" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.463766" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.463617" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.463091" elapsed="0.001283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.465035" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.464555" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.465145" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.459137" elapsed="0.006141"/>
</kw>
<msg time="2026-05-01T00:57:52.465331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.446531" elapsed="0.018849"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.477876" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.490410" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.502891" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.503093" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.503270" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.503667" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.503519" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:52.503504" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.503890" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.504059" elapsed="0.000068"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.504276" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:52.503472" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.503348" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.504521" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.504599" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:52.504719" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:52.443870" elapsed="0.060876"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.504959" elapsed="0.002179"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:52.508210" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.507893" elapsed="0.000346"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:52.508687" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.508396" elapsed="0.000320"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:52.508876" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:52.507478" elapsed="0.001783"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.507219" elapsed="0.002075"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.509486" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.509320" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.507200" elapsed="0.002365"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:52.433074" elapsed="0.076538"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:52.432247" elapsed="0.077438"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.432003" elapsed="0.077726"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.431985" elapsed="0.077767"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.509786" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:52.291602" elapsed="0.218312"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:50.068540" elapsed="2.441437"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:52.510366" elapsed="0.002364"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:47.224817" elapsed="5.287975"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:47.137412" elapsed="5.375527"/>
</test>
<test id="s1-s18-t10" name="Odl_To_Play_rt_constrain_type_2" line="93">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:52.516242" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:52.515951" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.517552" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.517416" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.517397" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.522740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.522633" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.522615" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.523810" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.523415" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.524306" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:52.524012" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:52.524377" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:52.524552" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.523040" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.530100" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.529991" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.529973" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.531713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:52.531605" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.531587" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:52.532274" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.531962" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:52.532701" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:52.532482" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:52.564154" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:52.533232" elapsed="0.031039"/>
</kw>
<msg time="2026-05-01T00:57:52.564445" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:52.564517" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.532890" elapsed="0.031665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:52.595022" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:52.565109" elapsed="0.030028"/>
</kw>
<msg time="2026-05-01T00:57:52.595298" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:52.595343" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.564746" elapsed="0.030635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.595756" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.595495" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.595444" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.596292" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "d "l "_ "T "o "_ "P "l "a "y "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.595989" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.596672" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.596435" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.596418" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:52.596785" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:52.599440" elapsed="0.000364"/>
</kw>
<msg time="2026-05-01T00:57:52.599869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.598317" elapsed="0.001688"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.600284" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.600646" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:52.597675" elapsed="0.003161"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:52.597107" elapsed="0.003794"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:52.531091" elapsed="0.069907"/>
</kw>
<msg time="2026-05-01T00:57:52.601092" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:52.601136" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.530508" elapsed="0.070665"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:52.601405" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:52.601296" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.601277" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.601919" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.602255" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.602327" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:52.529656" elapsed="0.072780"/>
</kw>
<msg time="2026-05-01T00:57:52.602546" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:52.602590" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "O "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.524998" elapsed="0.077629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.602954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.602702" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.602685" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:52.524851" elapsed="0.078204"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:52.524671" elapsed="0.078417"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:52.522255" elapsed="0.080890"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:52.517130" elapsed="0.086070"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.516697" elapsed="0.086548"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:52.513819" elapsed="0.089479"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.604212" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/announce_rt_constrain_type_2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/announce_rt_constrain_type_2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.604382" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.604008" elapsed="0.000400"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:52.604797" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b</msg>
<var>${announce_hex}</var>
<arg>${announce_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.604584" elapsed="0.000238"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.605166" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/withdraw_rt_constrain_type_2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/withdraw_rt_constrain_type_2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.605292" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.604979" elapsed="0.000338"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:57:52.605698" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b</msg>
<var>${withdraw_hex}</var>
<arg>${withdraw_hex}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.605496" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="'${remove}' == 'True'">
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:52.606009" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.605796" elapsed="0.002625"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.605776" elapsed="0.002683"/>
</if>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.642426" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.642053" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.643379" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.643026" elapsed="0.000472">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.643597" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.642685" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.644177" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.643792" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.644518" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.644649" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.644369" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.645075" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.644834" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.646083" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.645825" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.646575" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.646290" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.647268" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.646970" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.648260" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.647840" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.648338" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:52.648514" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.647518" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.648697" elapsed="0.000245"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:52.646829" elapsed="0.002153"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.649560" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.649238" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.650516" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.650093" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.650593" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:52.650744" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.649775" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.650921" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:52.649101" elapsed="0.002081"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.646653" elapsed="0.004564"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.651260" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:52.651438" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:52.645500" elapsed="0.005982"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.645187" elapsed="0.006329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.651696" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.651541" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.645168" elapsed="0.006638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.654845" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.651957" elapsed="0.002938"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.654970" elapsed="0.000050"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.641420" elapsed="0.013713"/>
</kw>
<msg time="2026-05-01T00:57:52.655198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.628715" elapsed="0.026536"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.667771" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.680117" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.692466" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.692673" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.692853" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.693226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.693073" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:52.693059" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.693463" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.693637" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.693807" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:52.693030" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.692927" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.694033" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.694109" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:52.694236" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:52.624471" elapsed="0.069863"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.719002" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.718629" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.719839" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.719594" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.719999" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.719240" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.720588" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.720190" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.720912" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.721060" level="INFO">${template} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.720778" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.721507" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;as-4-route-target-extended-community&gt;
        &lt;as-4-specific-common&gt;
            &lt;as-number&gt;65000&lt;/as-number&gt;
            &lt;local-administrator&gt;123&lt;/local-administrator&gt;
        &lt;/as-4-specific-common&gt;
    &lt;/as-4-route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.721251" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:52.721926" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.721631" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.722460" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.722157" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.722009" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.721612" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.723164" level="INFO">${final_text} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.722695" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.723243" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.718001" elapsed="0.005368"/>
</kw>
<msg time="2026-05-01T00:57:52.723425" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.705382" elapsed="0.018107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.788274" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.800838" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.813309" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.813544" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.813737" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.814157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.814004" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:52.813986" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.814403" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.814595" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.814782" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:52.813944" elapsed="0.000893"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.813822" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.815017" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.815096" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:57:52.815264" level="INFO">${data} = &lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;645...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:52.704527" elapsed="0.110772"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.816782" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.816429" elapsed="0.000430">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.816955" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.816016" elapsed="0.001023"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.817404" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.817116" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.817997" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.817691" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.817507" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.817097" elapsed="0.000986"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.820514" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.818239" elapsed="0.002303"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:52.820596" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:52.820758" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:52.815661" elapsed="0.005123"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.822359" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.822092" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.822989" level="INFO">&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;as-4-route-target-extended-community&gt;
        &lt;as-4-specific-common&gt;
            &lt;as-number&gt;65000&lt;/as-number&gt;
            &lt;local-administrator&gt;123&lt;/local-administrator&gt;
        &lt;/as-4-specific-common&gt;
    &lt;/as-4-route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.822696" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.823496" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.823216" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.823940" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.823695" elapsed="0.000290"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:52.824835" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:57:52.824624" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:57:52.825194" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:57:52.825019" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.825373" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.826172" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.825921" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:57:52.826260" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:52.826425" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:57:52.824190" elapsed="0.002280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:52.843864" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '780', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;?xml version="1.0"?&gt;
&lt;route-target-constrain-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;
    &lt;route-key&gt;flow1&lt;/route-key&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;origin-as&gt;64511&lt;/origin-as&gt;
    &lt;as-4-route-target-extended-community&gt;
        &lt;as-4-specific-common&gt;
            &lt;as-number&gt;65000&lt;/as-number&gt;
            &lt;local-administrator&gt;123&lt;/local-administrator&gt;
        &lt;/as-4-specific-common&gt;
    &lt;/as-4-route-target-extended-community&gt;
    &lt;attributes&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;199.20.166.41&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
    &lt;/attributes&gt;
&lt;/route-target-constrain-route&gt; 
 </msg>
<msg time="2026-05-01T00:57:52.844109" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes/route-target-constrain-route=flow1,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:52.844351" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:52.828708" elapsed="0.015702"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.826545" elapsed="0.018001"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.844970" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.844606" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.826526" elapsed="0.018648"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.852311" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.847634" elapsed="0.004739"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.847097" elapsed="0.005326"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.847051" elapsed="0.005429"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.856150" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.852894" elapsed="0.003321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.852564" elapsed="0.003700"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.852540" elapsed="0.003759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.857106" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.856553" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.857605" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.857244" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.858384" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.857963" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.857722" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.857219" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.859313" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.858779" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.859812" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.859473" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.860634" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.860181" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.859926" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.859427" elapsed="0.001325"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.860963" elapsed="0.000522"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:52.862134" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.861723" elapsed="0.000449"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.862395" elapsed="0.002609"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:52.846029" elapsed="0.019045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:52.865266" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:57:52.865157" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.865138" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.865523" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.865595" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:52.867901" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:52.821122" elapsed="0.046807"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.868035" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:52.868209" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:52.613234" elapsed="0.255002"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.868606" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.868344" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.868326" elapsed="0.000374"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.868734" elapsed="0.000026"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:57:52.608735" elapsed="0.260124"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:52.873604" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.869953" elapsed="0.003693"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:52.873871" elapsed="0.003386"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:52.877329" elapsed="0.000041"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:52.869681" elapsed="0.007862"/>
</kw>
<msg time="2026-05-01T00:57:52.877651" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:52.869034" elapsed="0.008652"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.878946" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:52.879054" level="INFO">${len_1} = 124</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:52.878563" elapsed="0.000526"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.879711" level="INFO">Length is 124.</msg>
<msg time="2026-05-01T00:57:52.879818" level="INFO">${len_2} = 124</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:52.879308" elapsed="0.000545"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:52.880074" elapsed="0.000468"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:52.881017" level="INFO">${sum_1} = 2349</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:52.880770" elapsed="0.000283"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:52.881549" level="INFO">${sum_2} = 2349</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:52.881272" elapsed="0.000314"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:52.881804" elapsed="0.000430"/>
</kw>
<arg>${update}</arg>
<arg>${announce_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:52.877987" elapsed="0.004368"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:52.882610" elapsed="0.002058"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.928359" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.927986" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.929121" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:52.928900" elapsed="0.000288">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:52.929319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:52.928567" elapsed="0.000778"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.929910" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:52.929527" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:52.930289" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:52.930434" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:52.930131" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.930881" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.930638" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.932095" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.931777" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.932597" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.932302" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.933406" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.932991" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.934575" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.934061" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.934799" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:52.935026" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.933642" elapsed="0.001411"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.935206" elapsed="0.000429"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:52.932854" elapsed="0.002822"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.936342" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:52.935928" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:52.937491" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.936990" elapsed="0.000584"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:52.937712" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:52.937934" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:52.936574" elapsed="0.001387"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:52.938124" elapsed="0.000423"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:52.935793" elapsed="0.002795"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.932677" elapsed="0.005947"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:52.938668" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:52.938825" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:52.931292" elapsed="0.007559"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.930995" elapsed="0.007888"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.939058" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.938907" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.930976" elapsed="0.008157"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.939862" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.939277" elapsed="0.000615"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:52.939940" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:52.927356" elapsed="0.012745"/>
</kw>
<msg time="2026-05-01T00:57:52.940156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:52.914698" elapsed="0.025505"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.952616" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.964853" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.977326" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.977541" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.977721" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.978115" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.977968" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:52.977953" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.978335" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.978519" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.978688" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:52.977922" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.977795" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.978916" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:52.978991" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:52.979117" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:52.910218" elapsed="0.068926"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.980289" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.980037" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:52.989169" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:52.989234" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:52.989356" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:52.982445" elapsed="0.006946"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.980404" elapsed="0.009042"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.989728" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.989512" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.980385" elapsed="0.009470"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.994543" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.991247" elapsed="0.003356"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.990935" elapsed="0.003716"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.990911" elapsed="0.003776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.998273" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:52.995071" elapsed="0.003247"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.994764" elapsed="0.003589"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.994742" elapsed="0.003636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.998935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:52.998560" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:52.999271" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:52.999032" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:52.999836" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:52.999536" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.999354" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:52.999014" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.000445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.000085" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.000794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.000558" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.001328" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.001036" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.000874" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.000540" elapsed="0.000871"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:53.001583" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:53.002375" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.002104" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.002575" elapsed="0.002404"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:52.990354" elapsed="0.014688"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:53.005135" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:53.007401" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:52.979466" elapsed="0.027962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:53.007503" elapsed="0.000030"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:52.885721" elapsed="0.121909"/>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:52.885228" elapsed="0.122457"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:52.884854" elapsed="0.122889"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:53.011702" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:57:53.008650" elapsed="0.003081"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-01T00:57:53.011888" elapsed="0.002098"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-05-01T00:57:53.014041" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-05-01T00:57:53.008362" elapsed="0.005810"/>
</kw>
<msg time="2026-05-01T00:57:53.014245" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b</msg>
<var>${update}</var>
<arg>3x</arg>
<arg>2s</arg>
<arg>Get_Update_Message</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:53.007909" elapsed="0.006361"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.015129" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:53.015203" level="INFO">${len_1} = 112</msg>
<var>${len_1}</var>
<arg>${hex_1}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:53.014864" elapsed="0.000362"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.015659" level="INFO">Length is 112.</msg>
<msg time="2026-05-01T00:57:53.015732" level="INFO">${len_2} = 112</msg>
<var>${len_2}</var>
<arg>${hex_2}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:53.015383" elapsed="0.000372"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${len_1}</arg>
<arg>${len_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:53.015912" elapsed="0.000301"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:53.016557" level="INFO">${sum_1} = 1902</msg>
<var>${sum_1}</var>
<arg>${hex_1}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:53.016370" elapsed="0.000212"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-05-01T00:57:53.016900" level="INFO">${sum_2} = 1902</msg>
<var>${sum_2}</var>
<arg>${hex_2}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Converts hex message arguments to integers and sums them up and returns the sum.</doc>
<status status="PASS" start="2026-05-01T00:57:53.016734" elapsed="0.000190"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${sum_1}</arg>
<arg>${sum_2}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:53.017077" elapsed="0.000300"/>
</kw>
<arg>${update}</arg>
<arg>${withdraw_hex}</arg>
<doc>Verifies two hex messages are equal even in case, their arguments are misplaced.
Compares length of the hex messages and sums hex messages arguments as integers and compares results.</doc>
<status status="PASS" start="2026-05-01T00:57:53.014498" elapsed="0.002937"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.064223" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.063850" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.065003" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.064766" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:53.065166" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:53.064416" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.065783" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:53.065356" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.066109" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:53.066283" level="INFO">${template} = /rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-con...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:53.065973" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.066724" level="INFO">/rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.066483" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.067754" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.067501" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.068231" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.067961" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.069159" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:53.068632" elapsed="0.000554"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:53.070340" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.069894" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:53.070525" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:53.070750" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:53.069378" elapsed="0.001398"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.070930" elapsed="0.000486"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:53.068492" elapsed="0.002987"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.072239" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:53.071735" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:53.073385" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.072946" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:53.073574" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:57:53.073810" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:53.072474" elapsed="0.001363"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.073992" elapsed="0.000513"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:53.071598" elapsed="0.002950"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:53.068308" elapsed="0.006275"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:53.074628" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:53.074786" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:53.067136" elapsed="0.007676"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.066838" elapsed="0.008005"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.075019" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.074868" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.066818" elapsed="0.008277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.075987" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.075240" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:53.076066" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:53.063192" elapsed="0.012999"/>
</kw>
<msg time="2026-05-01T00:57:53.076244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:53.050571" elapsed="0.025732"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.089027" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.101531" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.113998" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.114199" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.114377" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.114769" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.114617" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:53.114602" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.115003" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.115178" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.115349" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:53.114572" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.114466" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.115655" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.115736" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:53.115875" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:53.046122" elapsed="0.069780"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.117153" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.116894" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:53.124536" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:53.124928" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '431'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Data does not exist",
        "error-path": "/bgp-rib:application-rib[id='10.30.170.185']/tables[afi='bgp-types:ipv4-address-family'][safi='bgp-route-target-constrain:route-target-constrain-subsequent-address-family']/bgp-route-target-constrain:route-target-constrain-routes",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:53.125259" level="INFO">${response} = None</msg>
<msg time="2026-05-01T00:57:53.125383" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.119442" elapsed="0.006814">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:53.117270" elapsed="0.009175">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.126951" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.126563" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:53.117251" elapsed="0.009908">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.133470" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.129810" elapsed="0.003710">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:53.129183" elapsed="0.004427">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:53.129140" elapsed="0.004518">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.137301" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.134074" elapsed="0.003273">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:53.133757" elapsed="0.003679">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:53.133733" elapsed="0.003771">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.138309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.137774" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.138808" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.138466" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.139596" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.139158" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.138924" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.138421" elapsed="0.001291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.140465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.139941" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.140932" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.140602" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.141744" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.141307" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.141046" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.140578" elapsed="0.001283"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:53.142080" elapsed="0.000392"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:53.142965" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.142678" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-05-01T00:57:53.145413" level="FAIL">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</msg>
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.143147" elapsed="0.002321">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.128097" elapsed="0.017509">Several failures occurred:

1) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'

2) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'

3) Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:53.145668" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:53.148018" level="INFO">${response_text} = None</msg>
<msg time="2026-05-01T00:57:53.148048" level="FAIL">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-05-01T00:57:53.116202" elapsed="0.031875">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:53.148143" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.018737" elapsed="0.129575">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.018120" elapsed="0.130256"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-05-01T00:57:53.017679" elapsed="0.130758"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:52.603635" elapsed="0.544871"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:52.513312" elapsed="0.635308"/>
</test>
<test id="s1-s18-t11" name="Play_To_Odl_rt_constrain_type_2" line="97">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:53.152037" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:53.151767" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.153333" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:53.153221" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.153202" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.158325" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:53.158219" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.158202" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.159392" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:53.159015" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.159889" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:53.159596" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:53.159960" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:53.160113" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:53.158639" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.165597" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:53.165488" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.165468" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.166853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:53.166747" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.166728" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:53.167367" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.167069" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:53.167836" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:53.167614" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:53.198817" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:53.168362" elapsed="0.030562"/>
</kw>
<msg time="2026-05-01T00:57:53.199089" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:53.199135" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.168024" elapsed="0.031146"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:53.228558" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:53.199731" elapsed="0.028936"/>
</kw>
<msg time="2026-05-01T00:57:53.228837" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:53.228901" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.199351" elapsed="0.029587"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.229276" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.229021" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.228999" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.229859" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.229542" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.230223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.230002" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.229984" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:53.230335" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:53.233028" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:57:53.233240" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:53.231893" elapsed="0.001484"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.233675" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.234038" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:53.231204" elapsed="0.003022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:53.230646" elapsed="0.003645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:53.166422" elapsed="0.067969"/>
</kw>
<msg time="2026-05-01T00:57:53.234507" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:53.234553" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.165821" elapsed="0.068770"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:53.234802" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:53.234670" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.234650" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.235293" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.235654" elapsed="0.000063"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.235772" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:53.165110" elapsed="0.070785"/>
</kw>
<msg time="2026-05-01T00:57:53.235990" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:53.236034" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "P "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.160529" elapsed="0.075541"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.236426" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.236162" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.236138" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:53.160368" elapsed="0.076178"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:53.160193" elapsed="0.076384"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:53.157864" elapsed="0.078770"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:53.152901" elapsed="0.083789"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:53.152471" elapsed="0.084266"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:53.149512" elapsed="0.087290"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.237999" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/adj-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{adj_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.237508" elapsed="0.000521"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.238756" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.170.157/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.238206" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.239383" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.238974" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.239834" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/announce_rt_constrain_type_2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/announce_rt_constrain_type_2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:53.240015" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:53.239605" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.240396" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/withdraw_rt_constrain_type_2.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/withdraw_rt_constrain_type_2.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:53.240538" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:53.240203" elapsed="0.000361"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:57:53.240719" elapsed="0.004290"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:53.245177" elapsed="0.003201"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.305544" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.305118" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.306400" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.306105" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:53.306663" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:53.305752" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.307323" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:53.306871" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.307692" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:53.307881" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:53.307538" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.308409" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.308107" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.309760" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.309401" elapsed="0.000417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.310322" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.310031" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.311204" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:53.310786" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:53.312529" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.311935" elapsed="0.000702"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:53.312720" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:57:53.313062" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:53.311428" elapsed="0.001661"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.313254" elapsed="0.000418"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:53.310614" elapsed="0.003101"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.316107" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:53.313996" elapsed="0.002143"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:53.317447" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.316879" elapsed="0.000688"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:53.317648" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:53.317962" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:53.316354" elapsed="0.001635"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:53.318149" elapsed="0.000415"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:53.313841" elapsed="0.004766"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:53.310404" elapsed="0.008239"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:53.318689" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:53.318859" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:53.309025" elapsed="0.009861"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.308635" elapsed="0.010284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.319112" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.318946" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.308603" elapsed="0.010589"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.320099" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:53.319364" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:53.320251" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:53.304403" elapsed="0.015995"/>
</kw>
<msg time="2026-05-01T00:57:53.320471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:53.291143" elapsed="0.029426"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.335190" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.348058" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.361281" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.361524" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.361747" elapsed="0.000029"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.362173" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.362015" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:53.361998" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.362404" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.362677" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.362917" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:53.361961" elapsed="0.001015"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.361845" elapsed="0.001160"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.363163" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.363244" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:57:53.363394" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:53.286725" elapsed="0.076698"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.365033" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.364655" elapsed="0.000456">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:53.365208" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:53.364220" elapsed="0.001013"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.365620" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.365318" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.366232" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:53.365906" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.365704" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.365294" elapsed="0.001043"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.369493" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:53.366563" elapsed="0.002967"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:53.369589" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:57:53.369790" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:53.363843" elapsed="0.005979"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:53.371153" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.370897" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:53.371312" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:53.370518" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:53.371573" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:53.371410" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:53.371391" elapsed="0.000270"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.371840" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.372023" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.372090" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:53.374135" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:53.370165" elapsed="0.003998"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.375644" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.375363" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:53.376114" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:53.375863" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:53.384482" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:53.384640" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:57:53.384809" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.378413" elapsed="0.006808">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:53.376248" elapsed="0.009059">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.385522" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.385343" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:53.376229" elapsed="0.009384">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.386036" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.386171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:53.386135" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:53.386119" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.386388" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.386475" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.374503" elapsed="0.012084">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.386675" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.262408" elapsed="0.124372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:53.387093" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:53.386883" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:53.386866" elapsed="0.000356"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:53.387266" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:53.255441" elapsed="0.131929">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.447004" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.446600" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.447845" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.447581" elapsed="0.000411">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.448092" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.447221" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.448726" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.448293" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.449066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:55.449223" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:55.448921" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.449675" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.449413" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.450780" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.450466" elapsed="0.000360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.451264" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.450991" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.452105" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.451695" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.453380" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.452824" elapsed="0.000682"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.453590" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:55.453892" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.452329" elapsed="0.001590"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.454081" elapsed="0.000404"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/adj-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:55.451554" elapsed="0.002975"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.455370" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.454787" elapsed="0.000610"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.456640" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.456058" elapsed="0.000684"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.456820" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:55.457117" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.455605" elapsed="0.001539"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.457302" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:55.454649" elapsed="0.003078"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.451346" elapsed="0.006416"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.457808" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:55.457966" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:55.450125" elapsed="0.007867"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.449801" elapsed="0.008224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.458207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.458052" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.449778" elapsed="0.008656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.459190" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.458599" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.459307" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:55.445949" elapsed="0.013485"/>
</kw>
<msg time="2026-05-01T00:57:55.459506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.431477" elapsed="0.028079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.472067" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.484330" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.496665" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.496869" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.497050" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.497434" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.497283" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:55.497268" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.497679" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.497851" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.498018" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:55.497234" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.497127" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.498246" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.498323" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:55.498469" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.426091" elapsed="0.072407"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.499954" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.499691" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.500123" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.499304" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.500504" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.500219" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.501075" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.500777" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.500588" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.500201" elapsed="0.000958"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.503690" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.501315" elapsed="0.002403"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:55.503772" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:55.503930" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.498964" elapsed="0.004991"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.505208" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.504974" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.505368" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.504635" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:55.505616" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:55.505479" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.505444" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.505850" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.506023" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.506088" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:55.507979" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.504265" elapsed="0.003740"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.509419" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.509170" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.509881" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.509639" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:55.517466" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:55.517872" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '373'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:55.518007" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:55.512048" elapsed="0.005987"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.509991" elapsed="0.008087"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.518267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.518105" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.509972" elapsed="0.008381"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.522372" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.519382" elapsed="0.003060"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.519157" elapsed="0.003360"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.519138" elapsed="0.003416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.526219" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.522964" elapsed="0.003318"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.522637" elapsed="0.003693"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.522612" elapsed="0.003753"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.527189" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.526641" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.527690" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.527328" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.528492" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.528039" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.527805" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.527302" elapsed="0.001311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.529348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.528844" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.529846" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.529513" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.530616" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.530185" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.529958" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.529487" elapsed="0.001246"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.530947" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:55.532091" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.531687" elapsed="0.000440"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.532345" elapsed="0.002644"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:55.518736" elapsed="0.016320"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.535233" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:55.535127" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.535109" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.538279" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.535467" elapsed="0.002841"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:55.538359" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:55.538540" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:55.508320" elapsed="0.030248"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.538680" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:55.538839" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:55.402388" elapsed="0.136477"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.567246" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.566783" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.568104" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.567811" elapsed="0.000422">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.568441" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.567445" elapsed="0.001039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.569103" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.568657" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.569473" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:55.569637" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:55.569299" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.570090" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                    "as-4-specific-common": {
                        "as-number": 65000,
                        "local-administrator": 123
                    }
                },
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "origin-as": 64511,
                "path-id": 0,
                "route-key": "AgIAAP3oAHs="
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.569824" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:55.570640" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.570213" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.571384" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.570876" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.570726" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.570193" elapsed="0.001294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.572129" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.571639" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.572207" elapsed="0.000053"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:55.566151" elapsed="0.006210"/>
</kw>
<msg time="2026-05-01T00:57:55.572476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.553532" elapsed="0.018997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.585013" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.597401" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.610020" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.610222" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.610403" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.610805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.610654" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:55.610639" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.611032" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.611205" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.611376" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:55.610608" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.610498" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.611624" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.611701" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:55.611842" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.550738" elapsed="0.061131"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.612047" elapsed="0.002255"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.615502" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.615061" elapsed="0.000508"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.616147" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.615731" elapsed="0.000444"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:55.616334" elapsed="0.000349"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:55.614645" elapsed="0.002101"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.614384" elapsed="0.002395"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.616958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.616805" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.614365" elapsed="0.002670"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:55.540025" elapsed="0.077057"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:55.539198" elapsed="0.077960"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.538951" elapsed="0.078253"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.538933" elapsed="0.078295"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.617261" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:55.396022" elapsed="0.221369"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:53.248687" elapsed="2.368780"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.670539" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.670122" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.671379" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.671091" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.671573" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.670753" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.672180" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.671767" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.672538" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:55.672722" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:55.672377" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.673153" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.672911" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.674239" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.673928" elapsed="0.000356"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.674825" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.674546" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.675663" level="INFO">${value} = peer=bgp:%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.675228" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.676926" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.676358" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.677111" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:55.677413" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.675885" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.677618" elapsed="0.000388"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.170.157/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:57:55.675085" elapsed="0.002963"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.678719" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.678301" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.679980" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.679382" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.680166" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:55.680475" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.678935" elapsed="0.001567"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.680657" elapsed="0.000368"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:55.678165" elapsed="0.002903"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.674906" elapsed="0.006198"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.681148" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:55.681306" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:55.673602" elapsed="0.007730"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.673277" elapsed="0.008088"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.681561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.681392" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.673253" elapsed="0.008387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.682559" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.681788" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.682640" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:55.669497" elapsed="0.013269"/>
</kw>
<msg time="2026-05-01T00:57:55.682822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.656746" elapsed="0.026126"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.695330" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.707644" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.720107" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.720307" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.720501" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.720871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.720723" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:55.720708" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.721095" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.721265" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.721435" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:55.720679" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.720577" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.721680" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.721755" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:55.721878" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-add...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.651508" elapsed="0.070397"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.723152" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.722916" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.723310" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.722576" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.723672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.723406" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.724242" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.723954" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.723769" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.723387" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.726660" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.724493" elapsed="0.002194"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:55.726738" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:55.726930" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.722235" elapsed="0.004720"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.728204" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.727973" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.728360" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.727620" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:55.728612" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:55.728473" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.728436" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.728849" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.729024" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.729090" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:55.731189" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.727272" elapsed="0.003946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.732683" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.732413" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.733130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.732888" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:55.741086" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:55.741258" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.170.157/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '373'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:55.741422" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:55.735328" elapsed="0.006160"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.733243" elapsed="0.008308"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.741809" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.741589" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.733223" elapsed="0.008706"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.746768" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.743352" elapsed="0.003485"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.743038" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.743013" elapsed="0.003909"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.750561" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.747311" elapsed="0.003315"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.747000" elapsed="0.003730"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.746977" elapsed="0.003790"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.751780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.751014" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.752287" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.751921" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.752884" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.752585" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.752401" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.751895" elapsed="0.001073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.753505" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.753132" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.753841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.753603" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.754381" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.754086" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.753922" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.753586" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.754633" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:55.755479" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.755144" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.755674" elapsed="0.002413"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:55.742438" elapsed="0.015712"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.758325" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:55.758220" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.758202" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.761400" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.758555" elapsed="0.002874"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:55.761501" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:55.761663" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:55.731559" elapsed="0.030135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.761762" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:55.761912" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:55.626256" elapsed="0.135683"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.789851" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.789376" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.790733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.790423" elapsed="0.000433">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.791029" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.790085" elapsed="0.000969"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.791687" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.791222" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.792040" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:55.792193" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:55.791881" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.792663" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                    "as-4-specific-common": {
                        "as-number": 65000,
                        "local-administrator": 123
                    }
                },
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "origin-as": 64511,
                "path-id": 0,
                "route-key": "AgIAAP3oAHs="
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.792380" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:55.793189" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.792780" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.793950" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.170.157/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.793428" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.793276" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.792762" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.794680" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.794185" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.794759" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:55.788759" elapsed="0.006125"/>
</kw>
<msg time="2026-05-01T00:57:55.794942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.776250" elapsed="0.018740"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.808689" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.821137" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.833544" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.833744" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.833923" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.834306" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.834157" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:55.834142" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.834544" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.834718" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.834889" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:55.834112" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.834003" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.835121" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.835197" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:55.835338" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.773599" elapsed="0.061766"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.835589" elapsed="0.002204"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.838972" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.838546" elapsed="0.000454"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.839583" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.839158" elapsed="0.000453"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:55.839770" elapsed="0.000328"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:55.838115" elapsed="0.002043"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.837873" elapsed="0.002318"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.840367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.840216" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.837855" elapsed="0.002589"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:55.763082" elapsed="0.077426"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:55.762266" elapsed="0.078316"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.762023" elapsed="0.078640"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.762006" elapsed="0.078682"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.840723" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:55.621917" elapsed="0.218933"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:55.617648" elapsed="0.223259"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.890250" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.889881" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.891010" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.890791" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.891171" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.890442" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.891785" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.891386" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.892114" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:55.892246" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:55.891978" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.892700" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.892434" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.893732" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.893431" elapsed="0.000347"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.894215" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.893943" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.895032" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.894631" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.896305" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.895755" elapsed="0.000650"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.896498" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:55.896793" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.895277" elapsed="0.001542"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.896975" elapsed="0.000375"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:55.894491" elapsed="0.002902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.898056" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.897662" elapsed="0.000420"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:55.899338" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.898738" elapsed="0.000868"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:55.899684" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:55.899980" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:55.898271" elapsed="0.001735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.900162" elapsed="0.000382"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:55.897524" elapsed="0.003063"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.894295" elapsed="0.006328"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:55.900667" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:55.900826" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:55.893109" elapsed="0.007742"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.892814" elapsed="0.008070"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.901061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.900909" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.892795" elapsed="0.008343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.902049" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.901284" elapsed="0.000794"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.902127" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:55.889250" elapsed="0.013005"/>
</kw>
<msg time="2026-05-01T00:57:55.902310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.876620" elapsed="0.025738"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.914919" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.927342" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.939644" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.939871" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.940059" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.940488" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.940319" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:55.940302" elapsed="0.000341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.940792" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.940964" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.941130" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:55.940264" elapsed="0.000919"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.940138" elapsed="0.001073"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.941361" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.941441" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:57:55.941614" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.872353" elapsed="0.069288"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.943069" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.942752" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.943242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.942342" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.943625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.943340" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.944190" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.943897" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.943707" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.943322" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.946638" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:55.944429" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:55.946717" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:57:55.946875" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.941985" elapsed="0.004915"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:55.948142" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:55.947908" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:55.948298" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:55.947569" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:57:55.948549" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:57:55.948394" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.948376" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.948785" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.948959" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.949064" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:57:55.951198" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:55.947227" elapsed="0.003998"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.952657" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.952384" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.953101" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.952860" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:55.960650" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:55.960795" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '373'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}} 
 </msg>
<msg time="2026-05-01T00:57:55.960911" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:55.955309" elapsed="0.005628"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.953215" elapsed="0.007767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.961170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.961009" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.953196" elapsed="0.008063"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.964749" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.962301" elapsed="0.002497"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.962071" elapsed="0.002763"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.962053" elapsed="0.002806"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.967637" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:55.965140" elapsed="0.002561"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.964914" elapsed="0.002835"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.964898" elapsed="0.002886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.968577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.968021" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.969052" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.968715" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.969830" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.969395" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.969165" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.968689" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.970703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.970174" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:55.971275" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:55.970912" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:55.972051" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:55.971640" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.971388" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.970886" elapsed="0.001335"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.972438" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:55.973610" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:55.973181" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:55.973868" elapsed="0.003242"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:55.961651" elapsed="0.015548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:55.977471" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:55.977304" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.977277" elapsed="0.000297"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:55.981011" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:55.977784" elapsed="0.003256"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:55.981093" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:55.981257" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:55.951564" elapsed="0.029720"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:55.981347" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:57:55.981515" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:55.849699" elapsed="0.131844"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.010048" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.009584" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.010894" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.010608" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:56.011192" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:56.010246" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.011853" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:56.011389" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.012208" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:56.012364" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:56.012049" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.012838" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                    "as-4-specific-common": {
                        "as-number": 65000,
                        "local-administrator": 123
                    }
                },
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "local-pref": {
                        "pref": 100
                    },
                    "origin": {
                        "value": "igp"
                    }
                },
                "origin-as": 64511,
                "path-id": 0,
                "route-key": "AgIAAP3oAHs="
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.012568" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:56.013415" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.012996" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.014173" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.013670" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.013519" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.012976" elapsed="0.001281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.014947" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.014407" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:56.015026" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:56.008952" elapsed="0.006201"/>
</kw>
<msg time="2026-05-01T00:57:56.015212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:55.996120" elapsed="0.019146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.027718" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.040112" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.052611" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.052808" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.052986" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.053373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.053224" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:56.053209" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.053616" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.053787" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.053957" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:56.053177" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.053067" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.054228" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.054307" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:56.054460" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "as-4-route-target-extended-community": {
                  ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:55.993472" elapsed="0.061017"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:56.054671" elapsed="0.002207"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:56.058046" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.057631" elapsed="0.000444"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:56.058646" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "as-4-route-target-extended-community": {
     "as-4-specific-common": {
      "as-number"...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.058231" elapsed="0.000443"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:56.058844" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:56.057204" elapsed="0.002026"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.056960" elapsed="0.002304"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.059441" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.059290" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.056942" elapsed="0.002598"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:55.982687" elapsed="0.076901"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:55.981871" elapsed="0.077792"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:55.981628" elapsed="0.078081"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:55.981610" elapsed="0.078122"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:56.059766" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:55.845349" elapsed="0.214546"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:55.841083" elapsed="0.218871"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:56.060122" elapsed="0.002961"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.115764" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.115366" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.116541" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.116294" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:56.116763" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:56.115961" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.117349" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:56.116957" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.117696" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:56.117837" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:56.117556" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.118269" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.118023" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.119359" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.119068" elapsed="0.000336"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.119863" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.119594" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.120673" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.120253" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:56.121916" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.121346" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:56.122094" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:57:56.122393" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:56.120894" elapsed="0.001526"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.122604" elapsed="0.000383"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:56.120115" elapsed="0.002914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.123698" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.123284" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:56.124923" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.124362" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:56.125101" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:56.125399" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:56.123914" elapsed="0.001511"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.125602" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:56.123143" elapsed="0.002867"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:56.119940" elapsed="0.006105"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:56.126090" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:56.126248" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:56.118742" elapsed="0.007530"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.118387" elapsed="0.007917"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.126524" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.126330" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.118366" elapsed="0.008239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.127511" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.126754" elapsed="0.000787"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:56.127591" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:56.114749" elapsed="0.013008"/>
</kw>
<msg time="2026-05-01T00:57:56.127812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:56.102236" elapsed="0.025624"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.140373" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.152871" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.165193" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.165394" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.165591" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.165966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.165819" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:56.165804" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.166190" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.166358" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.166569" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:56.165772" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.165667" elapsed="0.000984"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.166802" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.166879" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:56.167007" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:56.097863" elapsed="0.069172"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.168376" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.168119" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:56.168556" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:56.167764" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.168901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.168651" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.169482" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.169170" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.168983" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.168633" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.171918" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:56.169723" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:56.171997" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:56.172153" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:56.167412" elapsed="0.004766"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.173359" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:56.173173" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T00:57:56.173510" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:56.172836" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.173739" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:56.173605" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.173587" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.174119" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:56.174258" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:56.173955" elapsed="0.000328"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:56.174717" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.174481" elapsed="0.000262"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:56.174789" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:56.174942" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:56.172508" elapsed="0.002459"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.176381" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.176134" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.176833" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.176595" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:56.185032" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:56.185555" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '549'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}}]} 
 </msg>
<msg time="2026-05-01T00:57:56.185711" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:56.179223" elapsed="0.006515"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.176942" elapsed="0.008839"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.185964" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.185807" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.176924" elapsed="0.009125"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.189514" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false},"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AgIAAP3oAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"as-4-route-target-extended-community":{"as-4-specific-common":{"as-number":65000,"local-administrator":123}}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.187094" elapsed="0.002471"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.186871" elapsed="0.002729"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.186852" elapsed="0.002774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.192691" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.189908" elapsed="0.002846"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.189682" elapsed="0.003120"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.189666" elapsed="0.003171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.193624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.193075" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.194099" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.193761" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.194923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.194505" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.194219" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.193735" elapsed="0.001307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.195799" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.195271" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.196270" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.195936" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.197042" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.196635" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.196383" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.195911" elapsed="0.001247"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:56.197373" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:56.198545" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.198108" elapsed="0.000474"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:56.198802" elapsed="0.003233"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:56.186433" elapsed="0.015690"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.202408" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:56.202226" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.202198" elapsed="0.000332"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:56.205749" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.202743" elapsed="0.003035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:56.205831" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:56.205989" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:56.175281" elapsed="0.030768"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:56.206116" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:56.206284" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:56.072354" elapsed="0.133957"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.234505" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.234011" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.235319" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.235038" elapsed="0.000403">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:56.235639" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:56.234703" elapsed="0.000961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.236272" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:56.235833" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:56.236640" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:56.236781" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:56.236480" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.237239" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:56.236971" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:56.237782" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.237354" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.238571" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:56.238020" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:56.237870" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:56.237335" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.239280" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:56.238805" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:56.239357" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:56.233381" elapsed="0.006125"/>
</kw>
<msg time="2026-05-01T00:57:56.239562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:56.220814" elapsed="0.018797"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.252139" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.264571" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.277003" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.277200" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.277379" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.277772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.277624" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:56.277610" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.277996" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.278176" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.278350" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:56.277580" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.277471" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.278598" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.278676" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:56.278794" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:56.218158" elapsed="0.060663"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:56.279002" elapsed="0.002200"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:56.282264" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.281951" elapsed="0.000341"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:56.283050" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-co...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:56.282466" elapsed="0.000677"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:57:56.283653" level="INFO">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}

!=

{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "bgp-route-target-constrain:route-target-constrain-routes": {
    "route-target-constrain-route": [
     {
      "as-4-route-target-extended-community": {
       "as-4-specific-common": {
        "as-number": 65000,
        "local-administrator": 123
       }
      },
      "attributes": {
       "ipv4-next-hop": {
        "global": "199.20.166.41"
       },
       "local-pref": {
        "pref": 100
       },
       "origin": {
        "value": "igp"
       }
      },
      "origin-as": 64511,
      "path-id": 0,
      "route-key": "AgIAAP3oAHs="
     }
    ]
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
  }
 ]
}</msg>
<msg time="2026-05-01T00:57:56.283843" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.283309" elapsed="0.000602">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.281541" elapsed="0.002517">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:56.281283" elapsed="0.002854">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:56.284329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:56.284172" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-05-01T00:57:56.281264" elapsed="0.003145">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.207475" elapsed="0.077074">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.206661" elapsed="0.078034">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<status status="FAIL" start="2026-05-01T00:57:56.206397" elapsed="0.078416">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</branch>
<status status="FAIL" start="2026-05-01T00:57:56.206379" elapsed="0.078470">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:56.284898" elapsed="0.000016"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:57:56.067668" elapsed="0.217351">Multiline strings are different:
--- first
+++ second
@@ -5,6 +5,32 @@
    "attributes": {
     "uptodate": "*"
    },
+   "bgp-route-target-constrain:route-target-constrain-routes": {
+    "route-target-constrain-route": [
+     {
+      "as-4-route-target-extended-community": {
+       "as-4-specific-common": {
+        "as-number": 65000,
+        "local-administrator": 123
+       }
+      },
+      "attributes": {
+       "ipv4-next-hop": {
+        "global": "199.20.166.41"
+       },
+       "local-pref": {
+        "pref": 100
+       },
+       "origin": {
+        "value": "igp"
+       }
+      },
+      "origin-as": 64511,
+      "path-id": 0,
+      "route-key": "AgIAAP3oAHs="
+     }
+    ]
+   },
    "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
   }
  ]</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.341518" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.341095" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.342340" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:58.342073" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:58.342535" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:58.341731" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.343117" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.342730" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.343474" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:58.343647" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:58.343310" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.344078" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.343836" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.345257" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.344948" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.345767" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.345495" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.346594" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.346165" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.347841" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.347267" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.348023" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:58.348341" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.346812" elapsed="0.001555"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.348548" elapsed="0.000403"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:57:58.346023" elapsed="0.002970"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.349673" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.349247" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.350907" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.350341" elapsed="0.000669"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.351087" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:58.351388" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.349887" elapsed="0.001527"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.351587" elapsed="0.001849"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:58.349110" elapsed="0.004387"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:58.345846" elapsed="0.007691"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:58.353582" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:58.353747" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:58.344532" elapsed="0.009242"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.344203" elapsed="0.009604"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.353989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.353834" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.344178" elapsed="0.009889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.354839" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.354215" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.354916" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.340436" elapsed="0.014605"/>
</kw>
<msg time="2026-05-01T00:57:58.355097" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.327813" elapsed="0.027332"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.367677" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.379994" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.392410" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.392642" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.392821" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.393195" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.393045" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:58.393030" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.393424" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.393613" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.393784" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:58.392999" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.392895" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.394015" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.394091" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:58.394213" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:58.323562" elapsed="0.070677"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.395531" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:58.395257" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:58.395694" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:58.394912" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.396039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.395790" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.396644" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.396316" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.396121" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.395771" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.399039" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.396884" elapsed="0.002182"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:57:58.399117" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:58.399319" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:58.394582" elapsed="0.004764"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.400563" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:57:58.400332" elapsed="0.000286"/>
</kw>
<msg time="2026-05-01T00:57:58.400704" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:58.399996" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.400936" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.400799" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.400780" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.401318" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:58.401478" level="INFO">${volatiles} = uptodate
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:58.401153" elapsed="0.000351"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:57:58.401898" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.401666" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:57:58.401971" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:57:58.402126" level="INFO">${volatiles_list} = ['uptodate', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:57:58.399670" elapsed="0.002481"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.403565" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.403299" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.404006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.403767" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:58.411740" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:58.411883" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '177'} 
 body={"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]} 
 </msg>
<msg time="2026-05-01T00:57:58.411995" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:58.406408" elapsed="0.005613"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.404116" elapsed="0.007949"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.412250" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.412092" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.404098" elapsed="0.008245"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.415833" level="INFO">{"bgp-rib:tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.413407" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.413177" elapsed="0.002739"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.413159" elapsed="0.002782"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.418542" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.416220" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.415996" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.415980" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.419236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.418852" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.419591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.419333" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.420138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.419840" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.419674" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.419315" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.420798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.420389" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.421132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.420893" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.421874" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.421426" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.421213" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.420876" elapsed="0.001112"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.422203" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:58.423330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.422938" elapsed="0.000428"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.423605" elapsed="0.003254"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:58.412752" elapsed="0.014197"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.427194" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.427046" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.427020" elapsed="0.000270"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:58.431227" level="INFO">${text_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.427519" elapsed="0.003748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:57:58.431339" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:57:58.431586" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:57:58.402483" elapsed="0.029140"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.431712" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:57:58.431921" level="INFO">${response_text} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:57:58.301019" elapsed="0.130939"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.463201" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.462691" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.464125" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:58.463801" elapsed="0.000559">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:58.464567" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:58.463416" elapsed="0.001177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.465212" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.464765" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.465591" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/empty_routes/ipv4/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:58.465752" level="INFO">${template} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:58.465407" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.466209" level="INFO">{
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "uptodate": "*"
      }
    }
  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.465940" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:57:58.466805" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.466337" elapsed="0.000531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.467575" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.467048" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.466896" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.466312" elapsed="0.001349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.468330" level="INFO">${final_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.467814" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.468414" elapsed="0.000062"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.461985" elapsed="0.006606"/>
</kw>
<msg time="2026-05-01T00:57:58.468645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.447118" elapsed="0.021579"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.481218" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.493495" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/empty_routes/ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.505975" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.506213" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.506395" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.506801" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.506649" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:58.506635" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.507025" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.507196" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.507371" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:58.506604" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.506491" elapsed="0.000974"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.507620" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.507697" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:58.507818" level="INFO">${expected_text} = {
  "bgp-rib:tables": [
    {
      "afi": "bgp-types:ipv4-address-family",
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family",
      "attributes": {
        "...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:58.444428" elapsed="0.063418"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.508026" elapsed="0.002195"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:58.511292" level="INFO">${expected_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.510981" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:57:58.511768" level="INFO">${actual_normalized} = {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-fami...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.511495" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:57:58.512034" elapsed="0.000356"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:57:58.510562" elapsed="0.001910"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.510302" elapsed="0.002207"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.512688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.512534" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.510284" elapsed="0.002481"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:57:58.433594" elapsed="0.079219"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:57:58.432464" elapsed="0.080426"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.432074" elapsed="0.080863"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.432050" elapsed="0.080910"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.512995" elapsed="0.000028"/>
</return>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:57:58.295304" elapsed="0.217820"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${dir}/empty_routes/${ipv}</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:56.063264" elapsed="2.449959"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient" type="TEARDOWN">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:57:58.513444" elapsed="0.002717"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-05-01T00:57:53.237107" elapsed="5.279140"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:53.149009" elapsed="5.367386"/>
</test>
<test id="s1-s18-t12" name="Kill_Talking_BGP_Speaker" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:58.519691" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:58.519399" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.520975" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.520864" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.520846" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.526590" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.526417" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.526392" elapsed="0.000296"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.528088" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.527556" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.528804" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:58.528370" elapsed="0.000471"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:58.528903" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:57:58.529119" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.527010" elapsed="0.002144"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.536844" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.536693" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.536667" elapsed="0.000274"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.538281" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.538173" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.538155" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:58.538830" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.538528" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.539243" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:58.539022" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.570160" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:58.539789" elapsed="0.030471"/>
</kw>
<msg time="2026-05-01T00:57:58.570430" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:58.570502" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.539436" elapsed="0.031103"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.621554" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:58.571057" elapsed="0.050655"/>
</kw>
<msg time="2026-05-01T00:57:58.621949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:58.622014" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "K "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.570713" elapsed="0.051351"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.622533" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.622177" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.622147" elapsed="0.000562"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.623356" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.622919" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.623912" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.623597" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.623571" elapsed="0.000475"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:58.624093" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:58.627757" elapsed="0.000404"/>
</kw>
<msg time="2026-05-01T00:57:58.628251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.626230" elapsed="0.002204"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.628853" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.629327" elapsed="0.000104"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:58.625271" elapsed="0.004356"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:58.624509" elapsed="0.005210"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:58.537873" elapsed="0.091983"/>
</kw>
<msg time="2026-05-01T00:57:58.629984" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:58.630047" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "K "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.537157" elapsed="0.092943"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:58.630359" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:57:58.630208" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.630182" elapsed="0.000327"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.631076" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.631590" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.631692" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:58.536194" elapsed="0.095650"/>
</kw>
<msg time="2026-05-01T00:57:58.632012" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:58.632082" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "K "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.529691" elapsed="0.102441"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.632611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.632237" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.632213" elapsed="0.000478"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:58.529486" elapsed="0.103228"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:58.529228" elapsed="0.103516"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:58.525912" elapsed="0.106886"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:58.520577" elapsed="0.112277"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.520115" elapsed="0.112784"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:58.517243" elapsed="0.115707"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.634190" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.633876" elapsed="0.000341"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:58.634375" elapsed="0.000240"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:57:58.633604" elapsed="0.001071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.654605" level="INFO">^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:57:58.635179" elapsed="0.019501"/>
</kw>
<msg time="2026-05-01T00:57:58.654789" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:58.654834" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.634843" elapsed="0.020015"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.655553" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:58.667212" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:58.667321" level="INFO">${output_log} = 2026-05-01 00:57:28,287 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:28,287 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:58.655386" elapsed="0.011971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.668517" level="INFO">2026-05-01 00:57:28,287 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:57:28,288 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:57:28,291 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:57:28,291 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:57:28,293 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:57:28,293 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400010084020641040000fbf0
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400010084020641040000fbf0'
2026-05-01 00:57:28,294 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400010084020641040000fbf0
2026-05-01 00:57:28,295 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:28,313 INFO BGP-Thread-1 (job): ... idle for 0.017s
2026-05-01 00:57:28,313 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.017s
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.018s
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.020s
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.021s
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:31,322 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.022s
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:32,324 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:32,324 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.024s
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:33,326 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:33,326 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.025s
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:34,556 INFO BGP-Thread-1 (job): ... idle for 0.228s
2026-05-01 00:57:34,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.253s
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0032' (50)
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:34,711 INFO BGP-Thread-1 (job): ... idle for 0.154s
2026-05-01 00:57:34,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.408s
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'002c' (44)
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:35,713 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.409s
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:36,715 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.410s
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:37,717 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.411s
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:38,719 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:38,719 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.413s
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:39,721 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:39,721 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.414s
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:40,547 INFO BGP-Thread-1 (job): ... idle for 0.826s
2026-05-01 00:57:40,548 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.239s
2026-05-01 00:57:40,548 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:40,549 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:40,549 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:40,699 INFO BGP-Thread-1 (job): ... idle for 0.149s
2026-05-01 00:57:40,699 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.389s
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:41,701 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.390s
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:42,703 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.391s
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:43,705 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.392s
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:44] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.393s
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:45,709 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:45,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.394s
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.395s
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:46,833 INFO BGP-Thread-1 (job): ... idle for 0.121s
2026-05-01 00:57:46,833 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.516s
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:46,971 INFO BGP-Thread-1 (job): ... idle for 0.135s
2026-05-01 00:57:46,971 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.651s
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:47,973 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.653s
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:48,975 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:48,975 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.653s
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.654s
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:49,978 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.655s
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.656s
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:52,853 INFO BGP-Thread-1 (job): ... idle for 0.872s
2026-05-01 00:57:52,854 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.528s
2026-05-01 00:57:52,854 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:52,855 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:52,855 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:52,990 INFO BGP-Thread-1 (job): ... idle for 0.135s
2026-05-01 00:57:52,990 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.663s
2026-05-01 00:57:52,990 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:52,991 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:52,991 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:52,992 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.664s
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:54,994 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.665s
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:55,995 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:57:55,996 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.665s
2026-05-01 00:57:55,996 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:55,997 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:55,997 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:56] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.666s
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:57,999 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.667s
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:58] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.667790" elapsed="0.001639"/>
</kw>
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="PASS" start="2026-05-01T00:57:58.655080" elapsed="0.014520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-05-01T00:57:58.670054" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-05-01T00:57:58.669785" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.669737" elapsed="0.000529"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.670646" elapsed="0.000052"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.671034" elapsed="0.000048"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-05-01T00:57:58.633266" elapsed="0.037948"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.683087" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-05-01T00:57:58.715185" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:57:58.715399" level="INFO">${output_log} = 2026-05-01 00:57:28,287 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:28,287 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:58.682949" elapsed="0.032549"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.716518" level="INFO">2026-05-01 00:57:28,287 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.170.157
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:57:28,287 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:57:28,288 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:57:28,291 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:57:28,291 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   My BGP Identifier: 169781917
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:57:28,292 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:57:28,293 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:57:28,293 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   BGP Identifier=169781917 (0x0a1eaa9d)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400010084020641040000fbf0
2026-05-01 00:57:28,293 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400010084020641040000fbf0'
2026-05-01 00:57:28,294 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eaa9d1802060104000100010206010400010084020641040000fbf0
2026-05-01 00:57:28,295 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:28,296 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:28,313 INFO BGP-Thread-1 (job): ... idle for 0.017s
2026-05-01 00:57:28,313 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.017s
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:28,313 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:57:28,314 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:28,315 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:28,315 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.018s
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:29,317 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): ... idle for 1.002s
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.020s
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:30,319 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.021s
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:31,321 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:31,322 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.022s
2026-05-01 00:57:32,323 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:32,324 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:32,324 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.024s
2026-05-01 00:57:33,325 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:33,326 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:33,326 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.025s
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,327 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:34,556 INFO BGP-Thread-1 (job): ... idle for 0.228s
2026-05-01 00:57:34,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.253s
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0032' (50)
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:34,556 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:34,557 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,557 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:34,711 INFO BGP-Thread-1 (job): ... idle for 0.154s
2026-05-01 00:57:34,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.408s
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:34,711 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'002c' (44)
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:34,712 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:34,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:34] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:35,713 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.409s
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:35,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:36,715 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.410s
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:36,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:37,717 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.411s
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:37,718 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:37] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:38,719 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:38,719 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.413s
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:38,720 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:39,721 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:39,721 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.414s
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:39,722 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:40,547 INFO BGP-Thread-1 (job): ... idle for 0.826s
2026-05-01 00:57:40,548 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.239s
2026-05-01 00:57:40,548 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:40,548 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:40,549 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:40,549 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:40,549 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:40,699 INFO BGP-Thread-1 (job): ... idle for 0.149s
2026-05-01 00:57:40,699 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.389s
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:40,699 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:40,700 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:40,700 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:40] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:41,701 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.390s
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:41,702 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:42,703 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.391s
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:42,704 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:43,705 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.392s
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:43,706 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:44] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.393s
2026-05-01 00:57:44,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:44,708 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:45,709 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:45,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.394s
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:45,710 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.395s
2026-05-01 00:57:46,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,712 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:46,833 INFO BGP-Thread-1 (job): ... idle for 0.121s
2026-05-01 00:57:46,833 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.516s
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:46,834 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:46,835 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,835 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:46,971 INFO BGP-Thread-1 (job): ... idle for 0.135s
2026-05-01 00:57:46,971 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.651s
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:46,971 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:46,972 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:46,972 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:47] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:47,973 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.653s
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:47,974 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:48,975 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:48,975 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.653s
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:48,976 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.654s
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:49,977 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:49,978 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:50] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.655s
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:50,979 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.656s
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:51,981 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:52,853 INFO BGP-Thread-1 (job): ... idle for 0.872s
2026-05-01 00:57:52,854 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.528s
2026-05-01 00:57:52,854 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:52,854 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:52,855 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:52,855 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:52,855 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:52] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:52,990 INFO BGP-Thread-1 (job): ... idle for 0.135s
2026-05-01 00:57:52,990 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.663s
2026-05-01 00:57:52,990 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-05-01 00:57:52,991 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-05-01 00:57:52,991 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:52,991 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:52,992 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:57:53] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.664s
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:53,993 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:54,994 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.665s
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:54,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:55,995 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-05-01 00:57:55,996 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.665s
2026-05-01 00:57:55,996 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:55,997 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:55,997 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:56] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.666s
2026-05-01 00:57:56,998 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:56,999 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:57:57,999 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.667s
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:57:58,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:57:58] "POST /RPC2 HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/home/jenkins/play.py", line 2543, in &lt;module&gt;
    threaded_job(arguments)
  File "/home/jenkins/play.py", line 2537, in threaded_job
    rpcserver.serve_forever()
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
    ready = selector.select(poll_interval)
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
KeyboardInterrupt</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.715917" elapsed="0.001478"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.718673" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/rt_constrain_play.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/rt_constrain_play.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:57:58.717844" elapsed="0.000960"/>
</kw>
<arg>play.py.out</arg>
<arg>rt_constrain_play.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.682610" elapsed="0.036329"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-05-01T00:57:58.516755" elapsed="0.202423"/>
</test>
<test id="s1-s18-t13" name="Delete_Bgp_Peer_Configuration" line="107">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:58.726291" elapsed="0.000323"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:58.725913" elapsed="0.000780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.728146" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.727982" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.727956" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.735178" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.735028" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.735003" elapsed="0.000272"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.736664" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.736181" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.737144" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:58.736853" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:58.737214" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:58.737370" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.735620" elapsed="0.001774"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.742849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.742739" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.742720" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.744102" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.743995" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.743978" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:58.744657" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.744318" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.745058" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:58.744843" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.773680" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:58.745607" elapsed="0.028175"/>
</kw>
<msg time="2026-05-01T00:57:58.773943" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:58.773989" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.745255" elapsed="0.028768"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.805699" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:58.774563" elapsed="0.031249"/>
</kw>
<msg time="2026-05-01T00:57:58.805974" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:58.806027" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.774197" elapsed="0.031866"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.806411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.806177" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.806121" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.806968" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.806668" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.807324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.807106" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.807088" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:58.807434" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:58.810022" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:57:58.810226" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.808901" elapsed="0.001457"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.810659" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.810997" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:58.808270" elapsed="0.002911"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:58.807737" elapsed="0.003507"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:58.743694" elapsed="0.067646"/>
</kw>
<msg time="2026-05-01T00:57:58.811430" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:58.811505" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.743074" elapsed="0.068473"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:58.811736" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:57:58.811628" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.811609" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.812218" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.812574" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.812647" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:58.742388" elapsed="0.070367"/>
</kw>
<msg time="2026-05-01T00:57:58.812849" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:58.812892" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.737788" elapsed="0.075140"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.813257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.813003" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.812986" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:58.737641" elapsed="0.075715"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:58.737463" elapsed="0.075924"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:58.734522" elapsed="0.078919"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:58.727554" elapsed="0.085961"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.726913" elapsed="0.086647"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:58.721022" elapsed="0.092589"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.856264" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.855871" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.857097" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:58.856823" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:58.857271" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:58.856481" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.857865" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.857480" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:58.858197" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/bgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:58.858353" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:58.858058" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.858799" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.858555" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.859859" level="INFO">mapping: {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.859596" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.860339" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.860069" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.861061" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.860751" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.861843" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.861619" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.861922" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:58.862079" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.861279" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.862261" elapsed="0.000257"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:57:58.860610" elapsed="0.001949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.863108" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.862812" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.863896" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.863686" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.863972" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:58.864123" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.863323" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.864306" elapsed="0.000238"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:57:58.862675" elapsed="0.001910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.865130" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.864835" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.865929" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.865721" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.866005" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:57:58.866165" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.865386" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.866347" elapsed="0.000407"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:57:58.864700" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.867344" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.867048" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.868116" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.867909" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.868191" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:58.868341" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.867591" elapsed="0.000774"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.868534" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:57:58.866912" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.869344" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.869045" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.870093" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.869887" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.870168" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:58.870318" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.869572" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.870511" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:58.868910" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.871313" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:58.871020" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:58.872084" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.871876" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:58.872160" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:58.872312" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:58.871559" elapsed="0.000778"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.872504" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:57:58.870886" elapsed="0.001880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:58.860416" elapsed="0.012386"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:58.872845" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:58.873002" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:58.859235" elapsed="0.013794"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.858917" elapsed="0.014144"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.873238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.873087" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.858897" elapsed="0.014419"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.874134" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.873476" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.874212" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.855141" elapsed="0.019195"/>
</kw>
<msg time="2026-05-01T00:57:58.874426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.842266" elapsed="0.032225"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.887039" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.899425" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.911862" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.912059" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.912234" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.912627" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.912467" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:58.912439" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.912848" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.913017" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.913185" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:58.912409" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.912307" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.913417" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.913507" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:57:58.913631" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:58.837995" elapsed="0.075663"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.914757" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.914508" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:58.925071" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:58.925139" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:58.925268" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:58.916970" elapsed="0.008335"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.914921" elapsed="0.010441"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.925647" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.925399" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.914902" elapsed="0.010865"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.930498" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.927170" elapsed="0.003390"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.926857" elapsed="0.003753"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.926833" elapsed="0.003812"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.934260" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:58.931035" elapsed="0.003290"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.930723" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.930700" elapsed="0.003708"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.935189" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.934669" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.935727" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.935366" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.936533" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.936073" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.935840" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.935341" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.937142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.936781" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:58.937489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:58.937238" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.938030" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:58.937737" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:58.937571" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.937221" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:58.938265" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:58.939076" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:58.938797" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.939293" elapsed="0.002464"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:58.926270" elapsed="0.015550"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:58.941867" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:58.944121" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:58.913925" elapsed="0.030223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:58.944238" elapsed="0.000029"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/bgp_peer</arg>
<arg>mapping=${RT_CONSTRAIN_ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:58.813873" elapsed="0.130494"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:57:58.719794" elapsed="0.224706"/>
</test>
<test id="s1-s18-t14" name="Deconfigure_App_Peer" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:57:58.947665" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:57:58.947381" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.948910" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.948802" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.948784" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.953900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.953795" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.953778" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.954959" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:58.954585" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:58.955478" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:58.955147" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:58.955550" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:58.955704" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:58.954194" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.962635" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.962526" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.962506" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:58.964078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:58.963971" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:58.963953" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:58.964611" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:58.964296" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.965013" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:58.964799" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:58.993855" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:58.965561" elapsed="0.028401"/>
</kw>
<msg time="2026-05-01T00:57:58.994132" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:58.994180" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.965201" elapsed="0.029015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.025536" level="INFO">". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:58.994778" elapsed="0.030862"/>
</kw>
<msg time="2026-05-01T00:57:59.025801" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:59.025847" level="INFO">${message_wait} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.994396" elapsed="0.031487"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.026192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.025963" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.025942" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.026785" level="INFO"> ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.026483" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.027172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.026924" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.026906" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:57:59.027284" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:59.029771" elapsed="0.000139"/>
</kw>
<msg time="2026-05-01T00:57:59.029972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.028743" elapsed="0.001363"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.030387" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.030846" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.028104" elapsed="0.002954"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:59.027567" elapsed="0.003564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:58.963668" elapsed="0.067569"/>
</kw>
<msg time="2026-05-01T00:57:59.031329" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:59.031373" level="INFO">${message} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.962861" elapsed="0.068548"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:57:59.031612" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:57:59.031503" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.031485" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.032097" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.032433" elapsed="0.000042"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.032525" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:58.962167" elapsed="0.070466"/>
</kw>
<msg time="2026-05-01T00:57:59.032727" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:59.032772" level="INFO">${output} =  ". "t "x "t ". "0 "8 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n ". "D "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.956091" elapsed="0.076718"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.033135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.032884" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.032867" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:58.955947" elapsed="0.077289"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:58.955779" elapsed="0.077486"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:58.953427" elapsed="0.079891"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:57:58.948517" elapsed="0.084857"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:58.948078" elapsed="0.085340"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:57:58.945215" elapsed="0.088272"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.077599" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.077193" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:57:59.078404" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:57:59.078143" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:57:59.078598" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:57:59.077806" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.079199" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:59.078791" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:57:59.079547" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:57:59.079712" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:57:59.079389" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.080146" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.079902" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.081211" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.080955" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.081711" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.081424" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.082408" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:59.082105" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:59.083203" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.082981" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:59.083281" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:57:59.083464" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:59.082642" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.083650" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:57:59.081966" elapsed="0.001964"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.084491" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:57:59.084182" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:57:59.085233" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.085025" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:57:59.085308" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:59.085474" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:57:59.084707" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.085655" elapsed="0.000386"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:57:59.084047" elapsed="0.002035"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:57:59.081789" elapsed="0.004328"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:57:59.086161" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:57:59.086318" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:57:59.080632" elapsed="0.005711"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.080270" elapsed="0.006153"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.086622" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.086465" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.080245" elapsed="0.006455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.087488" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:59.086847" elapsed="0.000670"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:57:59.087567" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:57:59.076568" elapsed="0.011123"/>
</kw>
<msg time="2026-05-01T00:57:59.087746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.062561" elapsed="0.025232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.100086" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.112335" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.124920" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.125121" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.125299" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.125686" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.125537" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:57:59.125524" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.125907" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.126076" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.126241" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:57:59.125493" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.125370" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.126481" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.126558" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:57:59.126717" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:57:59.058051" elapsed="0.068693"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.127878" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.127631" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:59.141290" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p7ln1o87g2fw8c60oyefgti927.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:59.141362" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:57:59.141534" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:57:59.130034" elapsed="0.011539"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.127991" elapsed="0.013637"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.141880" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.141665" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.127973" elapsed="0.014025"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.146735" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.143420" elapsed="0.003396"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.143108" elapsed="0.003756"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.143083" elapsed="0.003817"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.150737" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.147290" elapsed="0.003545"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.146978" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.146955" elapsed="0.003966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.151719" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:59.151168" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.152191" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.151856" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.152975" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.152560" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.152305" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.151831" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.153851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:59.153320" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.154317" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.153986" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.155125" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.154683" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-05-01T00:57:59.154429" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.153961" elapsed="0.001281"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.155475" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:57:59.156656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:57:59.156239" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.156911" elapsed="0.003235"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:57:59.142521" elapsed="0.017712"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:57:59.160296" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:57:59.163531" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:57:59.127042" elapsed="0.036517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:57:59.163612" elapsed="0.000028"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/app_peer</arg>
<arg>mapping=${RT_CONSTRAIN_APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:57:59.033711" elapsed="0.130025"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:57:58.944708" elapsed="0.219149"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:57:59.164714" elapsed="0.000446"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:59.165397" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:57:59.165319" elapsed="0.000359"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:57:59.164493" elapsed="0.001238"/>
</kw>
<doc>Functional test for bgp - route-target-constrain safi

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distbmution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising rt-constrain routes to odl. For advertising from peer,
play.py is used, sending hex messages to odl.
For advertising to app-peer, we are sending post requests with routes in xml.</doc>
<status status="PASS" start="2026-05-01T00:57:26.268407" elapsed="32.897381"/>
</suite>
<suite id="s1-s19" name="090 Bgp Functional Rt Constrain Validation" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.262130" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:59.257776" elapsed="0.004403"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:57:59.257549" elapsed="0.004696"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.267137" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:59.263364" elapsed="0.003802"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:57:59.267355" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.267247" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.267225" elapsed="0.000197"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.267954" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:59.267600" elapsed="0.000398"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.268492" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:57:59.268169" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:57:59.269029" elapsed="0.000275"/>
</kw>
<msg time="2026-05-01T00:57:59.269401" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:57:59.269462" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.268693" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.270023" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:59.269661" elapsed="0.000388"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.271039" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:59.270780" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.271485" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:59.271219" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.271961" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.271677" elapsed="0.000312"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.275351" elapsed="0.000220"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.276060" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.275737" elapsed="0.000349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.276244" elapsed="0.000243"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.277274" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.276983" elapsed="0.000317"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:57:59.277344" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:57:59.277516" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.276686" elapsed="0.000856"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:57:59.278117" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a194662d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:57:59.277704" elapsed="0.000540"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.278411" elapsed="0.000232"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:57:59.274785" elapsed="0.003917"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:59.274591" elapsed="0.004155"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:57:59.272091" elapsed="0.006685"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.279370" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:59.278946" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.280008" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:59.279611" elapsed="0.000439"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.280618" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:57:59.280219" elapsed="0.000442"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:57:59.270297" elapsed="0.010421"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:57:59.263012" elapsed="0.017762"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.280951" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.280839" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.280821" elapsed="0.000197"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.284171" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:59.283797" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.284669" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:59.284361" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:59.284739" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:57:59.284892" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:59.283464" elapsed="0.001453"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:59.285911" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.285647" elapsed="0.000291"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.286889" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:59.287028" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.286733" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.290943" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.290226" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.290206" elapsed="0.000863"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.291738" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:59.291970" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.291280" elapsed="0.000742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.292974" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.292294" elapsed="0.000795"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.294274" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.293372" elapsed="0.000955"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.296092" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:57:59.296269" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:57:59.295743" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.296674" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.298272" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:57:59.679564" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:04 UTC 2026

  System load:  0.1                Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:57:26 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:57:59.297950" elapsed="0.382272"/>
</kw>
<msg time="2026-05-01T00:57:59.680291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.297499" elapsed="0.382923"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:57:59.294838" elapsed="0.385735"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.681352" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:57:59.694611" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:57:59.694979" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:57:59.695210" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:57:59.680896" elapsed="0.014426"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.696071" elapsed="0.001129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.699941" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.698702" elapsed="0.001474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.701090" elapsed="0.000106"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.700561" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.700509" elapsed="0.000966"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:57:59.702237" elapsed="0.000122"/>
</return>
<status status="PASS" start="2026-05-01T00:57:59.701736" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.701687" elapsed="0.000945"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.702723" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.707641" elapsed="0.000664"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.708724" elapsed="0.000393"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.709557" elapsed="0.000324"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.703387" elapsed="0.006591"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:57:59.289248" elapsed="0.420973"/>
</kw>
<msg time="2026-05-01T00:57:59.710299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.288259" elapsed="0.422113"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:57:59.287765" elapsed="0.422745"/>
</kw>
<msg time="2026-05-01T00:57:59.710570" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.287221" elapsed="0.423413"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.714433" elapsed="0.000325"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.714927" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.715227" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.711049" elapsed="0.004326"/>
</kw>
<msg time="2026-05-01T00:57:59.715498" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:57:59.286161" elapsed="0.429364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.715961" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.715715" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:57:59.716044" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:57:59.285272" elapsed="0.430894"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:59.285093" elapsed="0.431110"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:59.284966" elapsed="0.431273"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:57:59.281247" elapsed="0.435048"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:57:59.716473" elapsed="0.000212"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.730759" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.730649" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.730630" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.731124" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:59.731225" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.730991" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.731684" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.731411" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.732125" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.731886" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:59.732940" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:57:59.732716" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:57:59.733251" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:57:59.733303" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.732330" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.733735" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.733420" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.733398" elapsed="0.000457"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:59.734665" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.734380" elapsed="0.000311"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:57:59.734740" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:57:59.734892" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.734097" elapsed="0.000819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.735080" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.735781" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:57:59.735879" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.735677" elapsed="0.000228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.736061" elapsed="0.002450"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.738952" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:57:59.892834" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.738688" elapsed="0.154238"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.896028" elapsed="0.000331"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.896557" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.896866" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:57:59.893803" elapsed="0.003212"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:57:59.893238" elapsed="0.003824"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:57:59.730358" elapsed="0.166755"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:57:59.717412" elapsed="0.179746"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.717035" elapsed="0.180187"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:59.716888" elapsed="0.180375"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:57:59.716743" elapsed="0.180553"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:57:59.262568" elapsed="0.634786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.900160" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.900047" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.900028" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.905197" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.905063" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.905045" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.906240" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:57:59.905859" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:57:59.906753" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:57:59.906441" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:57:59.906823" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:57:59.906979" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:57:59.905521" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.914055" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.913946" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.913928" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:57:59.915327" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:57:59.915200" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.915182" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:57:59.915892" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:57:59.915573" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.916309" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:57:59.916089" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.952860" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:57:59.917023" elapsed="0.035972"/>
</kw>
<msg time="2026-05-01T00:57:59.953153" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:57:59.953200" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.916525" elapsed="0.036710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:57:59.998755" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "9 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "v "a "l "i "d "a "t "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:57:59.954017" elapsed="0.044898"/>
</kw>
<msg time="2026-05-01T00:57:59.999044" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:57:59.999089" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.953415" elapsed="0.045709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:57:59.999466" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:57:59.999201" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-01T00:57:59.999182" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.000145" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "0 "9 "0 "_ "b "g "[78Cp "[A[78C_
 "f "u "n "c "t "i "o "n "a "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "v "a "l "i "d "a "t "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:57:59.999794" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.000552" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.000297" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.000279" elapsed="0.000489"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:00.000803" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.003014" elapsed="0.000466"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.003831" elapsed="0.000285"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:00.004463" elapsed="0.000235"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:00.002008" elapsed="0.002778"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:00.001102" elapsed="0.003816"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:57:59.914916" elapsed="0.090116"/>
</kw>
<msg time="2026-05-01T00:58:00.005125" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:00.005168" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.914285" elapsed="0.090919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:00.005387" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.005280" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.005262" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.005897" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.006233" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.006304" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:57:59.913654" elapsed="0.092758"/>
</kw>
<msg time="2026-05-01T00:58:00.006616" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:00.006660" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.907379" elapsed="0.099315"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.007028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.006771" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.006754" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:57:59.907229" elapsed="0.099899"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:57:59.907058" elapsed="0.100099"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:57:59.904778" elapsed="0.102431"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:57:59.898027" elapsed="0.109235"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:57:59.897544" elapsed="0.109759"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:57:59.257215" elapsed="0.750138"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.007871" level="INFO">${conn_id} = 7</msg>
<var>${conn_id}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=6s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.007536" elapsed="0.000361"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.008381" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:00.008070" elapsed="0.000352"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.010125" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:58:00.010201" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:58:00.009856" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.010394" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.011955" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:58:00.367660" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:57:04 UTC 2026

  System load:  0.1                Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:57:59 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:58:00.011636" elapsed="0.356145"/>
</kw>
<msg time="2026-05-01T00:58:00.367861" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.011250" elapsed="0.356683"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:58:00.009385" elapsed="0.358650"/>
</kw>
<msg time="2026-05-01T00:58:00.368094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.009000" elapsed="0.359140"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:58:00.008650" elapsed="0.359567"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:00.368801" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19e6ae10&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:58:00.368442" elapsed="0.000543"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.379724" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:58:00.406556" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../../tools/fastbgp/play.py' -&gt; '/home/jenkins//play.py'</msg>
<arg>${PLAY_SCRIPT}</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:00.369164" elapsed="0.037484"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.408854" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-05-01T00:58:00.442073" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:00.442246" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:58:00.442308" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:58:00.442368" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:00.408539" elapsed="0.033861"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.443683" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:58:00.443268" elapsed="0.000479"/>
</kw>
<msg time="2026-05-01T00:58:00.443878" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:58:00.443938" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.442712" elapsed="0.001257"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.444873" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.444240" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.445551" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.445035" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.444999" elapsed="0.000683"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-05-01T00:58:00.445903" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.445762" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.445741" elapsed="0.000292"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.446159" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:00.446110" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:00.446088" elapsed="0.000157"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.446471" elapsed="0.000032"/>
</kw>
<msg time="2026-05-01T00:58:00.446681" level="INFO">${passed} = True</msg>
<var>${passed}</var>
<arg>bash -c 'cd "${target_dir}" &amp;&amp; python -c "import ipaddr"'</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:58:00.407870" elapsed="0.038847"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-05-01T00:58:00.447028" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.446896" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.446871" elapsed="0.000268"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.447355" elapsed="0.000029"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-05-01T00:58:00.407122" elapsed="0.040368"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:57:59.256920" elapsed="1.190650"/>
</kw>
<test id="s1-s19-t1" name="Reconfigure_ODL_To_Accept_Connection" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:00.452653" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:00.452321" elapsed="0.000601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.453958" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:00.453847" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.453829" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.459153" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:00.459045" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.459027" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.460255" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.459859" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.460760" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:00.460465" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:00.460831" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.460985" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:00.459476" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.466625" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:00.466516" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.466497" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.467898" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:00.467791" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.467773" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:00.468443" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.468136" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.468875" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:00.468654" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.497696" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:00.469413" elapsed="0.028401"/>
</kw>
<msg time="2026-05-01T00:58:00.497987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:00.498033" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.469069" elapsed="0.028999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:00.540057" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:00.498877" elapsed="0.041302"/>
</kw>
<msg time="2026-05-01T00:58:00.540342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:00.540388" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.498285" elapsed="0.042140"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.540855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.540605" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.540579" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.541401" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.541091" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.541788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.541564" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.541546" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:00.541902" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:00.544687" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:58:00.544899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.543463" elapsed="0.001571"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.545319" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.545692" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:00.542799" elapsed="0.003081"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:00.542227" elapsed="0.003717"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:00.467489" elapsed="0.078553"/>
</kw>
<msg time="2026-05-01T00:58:00.546135" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:00.546180" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.466851" elapsed="0.079365"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:00.546404" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.546294" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.546276" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.546924" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.547269" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.547340" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:00.466166" elapsed="0.081280"/>
</kw>
<msg time="2026-05-01T00:58:00.547562" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:00.547607" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.461410" elapsed="0.086232"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.547996" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.547719" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.547701" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:00.461255" elapsed="0.086851"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:00.461073" elapsed="0.087068"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:00.458683" elapsed="0.089519"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:00.453558" elapsed="0.094700"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:00.453083" elapsed="0.095221"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:00.448624" elapsed="0.099775"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.549580" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.2 | TYPE=external | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.548859" elapsed="0.000750"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.584280" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.583908" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.585138" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.584843" elapsed="0.000380">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.585319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.584497" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.585917" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.585533" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.586252" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:00.586433" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:00.586114" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.586882" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.586640" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.587917" level="INFO">mapping: {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.587647" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.588392" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.588129" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.589100" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.588802" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.590117" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.589665" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.590195" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:00.590349" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.589319" elapsed="0.001057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.590566" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:58:00.588660" elapsed="0.002195"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.591406" level="INFO">${value} = external</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.591108" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.592419" level="INFO">${encoded} = external</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.591985" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.592513" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.592665" level="INFO">${encoded_value} = external</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.591639" elapsed="0.001050"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.592888" elapsed="0.000224"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-05-01T00:58:00.590968" elapsed="0.002185"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.593891" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.593406" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.594890" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.594432" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.594968" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.595122" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.594106" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.595304" elapsed="0.000256"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:00.593267" elapsed="0.002335"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.596180" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.595873" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.597167" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.596738" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.597245" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.597397" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.596396" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.597595" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:00.595717" elapsed="0.002139"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.598404" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.598111" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.599389" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.598954" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.599500" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:00.599655" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.598632" elapsed="0.001048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.599838" elapsed="0.000232"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:00.597971" elapsed="0.002138"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.600677" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.600363" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.601653" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.601207" elapsed="0.000472"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.601731" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:00.601883" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.600887" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.602065" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:00.600223" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.602887" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.602593" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.603913" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.603427" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.603989" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.604141" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.603099" elapsed="0.001066"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.604360" elapsed="0.000241"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:00.602437" elapsed="0.002205"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:00.588482" elapsed="0.016196"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:00.604722" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:00.604881" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:00.587298" elapsed="0.017610"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.586996" elapsed="0.017944"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.605120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.604965" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.586977" elapsed="0.018220"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.606079" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.605348" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.606159" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:00.583263" elapsed="0.023021"/>
</kw>
<msg time="2026-05-01T00:58:00.606339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.570223" elapsed="0.036164"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.619435" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.632126" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.644886" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.645087" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.645267" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.645655" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.645500" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:00.645485" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.645883" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.646055" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.646265" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:00.645441" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.645339" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.646516" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.646594" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:00.646717" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:00.565839" elapsed="0.080905"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.674357" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.673980" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.675137" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.674914" elapsed="0.000289">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.675296" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.674570" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.675937" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.675513" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.676269" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:00.676418" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:00.676132" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.676866" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="$TYPE-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.676625" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:00.677278" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.676982" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.677824" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.677530" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.677360" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.676964" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.678728" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.678058" elapsed="0.000700"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.678808" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:00.673333" elapsed="0.005600"/>
</kw>
<msg time="2026-05-01T00:58:00.679030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.659668" elapsed="0.019412"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.691982" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.704694" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.717365" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.717579" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.717760" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.718125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.717977" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:00.717963" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.718350" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.718536" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.718711" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:00.717935" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.717833" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.718939" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.719014" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:00.719134" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:00.656973" elapsed="0.062190"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.720442" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.720198" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.720618" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.719856" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.721002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.720749" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.721588" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.721282" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.721085" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.720730" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.724118" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.721831" elapsed="0.002314"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:00.724198" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.724352" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:00.719515" elapsed="0.004862"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.725785" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.725540" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.726226" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.725991" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.726698" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.726437" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.727133" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.726897" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:00.728021" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:00.727825" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:00.728390" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:00.728216" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.728589" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.729198" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.728953" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:00.729283" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.729444" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:00.727383" elapsed="0.002102"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:00.754796" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '291', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="external-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:00.754964" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:58:00 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:00.755254" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:00.731863" elapsed="0.023463"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.729557" elapsed="0.025928"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.756057" elapsed="0.000134"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.755594" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.729540" elapsed="0.026845"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.763658" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.759157" elapsed="0.004554"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.758510" elapsed="0.005238"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.758418" elapsed="0.005356"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.766399" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.764066" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.763833" elapsed="0.002666"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.763817" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.767094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.766709" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.767444" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.767191" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.768024" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.767728" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.767553" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.767173" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.768652" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.768277" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.768991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.768749" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.769546" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.769240" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.769070" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.768731" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.769783" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:00.770598" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.770294" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.770784" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:00.757501" elapsed="0.015720"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:00.773395" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.773288" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.773270" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.773664" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.773731" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:00.776044" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:00.724730" elapsed="0.051341"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.776135" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:00.776290" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:00.554388" elapsed="0.221927"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.776799" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.776440" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.776416" elapsed="0.000564"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.777028" elapsed="0.000037"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:00.549890" elapsed="0.227316"/>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="PASS" start="2026-05-01T00:58:00.548704" elapsed="0.228559"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.778607" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.3 | TYPE=internal | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.777660" elapsed="0.000988"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.815629" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.815222" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.816403" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.816167" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.816588" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.815829" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.817170" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.816784" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.817514" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:00.817668" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:00.817363" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.818102" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.817858" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.819126" level="INFO">mapping: {'IP': '127.0.0.3', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.818870" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.819647" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.819335" elapsed="0.000338"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.820349" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.820051" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.821385" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.820915" elapsed="0.000498"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.821490" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:00.821646" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.820589" elapsed="0.001095"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.821846" elapsed="0.000229"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:58:00.819909" elapsed="0.002206"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.822686" level="INFO">${value} = internal</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.822370" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.823884" level="INFO">${encoded} = internal</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.823408" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.823962" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.824116" level="INFO">${encoded_value} = internal</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.823082" elapsed="0.001059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.824300" elapsed="0.000248"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-05-01T00:58:00.822231" elapsed="0.002359"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.825141" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.824843" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.826139" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.825701" elapsed="0.000465"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.826216" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.826368" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.825355" elapsed="0.001038"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.826592" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:00.824704" elapsed="0.002150"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.827401" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.827108" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.828402" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.827978" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.828495" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.828648" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.827656" elapsed="0.001016"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.828831" elapsed="0.000218"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:00.826968" elapsed="0.002120"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.829652" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.829340" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.830646" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.830193" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.830722" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.830872" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.829865" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.831053" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:00.829201" elapsed="0.002114"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.831969" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.831671" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.832951" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.832517" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.833027" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.833178" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.832181" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.833359" elapsed="0.000243"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:00.831529" elapsed="0.002114"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.834197" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:00.833899" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:00.835422" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.834799" elapsed="0.000686"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:00.835538" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:00.835694" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:00.834473" elapsed="0.001245"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.835876" elapsed="0.000219"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:00.833758" elapsed="0.002378"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:00.819727" elapsed="0.016444"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:00.836215" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:00.836374" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:00.818542" elapsed="0.017859"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.818217" elapsed="0.018215"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.836630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.836473" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.818197" elapsed="0.018508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.837539" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.836852" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.837617" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:00.814595" elapsed="0.023146"/>
</kw>
<msg time="2026-05-01T00:58:00.837796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.800676" elapsed="0.037168"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.850715" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.863359" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.875957" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.876158" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.876336" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.876721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.876570" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:00.876556" elapsed="0.000279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.876983" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.877155" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.877326" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:00.876525" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.876408" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.877576" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.877653" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:00.877774" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:00.796339" elapsed="0.081463"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.904526" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.904138" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.905260" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.905055" elapsed="0.000268">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.905416" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.904721" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.906012" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.905632" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.906336" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:00.906476" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:00.906204" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.906908" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="$TYPE-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.906668" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:00.907333" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.907023" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.907876" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.907583" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.907414" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.907005" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.908954" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.908109" elapsed="0.000875"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.909066" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:00.903522" elapsed="0.005675"/>
</kw>
<msg time="2026-05-01T00:58:00.909249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.890669" elapsed="0.018627"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.923750" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.936386" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.949098" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.949299" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.949497" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.949871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.949721" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:00.949707" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.950099" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.950373" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.950584" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:00.949678" elapsed="0.000961"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.949573" elapsed="0.001092"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.950819" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.950895" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:00.951018" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:00.887976" elapsed="0.063071"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:00.952473" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:00.952212" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:00.952632" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:00.951865" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.952979" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.952727" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.953555" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.953242" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.953060" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.952709" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.956044" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:00.953798" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:00.956123" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:00.956277" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:00.951491" elapsed="0.004811"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.957801" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.957468" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.958244" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.958009" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.958717" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.958473" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.959152" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.958917" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:00.960028" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:00.959836" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:00.960383" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:00.960213" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.960579" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.961215" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.960937" elapsed="0.000322"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:00.961302" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:00.961472" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:00.959412" elapsed="0.002086"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:00.973802" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Content-Length': '291', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:00.973926" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:00.974231" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:00.963904" elapsed="0.010386"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.961570" elapsed="0.012823"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.974861" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.974494" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.961552" elapsed="0.013508"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.982682" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.977250" elapsed="0.005529"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.976743" elapsed="0.006114"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.976703" elapsed="0.006210"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.985945" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:00.983610" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.983036" elapsed="0.002989"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.983000" elapsed="0.003049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.986615" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.986224" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.986961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.986714" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.987546" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.987228" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.987043" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.986696" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.988160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.987803" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.988516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.988256" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.989061" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:00.988770" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:00.988598" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.988239" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:00.989299" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:00.990110" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:00.989834" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.990295" elapsed="0.002361"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:00.975920" elapsed="0.016798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:00.992890" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:00.992785" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.992766" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.993133" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:00.993201" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:00.995554" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:00.956659" elapsed="0.038922"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.995646" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:00.995799" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:00.785095" elapsed="0.210728"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:00.996201" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:00.995960" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:00.995942" elapsed="0.000350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:00.996326" elapsed="0.000027"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:00.779038" elapsed="0.217425"/>
</kw>
<var name="${i}">3</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-05-01T00:58:00.777425" elapsed="0.219079"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:00.997418" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.4 | TYPE=internal | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:00.996764" elapsed="0.000696"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.031990" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.031612" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.032764" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.032546" elapsed="0.000284">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.032924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.032189" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.033520" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.033121" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.033849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:01.033983" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:01.033715" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.034413" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.034174" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.035485" level="INFO">mapping: {'IP': '127.0.0.4', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.035201" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.035961" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.035699" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.036678" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.036362" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.037707" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.037218" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.037786" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:01.037941" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.036894" elapsed="0.001071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.038127" elapsed="0.000226"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:58:01.036221" elapsed="0.002215"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.039014" level="INFO">${value} = internal</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.038715" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.040176" level="INFO">${encoded} = internal</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.039734" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.040253" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:01.040415" level="INFO">${encoded_value} = internal</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.039245" elapsed="0.001195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.040615" elapsed="0.000221"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-05-01T00:58:01.038573" elapsed="0.002302"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.041427" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.041129" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.042570" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.042106" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.042647" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:01.042799" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.041784" elapsed="0.001040"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.042983" elapsed="0.000245"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:01.040990" elapsed="0.002278"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.043839" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.043540" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.044820" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.044375" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.044897" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:01.045048" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.044054" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.045229" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:01.043382" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.046053" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.045758" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.047145" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.046685" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.047222" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:01.047374" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.046289" elapsed="0.001109"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.047578" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:01.045617" elapsed="0.002222"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.048384" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.048091" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.049370" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.048932" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.049459" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:01.049614" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.048613" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.049795" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:01.047952" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.050719" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.050358" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.052009" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.051292" elapsed="0.000744"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.052088" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:01.052242" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.050934" elapsed="0.001333"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.052424" elapsed="0.000242"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:01.050218" elapsed="0.002488"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:01.036040" elapsed="0.016701"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:01.052785" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:01.052943" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:01.034846" elapsed="0.018123"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.034546" elapsed="0.018455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.053181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.053025" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.034526" elapsed="0.018731"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.054089" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.053406" elapsed="0.000712"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:01.054168" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:01.030923" elapsed="0.023370"/>
</kw>
<msg time="2026-05-01T00:58:01.054348" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.017944" elapsed="0.036455"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.067401" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.080025" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.092688" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.092888" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.093110" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.093519" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.093333" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:01.093319" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.093750" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.093924" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.094094" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:01.093289" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.093185" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.094324" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.094400" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:01.094540" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:01.013559" elapsed="0.081008"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.121471" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.121082" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.122225" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.122005" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.122384" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.121668" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.122990" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.122593" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.123320" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:01.123468" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/p...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:01.123185" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.123900" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="$TYPE-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.123661" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:01.124308" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.124014" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.124854" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.124560" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.124389" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.123996" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.125802" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.125135" elapsed="0.000697"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:01.125881" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:01.120445" elapsed="0.005564"/>
</kw>
<msg time="2026-05-01T00:58:01.126062" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.107535" elapsed="0.018574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.139021" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.151916" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.164981" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.165202" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.165388" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.165821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.165664" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:01.165646" elapsed="0.000258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.166054" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.166229" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.166401" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:01.165608" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.165483" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.166656" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.166735" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:58:01.166897" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-gr...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:01.104835" elapsed="0.062093"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.168428" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.168159" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.168614" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.167771" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.168980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.168710" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.169573" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.169262" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.169061" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.168691" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.172066" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.169814" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:01.172144" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:01.172300" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:01.167390" elapsed="0.004935"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.173755" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.173501" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.174198" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.173961" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.174662" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.174404" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.175115" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.174876" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:01.175990" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:01.175789" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:01.176348" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:01.176176" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.176559" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.177216" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.176972" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:01.177302" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:01.177472" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:01.175364" elapsed="0.002135"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:01.188919" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Content-Length': '291', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbor"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:01.189033" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:01.189134" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:01.179902" elapsed="0.009258"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.177572" elapsed="0.011636"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.189408" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.189237" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.177554" elapsed="0.011968"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.195357" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.190536" elapsed="0.004958"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.190289" elapsed="0.005290"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.190270" elapsed="0.005369"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.202255" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.196314" elapsed="0.006051"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.195774" elapsed="0.006705"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.195735" elapsed="0.006806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.203670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.203059" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.204022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.203769" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.204594" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.204279" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.204103" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.203750" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.205207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.204851" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.205568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.205302" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.206113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.205821" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.205649" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.205285" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.206360" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:01.207220" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.206914" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.207411" elapsed="0.002462"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:01.189920" elapsed="0.020026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:01.210134" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-05-01T00:58:01.210020" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.210000" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.210397" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.210482" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:01.212871" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:01.172682" elapsed="0.040216"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:01.213038" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:01.213205" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:01.002268" elapsed="0.210963"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.213621" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.213332" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.213315" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:01.213749" elapsed="0.000027"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:00.997740" elapsed="0.216136"/>
</kw>
<var name="${i}">4</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-05-01T00:58:00.996615" elapsed="0.217302"/>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="PASS" start="2026-05-01T00:58:00.548485" elapsed="0.665477"/>
</for>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-05-01T00:58:00.447658" elapsed="0.766434"/>
</test>
<test id="s1-s19-t2" name="Start_Bgp_Peers" line="72">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:01.217997" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:01.217727" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.219346" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.219236" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.219218" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.224629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.224521" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.224503" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.225729" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.225317" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.226214" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:01.225922" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:01.226284" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:01.226444" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:01.224936" elapsed="0.001550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.232144" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.232034" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.232015" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.233439" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.233317" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.233299" elapsed="0.000258"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:01.234015" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.233713" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.234433" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:01.234211" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.263596" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:01.235016" elapsed="0.028754"/>
</kw>
<msg time="2026-05-01T00:58:01.263977" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:01.264025" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.234646" elapsed="0.029416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.295687" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:01.264834" elapsed="0.030973"/>
</kw>
<msg time="2026-05-01T00:58:01.295976" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:01.296024" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.264381" elapsed="0.031680"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.296426" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.296158" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.296129" elapsed="0.000409"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.297014" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "S "t "a "r "t "_ "B "g "p "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.296695" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.297382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.297158" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.297140" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:01.297517" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:01.300290" elapsed="0.000156"/>
</kw>
<msg time="2026-05-01T00:58:01.300528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.299138" elapsed="0.001527"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.300950" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.301298" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:01.298438" elapsed="0.003069"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:01.297864" elapsed="0.003710"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:01.233015" elapsed="0.068659"/>
</kw>
<msg time="2026-05-01T00:58:01.301767" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:01.301811" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.232371" elapsed="0.069477"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:01.302031" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:01.301925" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.301906" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.302570" elapsed="0.000055"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.302953" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.303026" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:01.231695" elapsed="0.071442"/>
</kw>
<msg time="2026-05-01T00:58:01.303229" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:01.303274" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.226913" elapsed="0.076399"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.303668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.303388" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.303371" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:01.226760" elapsed="0.077048"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:01.226547" elapsed="0.077296"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:01.224145" elapsed="0.079756"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:01.218940" elapsed="0.085017"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.218436" elapsed="0.085565"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:01.215327" elapsed="0.088728"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.304818" level="INFO">IP: 127.0.0.2</msg>
<msg time="2026-05-01T00:58:01.304890" level="INFO">as_number: 65000</msg>
<arg>IP: ${ODL_${i}_IP}</arg>
<arg>as_number: ${as_number}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.304504" elapsed="0.000424"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.306084" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.305611" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.306548" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.306279" elapsed="0.000334"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.310804" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<msg time="2026-05-01T00:58:01.310904" level="INFO">${output} =  python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.185 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:01.306774" elapsed="0.004159"/>
</kw>
<arg>${ODL_${i}_IP}</arg>
<arg>${as_number}</arg>
<arg>800${i}</arg>
<arg>play.py.090.${i}</arg>
<doc>Starts bgp peer.</doc>
<status status="PASS" start="2026-05-01T00:58:01.305083" elapsed="0.005915"/>
</kw>
<var name="${i}">2</var>
<var name="${as_number}">65000</var>
<status status="PASS" start="2026-05-01T00:58:01.304341" elapsed="0.006696"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.311606" level="INFO">IP: 127.0.0.3</msg>
<msg time="2026-05-01T00:58:01.311677" level="INFO">as_number: 64496</msg>
<arg>IP: ${ODL_${i}_IP}</arg>
<arg>as_number: ${as_number}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.311298" elapsed="0.000416"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.312850" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.312337" elapsed="0.000543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.313286" level="INFO">python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.313046" elapsed="0.000287"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.314283" level="INFO">[?2004l[1] 5894</msg>
<msg time="2026-05-01T00:58:01.314376" level="INFO">${output} = [?2004l[1] 5894
</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:01.313517" elapsed="0.000885"/>
</kw>
<arg>${ODL_${i}_IP}</arg>
<arg>${as_number}</arg>
<arg>800${i}</arg>
<arg>play.py.090.${i}</arg>
<doc>Starts bgp peer.</doc>
<status status="PASS" start="2026-05-01T00:58:01.311852" elapsed="0.002635"/>
</kw>
<var name="${i}">3</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-05-01T00:58:01.311148" elapsed="0.003379"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.315098" level="INFO">IP: 127.0.0.4</msg>
<msg time="2026-05-01T00:58:01.315168" level="INFO">as_number: 64496</msg>
<arg>IP: ${ODL_${i}_IP}</arg>
<arg>as_number: ${as_number}</arg>
<doc>Logs the given messages as separate entries using the INFO level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.314813" elapsed="0.000392"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.316402" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8004 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.4 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.315905" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.316879" level="INFO">python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8004 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.4 &amp;</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.316621" elapsed="0.000306"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.319970" level="INFO">[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<msg time="2026-05-01T00:58:01.320070" level="INFO">${output} = [?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.185 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --a...</msg>
<var>${output}</var>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:01.317139" elapsed="0.002959"/>
</kw>
<arg>${ODL_${i}_IP}</arg>
<arg>${as_number}</arg>
<arg>800${i}</arg>
<arg>play.py.090.${i}</arg>
<doc>Starts bgp peer.</doc>
<status status="PASS" start="2026-05-01T00:58:01.315342" elapsed="0.004818"/>
</kw>
<var name="${i}">4</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-05-01T00:58:01.314665" elapsed="0.005534"/>
</iter>
<var>${i}</var>
<var>${as_number}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_AS_NUMBERS}</value>
<status status="PASS" start="2026-05-01T00:58:01.304125" elapsed="0.016110"/>
</for>
<doc>Start Python speaker to connect to ODL. We give each speaker time until odl really starts to accept incoming
bgp connection. The failure happens if the incoming connection comes too quickly after configuring the peer.</doc>
<tag>local_run</tag>
<status status="PASS" start="2026-05-01T00:58:01.214443" elapsed="0.105910"/>
</test>
<test id="s1-s19-t3" name="Play_To_Odl_ext_l3vpn_rt_arg" line="82">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:01.324614" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:01.324322" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.325927" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.325815" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.325795" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.331330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.331221" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.331203" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.332644" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.332230" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.333132" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:01.332840" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:01.333203" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:01.333361" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:01.331655" elapsed="0.001731"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.338973" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.338864" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.338845" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.340186" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.340080" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.340062" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:01.340739" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.340407" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.341143" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:01.340929" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.372942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:01.341694" elapsed="0.031352"/>
</kw>
<msg time="2026-05-01T00:58:01.373209" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:01.373256" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.341336" elapsed="0.031957"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:01.426558" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "e "x "t "_ "l "3 "v "p "n "_ "r "t "_ "a "r "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:01.373848" elapsed="0.052879"/>
</kw>
<msg time="2026-05-01T00:58:01.426894" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:01.426940" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.373501" elapsed="0.053478"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.427318" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.427064" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.427040" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.427884" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "e "x "t "_ "l "3 "v "p "n "_ "r "t "_ "a "r "g "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.427577" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.428281" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.428033" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.428015" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:01.428399" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:01.431089" elapsed="0.000145"/>
</kw>
<msg time="2026-05-01T00:58:01.431297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.429947" elapsed="0.001492"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.431765" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.432181" elapsed="0.000090"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:01.429273" elapsed="0.003147"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:01.428716" elapsed="0.003799"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:01.339781" elapsed="0.092835"/>
</kw>
<msg time="2026-05-01T00:58:01.432710" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:01.432753" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.339198" elapsed="0.093593"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:01.432979" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:01.432869" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.432850" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.433503" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.433854" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.433926" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:01.338506" elapsed="0.095530"/>
</kw>
<msg time="2026-05-01T00:58:01.434130" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:01.434173" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.333777" elapsed="0.100433"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.434638" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.434286" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.434269" elapsed="0.000452"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:01.333629" elapsed="0.101115"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:01.333438" elapsed="0.101334"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:01.330859" elapsed="0.103970"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:01.325519" elapsed="0.109414"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:01.325061" elapsed="0.109918"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:01.321682" elapsed="0.113350"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.446745" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/announce_ext_l3vpn_rt_arg.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/announce_ext_l3vpn_rt_arg.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:01.446930" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:01.446532" elapsed="0.000424"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient2">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:01.447117" elapsed="0.003360"/>
</kw>
<arg>ext_l3vpn_rt_arg</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/announce_${totest}.hex and send it to odl.</doc>
<status status="PASS" start="2026-05-01T00:58:01.446080" elapsed="0.004463"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.451195" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F127.0.0.2/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${ODL_2_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.450720" elapsed="0.000503"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.501764" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.501366" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.502846" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.502567" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.503020" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.501984" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.503617" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.503216" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.503946" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:01.504093" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:01.503810" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.504537" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.504281" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.505559" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.505283" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.506028" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.505768" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.506811" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.506468" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.507752" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.507375" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.507829" elapsed="0.000079"/>
</return>
<msg time="2026-05-01T00:58:01.508041" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.507028" elapsed="0.001038"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.508230" elapsed="0.000318"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.2/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:58:01.506308" elapsed="0.002281"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.509163" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:01.508847" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:01.511659" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.511303" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:01.511737" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:01.511891" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:01.509375" elapsed="0.002541"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:01.512075" elapsed="0.000271"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:01.508706" elapsed="0.003681"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:01.506106" elapsed="0.006321"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:01.512494" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:01.512655" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:01.504956" elapsed="0.007724"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.504654" elapsed="0.008057"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.512894" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.512736" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.504632" elapsed="0.008338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.513728" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:01.513119" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:01.513805" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:01.500744" elapsed="0.013184"/>
</kw>
<msg time="2026-05-01T00:58:01.513982" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:01.487772" elapsed="0.026256"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.526841" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.539908" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.552835" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.553207" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.553410" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.553891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.553724" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:01.553703" elapsed="0.000277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.554137" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.554345" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.554534" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:01.553652" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.553513" elapsed="0.001106"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.554778" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.554862" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:58:01.555045" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:01.483408" elapsed="0.071668"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.556626" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.556273" elapsed="0.000436">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.556806" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.555821" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.557182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.556904" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.557784" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:01.557484" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:01.557263" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.556885" elapsed="0.000982"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.560537" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:01.558026" elapsed="0.002538"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:01.560617" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:01.560775" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:01.555417" elapsed="0.005383"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:01.562042" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.561802" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:01.562216" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:01.561443" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:01.562463" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:01.562313" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:01.562295" elapsed="0.000295"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.562745" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.562925" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.562992" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:01.564972" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:01.561114" elapsed="0.003885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.566470" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.566194" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:01.566927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:01.566681" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:01.574329" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:01.574509" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:01.574635" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.569152" elapsed="0.005904">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:01.567037" elapsed="0.008109">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.575341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.575180" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:01.567019" elapsed="0.008410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.575848" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.575981" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:01.575943" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:01.575927" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.576200" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.576270" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.565317" elapsed="0.011065">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.576480" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.460404" elapsed="0.116229">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:01.576919" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:01.576732" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:01.576715" elapsed="0.000301"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:01.577050" elapsed="0.000014"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.455795" elapsed="0.121354">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.638767" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:03.638335" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:03.639699" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.639379" elapsed="0.000401">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:03.639877" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:03.639024" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.640484" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:03.640076" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:03.640828" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:03.640992" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:03.640683" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.641430" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:03.641183" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.642543" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:03.642269" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.643043" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:03.642755" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.643819" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:03.643442" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:03.644777" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:03.644396" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:03.644859" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:58:03.645025" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:03.644040" elapsed="0.001010"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:03.645281" elapsed="0.000333"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.2/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:58:03.643299" elapsed="0.002357"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.646439" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:03.645913" elapsed="0.000570"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:03.647471" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:03.647103" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:03.647551" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:03.647705" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:03.646681" elapsed="0.001049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:03.647901" elapsed="0.000295"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:03.645773" elapsed="0.002466"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:03.643122" elapsed="0.005152"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:03.648318" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:03.648543" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:03.641931" elapsed="0.006651"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:03.641575" elapsed="0.007053"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.648897" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:03.648666" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:03.641551" elapsed="0.007439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.649893" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:03.649148" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:03.649977" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:03.637676" elapsed="0.012452"/>
</kw>
<msg time="2026-05-01T00:58:03.650208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:03.624516" elapsed="0.025754"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.664541" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.681509" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.696807" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.697209" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.697512" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.698073" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:03.697855" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:03.697834" elapsed="0.000348"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.698400" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.698666" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.698965" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:03.697785" elapsed="0.001264"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.697618" elapsed="0.001462"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.699248" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.699329" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:58:03.699539" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:03.619900" elapsed="0.079670"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:03.701232" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.700859" elapsed="0.000460">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:03.701417" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:03.700364" elapsed="0.001079"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.701885" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:03.701563" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.702494" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:03.702176" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:03.701973" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:03.701537" elapsed="0.001044"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.705706" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:03.702743" elapsed="0.003000"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:03.705811" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:58:03.705991" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:03.699933" elapsed="0.006084"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:03.707410" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.707149" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:03.707599" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:03.706743" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:03.707853" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:03.707699" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:03.707679" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.708166" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.708392" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.708499" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:58:03.710882" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:03.706372" elapsed="0.004550"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.712616" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:03.712301" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:03.713185" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:03.712861" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:03.721922" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:03.722083" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:03.722221" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.716096" elapsed="0.006588">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:03.713311" elapsed="0.009525">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.723165" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:03.722901" elapsed="0.000365"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:03.713288" elapsed="0.010009">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.723915" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.724106" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:03.724050" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:03.724023" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.724430" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.724565" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.711292" elapsed="0.013430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.724825" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.595057" elapsed="0.129983">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:03.725421" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:03.725169" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:03.725147" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:03.725611" elapsed="0.000017"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:03.588009" elapsed="0.137707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.782932" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:05.782536" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:05.783767" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.783504" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:05.783941" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:05.783148" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.784565" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:05.784138" elapsed="0.000456"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:05.784906" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:05.785067" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:05.784763" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.785513" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:05.785254" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.786547" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:05.786274" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.787031" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.786760" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.787808" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:05.787425" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:05.788782" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.788409" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:05.788863" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:05.789024" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:05.788031" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.789288" elapsed="0.000317"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.2/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:58:05.787284" elapsed="0.002363"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.790390" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:05.789903" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:05.791313" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.790977" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:05.791391" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:05.791558" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:05.790632" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.791744" elapsed="0.000269"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:05.789763" elapsed="0.002292"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:05.787108" elapsed="0.004982"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:05.792133" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:58:05.792306" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:05.785943" elapsed="0.006389"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:05.785638" elapsed="0.006726"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.792560" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.792390" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.785615" elapsed="0.007023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.793372" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:05.792787" elapsed="0.000613"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:05.793467" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:05.781895" elapsed="0.011707"/>
</kw>
<msg time="2026-05-01T00:58:05.793658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:05.768913" elapsed="0.024792"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.806406" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.819072" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.831683" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.831927" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.832132" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.832526" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.832358" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:05.832344" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.832757" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.832930" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.833102" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:05.832314" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.832210" elapsed="0.000971"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.833334" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.833409" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:05.833549" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vp...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:05.764568" elapsed="0.069008"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:05.834856" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.834607" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:05.835018" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:05.834237" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.835368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.835114" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.835961" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:05.835668" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:05.835464" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.835095" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.838627" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:05.836218" elapsed="0.002436"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:05.838706" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:05.838862" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:05.833906" elapsed="0.004981"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:05.840144" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.839887" elapsed="0.000322">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:05.840302" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:05.839544" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:05.840550" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:05.840397" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.840379" elapsed="0.000295"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.840898" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.841073" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.841138" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:05.843101" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:05.839197" elapsed="0.003931"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.844560" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:05.844295" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.845005" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:05.844764" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:05.852584" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:05.852729" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:05.852829" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.847230" elapsed="0.005974">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:05.845114" elapsed="0.008173">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.853499" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.853321" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:05.845096" elapsed="0.008497">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.853973" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.854103" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:05.854066" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:05.854050" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.854316" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.854385" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.843440" elapsed="0.011065">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.854581" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.741276" elapsed="0.113434">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.854989" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.854806" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:05.854789" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.855118" elapsed="0.000014"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.736689" elapsed="0.118524">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<msg time="2026-05-01T00:58:05.855314" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.451401" elapsed="4.404009">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<doc>This TC sends route-target route containing route-target argument from node 1 to odl
so odl can identify this peer as appropriate for advertizement when it recieves such route.</doc>
<status status="FAIL" start="2026-05-01T00:58:01.320717" elapsed="4.534886">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.2/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</test>
<test id="s1-s19-t4" name="Play_To_Odl_rt_constrain_type_0" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:05.860559" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:05.860156" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.862343" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:05.862190" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.862164" elapsed="0.000275"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.869345" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:05.869237" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.869219" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.870443" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:05.870061" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.870944" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:05.870651" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:05.871014" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:05.871171" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:05.869677" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.876773" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:05.876664" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.876645" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.878024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:05.877917" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.877900" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:05.878613" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.878289" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:05.879033" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:05.878809" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:05.909921" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:05.879589" elapsed="0.030439"/>
</kw>
<msg time="2026-05-01T00:58:05.910193" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:05.910239" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:05.879225" elapsed="0.031052"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:05.952125" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "[78C0 "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:05.910836" elapsed="0.041415"/>
</kw>
<msg time="2026-05-01T00:58:05.952415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:05.952481" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:05.910479" elapsed="0.042041"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.952851" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.952606" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.952584" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.953395" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "[78C0 "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:05.953087" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.953783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.953561" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.953543" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:05.953895" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:05.956855" elapsed="0.000188"/>
</kw>
<msg time="2026-05-01T00:58:05.957124" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:05.955477" elapsed="0.001818"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.957685" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.958238" elapsed="0.000102"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:05.954827" elapsed="0.003685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:05.954214" elapsed="0.004396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:05.877617" elapsed="0.081126"/>
</kw>
<msg time="2026-05-01T00:58:05.958874" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:05.958937" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:05.876999" elapsed="0.081992"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:05.959241" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:58:05.959097" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.959071" elapsed="0.000293"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.959919" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.960501" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:05.960595" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:05.876314" elapsed="0.084425"/>
</kw>
<msg time="2026-05-01T00:58:05.960867" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:05.960924" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:05.871596" elapsed="0.089376"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:05.961416" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:05.961074" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:05.961051" elapsed="0.000504"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:05.871426" elapsed="0.090167"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:05.871251" elapsed="0.090388"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:05.868871" elapsed="0.092845"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:05.861787" elapsed="0.100004"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:05.861154" elapsed="0.100698"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:05.856644" elapsed="0.105283"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:05.977167" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/announce_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:05.977355" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:05.976936" elapsed="0.000448"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient3">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:05.977564" elapsed="0.002929"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/announce_${totest}.hex and send it to odl.</doc>
<status status="PASS" start="2026-05-01T00:58:05.976471" elapsed="0.004087"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:05.981228" level="INFO">&amp;{loc_rib} = { PATH=loc-rib | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{loc_rib}</var>
<arg>PATH=loc-rib</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:05.980742" elapsed="0.000515"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.033117" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:06.032724" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:06.033944" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:06.033692" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:06.034114" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:06.033324" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.034717" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:06.034312" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:06.035056" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:06.035214" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:06.034914" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.035758" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:06.035505" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.036872" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:06.036601" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.037363" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:06.037086" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.038182" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:06.037833" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:06.039121" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:06.038774" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:06.039203" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:06.039366" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:06.038403" elapsed="0.000987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:06.039567" elapsed="0.000297"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:58:06.037686" elapsed="0.002253"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.040540" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:06.040200" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:06.041654" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:06.041302" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:06.041732" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:06.041884" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:06.040788" elapsed="0.001122"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:06.042067" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:06.040059" elapsed="0.002317"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:06.037443" elapsed="0.004968"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:06.042470" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:06.042629" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:06.036242" elapsed="0.006412"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:06.035905" elapsed="0.006781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.042867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:06.042712" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:06.035864" elapsed="0.007079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.043692" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:06.043092" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:06.043770" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:06.032058" elapsed="0.011860"/>
</kw>
<msg time="2026-05-01T00:58:06.043979" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:06.018820" elapsed="0.025209"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.056916" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.069554" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.082302" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.082526" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.082716" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.083102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:06.082948" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:06.082932" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.083333" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.083521" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.083698" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:06.082900" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.082792" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.083982" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.084063" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:06.084195" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:06.014370" elapsed="0.069853"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:06.085598" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:06.085274" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:06.085766" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:06.084912" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.086119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:06.085862" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.086749" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:06.086439" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:06.086239" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:06.085843" elapsed="0.001004"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.090963" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:06.087006" elapsed="0.003986"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:06.091045" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:06.091204" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:06.084571" elapsed="0.006658"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:06.092587" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:06.092327" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:06.092749" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:06.091935" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:06.092984" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:06.092847" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:06.092828" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.093223" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.093400" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.093482" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:06.095430" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:06.091563" elapsed="0.003906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.096940" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:06.096687" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:06.097385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:06.097144" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:06.105421" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:06.105596" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:06.105695" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:06.099622" elapsed="0.006446">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:06.097512" elapsed="0.008638">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.106390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:06.106226" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:06.097493" elapsed="0.009003">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.106880" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.107014" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:06.106977" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:06.106959" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.107233" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.107304" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:06.095788" elapsed="0.011622">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.107501" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.990473" elapsed="0.117131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:06.107912" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:06.107699" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:06.107682" elapsed="0.000329"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:06.108044" elapsed="0.000015"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_0/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:05.985749" elapsed="0.122393">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.170302" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.169906" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.171140" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.170879" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.171314" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.170532" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.171916" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.171530" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.172254" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:08.172504" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:08.172112" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.172946" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.172696" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.174084" level="INFO">mapping: {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.173812" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.174607" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.174303" elapsed="0.000341"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.175578" level="INFO">${value} = loc-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.175203" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:08.176516" level="INFO">${encoded} = loc-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.176150" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:08.176596" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:08.176760" level="INFO">${encoded_value} = loc-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:08.175802" elapsed="0.000982"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.176947" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-05-01T00:58:08.175058" elapsed="0.002233"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.177901" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.177562" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:08.178981" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.178642" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:08.179058" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:08.179212" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:08.178278" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.179398" elapsed="0.000291"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:08.177406" elapsed="0.002325"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:08.174714" elapsed="0.005052"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:08.179810" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:08.179967" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:08.173383" elapsed="0.006610"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.173072" elapsed="0.006954"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.180207" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.180051" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.173049" elapsed="0.007235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.181030" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.180431" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:08.181108" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:08.169250" elapsed="0.011984"/>
</kw>
<msg time="2026-05-01T00:58:08.181290" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.156168" elapsed="0.025206"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.194246" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.206889" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.219582" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.219796" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.219979" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.220376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.220223" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:08.220208" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.220620" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.220794" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.220966" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:08.220176" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.220053" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.221201" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.221296" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:58:08.221426" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:r...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:08.151672" elapsed="0.069799"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.222867" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.222593" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.223031" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.222189" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.223424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.223166" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.224011" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.223719" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.223521" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.223147" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.226684" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.224252" elapsed="0.002459"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:08.226764" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:08.226920" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:08.221851" elapsed="0.005094"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.228183" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.227951" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.228339" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.227606" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:08.228585" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:08.228434" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.228416" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.228823" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.229001" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.229067" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:08.231044" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:08.227256" elapsed="0.003815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.232487" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.232222" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.232934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.232693" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:08.240579" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:08.240729" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '361'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}} 
 </msg>
<msg time="2026-05-01T00:58:08.240827" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:08.235210" elapsed="0.005643"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.233044" elapsed="0.007851"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.241084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.240921" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.233026" elapsed="0.008179"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.245816" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AAL78AAAAGU=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-extended-community":{"local-administrator":"AAAAZQ==","global-administrator":64496}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.242274" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.242048" elapsed="0.003886"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.242030" elapsed="0.003940"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.249675" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.246374" elapsed="0.003366"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.246051" elapsed="0.003737"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.246027" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.250641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.250074" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.251131" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.250781" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.251935" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.251512" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.251247" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.250755" elapsed="0.001299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.252818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.252294" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.253302" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.252957" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.254153" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.253740" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.253416" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.252931" elapsed="0.001339"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.254697" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:08.255707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.255398" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.255893" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:08.241620" elapsed="0.016699"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.258513" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.258390" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.258371" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:08.261609" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.258737" elapsed="0.002901"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:58:08.261691" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:08.261852" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:08.231383" elapsed="0.030495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:08.261940" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:58:08.262091" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:08.128606" elapsed="0.133551"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.291364" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.290990" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.292250" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.291922" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.292417" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.291578" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.293050" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.292654" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.293385" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:08.293622" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:08.293247" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.294064" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-extended-community": {
                    "global-administrator": 64496,
                    "local-administrator": "AAAAZQ=="
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.293817" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:08.294517" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.294183" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.295059" level="INFO">${mapping_to_use} = {'PATH': 'loc-rib', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.294764" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.294606" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.294163" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.295781" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.295294" elapsed="0.000516"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:08.295861" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:08.290351" elapsed="0.005639"/>
</kw>
<msg time="2026-05-01T00:58:08.296050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.276974" elapsed="0.019124"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.308716" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.325596" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.339772" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.340042" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.340251" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.340695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.340533" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:08.340517" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.340933" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.341112" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.341290" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:08.340478" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.340334" elapsed="0.001040"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.341588" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.341674" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:58:08.341838" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AAL78AAAAGU=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:08.274302" elapsed="0.067564"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.342057" elapsed="0.002513"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:08.345819" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.345347" elapsed="0.000501"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:08.346397" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.346012" elapsed="0.000413"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:58:08.346675" elapsed="0.000340"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:58:08.344910" elapsed="0.002167"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.344654" elapsed="0.002458"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.347296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.347139" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.344635" elapsed="0.002739"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:58:08.263319" elapsed="0.084106"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:58:08.262510" elapsed="0.085015"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.262246" elapsed="0.085328"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.262228" elapsed="0.085371"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:08.347635" elapsed="0.000031"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_0/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:58:08.119448" elapsed="0.228322"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_0/rib</arg>
<arg>mapping=${loc_rib}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:58:05.981435" elapsed="2.366398"/>
</kw>
<doc>Sends RT route from node 2 to odl and then checks that odl advertizes l3vpn route from previous TC.</doc>
<status status="PASS" start="2026-05-01T00:58:05.855843" elapsed="2.492123"/>
</test>
<test id="s1-s19-t5" name="Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table" line="111">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:08.352055" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:08.351779" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.353411" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.353297" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.353278" elapsed="0.000291"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.358661" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.358553" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.358535" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.359743" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.359344" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.360227" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:08.359935" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:08.360297" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:08.360471" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:08.358964" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.366289" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.366179" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.366160" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.367575" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.367445" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.367427" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:08.368102" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.367798" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:08.368535" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:08.368295" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:08.397646" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:08.369125" elapsed="0.028763"/>
</kw>
<msg time="2026-05-01T00:58:08.398268" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:08.398374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:08.368780" elapsed="0.029717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:08.458438" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "C "h "e "c "k "_ "P "r "e "s "e "n "c "e "_ "O "f "_ "l "3 "v "p "n "_ "R "o "u "t "e "_ "[78CI "[A[78Cn
 "_ "N "o "d "e "_ "2 "_ "E "f "f "e "c "t "i "v "e "_ "R "i "b "_ "I "n "_ "T "a "b "l "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:08.399820" elapsed="0.058863"/>
</kw>
<msg time="2026-05-01T00:58:08.458904" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:08.458953" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:08.398927" elapsed="0.060065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.459470" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.459110" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.459077" elapsed="0.000485"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.460112" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "C "h "e "c "k "_ "P "r "e "s "e "n "c "e "_ "O "f "_ "l "3 "v "p "n "_ "R "o "u "t "e "_ "[78CI "[A[78Cn
 "_ "N "o "d "e "_ "2 "_ "E "f "f "e "c "t "i "v "e "_ "R "i "b "_ "I "n "_ "T "a "b "l "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.459722" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.460520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.460277" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.460258" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:08.460640" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:08.463718" elapsed="0.000151"/>
</kw>
<msg time="2026-05-01T00:58:08.463932" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.462499" elapsed="0.001572"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.464360" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.464730" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:08.461792" elapsed="0.003127"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:08.460990" elapsed="0.003997"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:08.367144" elapsed="0.097943"/>
</kw>
<msg time="2026-05-01T00:58:08.465184" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:08.465232" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:08.366534" elapsed="0.098736"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:08.465612" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:58:08.465392" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.465330" elapsed="0.000374"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.466126" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.466528" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.466667" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:08.365839" elapsed="0.101117"/>
</kw>
<msg time="2026-05-01T00:58:08.467104" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:08.467167" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:08.360882" elapsed="0.106339"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.467723" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.467331" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.467305" elapsed="0.000528"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:08.360734" elapsed="0.107133"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:08.360553" elapsed="0.107359"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:08.358178" elapsed="0.109817"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:08.353002" elapsed="0.115073"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:08.352543" elapsed="0.115597"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:08.349259" elapsed="0.118958"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.522287" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.521897" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.523164" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.522904" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.523338" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.522507" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.523934" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.523549" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.524269" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:08.524428" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:08.524129" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.524884" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.524633" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.525968" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.525710" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.526467" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.526181" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.527214" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.526869" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:08.528149" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.527803" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:08.528288" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:58:08.528470" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:08.527430" elapsed="0.001067"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.528663" elapsed="0.000295"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.3/adj-rib-out</var>
<status status="PASS" start="2026-05-01T00:58:08.526726" elapsed="0.002275"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.529840" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:08.529258" elapsed="0.000610"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:08.530820" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.530475" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:08.530897" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:08.531051" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:08.530063" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:08.531234" elapsed="0.000290"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:08.529118" elapsed="0.002448"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:08.526548" elapsed="0.005053"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:08.531645" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:08.531803" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:08.525354" elapsed="0.006475"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.525005" elapsed="0.006855"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.532041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.531886" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.524984" elapsed="0.007134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.532864" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:08.532266" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:08.532944" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:08.521197" elapsed="0.011875"/>
</kw>
<msg time="2026-05-01T00:58:08.533128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:08.508156" elapsed="0.025020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.546085" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.560698" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.576098" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.576507" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.576783" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.577350" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.577116" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:08.577096" elapsed="0.000392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.577703" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.577901" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.578142" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:08.577050" elapsed="0.001173"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.576897" elapsed="0.001363"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.578485" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.578602" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:58:08.578809" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:08.503719" elapsed="0.075129"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.580717" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.580334" elapsed="0.000478">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.580924" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.579791" elapsed="0.001170"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.581353" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.581051" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.582085" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:08.581740" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:08.581486" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.581029" elapsed="0.001163"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.585048" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:08.582364" elapsed="0.002713"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:08.585142" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:08.585334" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:08.579283" elapsed="0.006078"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:08.586651" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.586398" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:08.586852" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:08.586027" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:08.587087" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:08.586951" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:08.586933" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.587325" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.587520" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.587595" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:58:08.589644" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:08.585693" elapsed="0.003978"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.591403" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.591062" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:08.592052" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:08.591717" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:08.600641" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:08.600787" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:08.600900" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.594880" elapsed="0.006531">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:08.592207" elapsed="0.009338">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.601825" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.601592" elapsed="0.000321"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:08.592181" elapsed="0.009764">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.602505" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.602693" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:08.602638" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:08.602615" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.602990" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.603091" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.590019" elapsed="0.013214">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.603380" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.480431" elapsed="0.123110">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:08.603924" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:08.603674" elapsed="0.000353"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:08.603648" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:08.604112" elapsed="0.000021"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${ADJ_RIB_OUT}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.475207" elapsed="0.129042">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.663064" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:10.662658" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:10.663927" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.663665" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:10.664100" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:10.663285" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.664708" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:10.664303" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:10.665053" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:10.665229" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:10.664904" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.665687" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:10.665423" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.666749" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:10.666490" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.667230" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:10.666963" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.668033" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:10.667676" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:10.668996" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:10.668641" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:10.669146" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:58:10.669313" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:10.668262" elapsed="0.001076"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:10.669520" elapsed="0.000299"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.3/adj-rib-out</var>
<status status="PASS" start="2026-05-01T00:58:10.667532" elapsed="0.002329"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.671860" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:10.670119" elapsed="0.001769"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:10.672789" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:10.672433" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:10.672866" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:10.673021" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:10.672083" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:10.673209" elapsed="0.000299"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:10.669978" elapsed="0.003572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:10.667311" elapsed="0.006275"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:10.673629" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:10.673791" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:10.666142" elapsed="0.007674"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:10.665815" elapsed="0.008033"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.674031" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:10.673874" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:10.665791" elapsed="0.008320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.674974" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:10.674345" elapsed="0.000657"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:10.675052" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:10.661970" elapsed="0.013210"/>
</kw>
<msg time="2026-05-01T00:58:10.675236" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:10.648776" elapsed="0.026508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.688161" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.700979" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.713842" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.714048" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.714232" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.714626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:10.714472" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:10.714443" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.714865" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.715043" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.715219" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:10.714413" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.714307" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.715495" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.715575" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:10.715701" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:10.644221" elapsed="0.071508"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:10.717048" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.716782" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:10.717214" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:10.716406" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.717584" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:10.717312" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.718201" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:10.717872" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:10.717667" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:10.717294" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.720911" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:10.718448" elapsed="0.002491"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:10.720993" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:10.721154" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:10.716066" elapsed="0.005114"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:10.722524" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.722264" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:10.722725" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:10.721853" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:10.722962" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:10.722824" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:10.722805" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.723206" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.723406" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.723496" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:58:10.725507" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:10.721513" elapsed="0.004023"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.726976" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:10.726719" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:10.727451" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:10.727182" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:10.734821" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:10.734963" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:10.735074" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.729746" elapsed="0.005749">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:10.727580" elapsed="0.008000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.735780" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:10.735616" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:10.727562" elapsed="0.008311">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.736267" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.736409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:10.736371" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:10.736352" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.736647" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.736721" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.725865" elapsed="0.010971">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.736955" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.620714" elapsed="0.116343">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:10.737343" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:10.737156" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:10.737138" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:10.737494" elapsed="0.000016"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${ADJ_RIB_OUT}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:10.614306" elapsed="0.123289">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.800902" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:12.800391" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:12.802048" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.801665" elapsed="0.000484">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:12.802263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:12.801171" elapsed="0.001118"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.802892" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:12.802486" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:12.803240" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:12.803431" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:12.803093" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.803917" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:12.803647" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.805103" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:12.804831" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.805621" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.805318" elapsed="0.000330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.806441" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:12.806060" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:12.807512" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.807130" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:12.807596" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:58:12.807768" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:12.806698" elapsed="0.001096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.807958" elapsed="0.000304"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.3/adj-rib-out</var>
<status status="PASS" start="2026-05-01T00:58:12.805916" elapsed="0.002389"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.809131" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:12.808585" elapsed="0.000580"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:12.810253" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.809880" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:12.810333" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:12.810523" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:12.809398" elapsed="0.001160"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.810776" elapsed="0.000296"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:12.808424" elapsed="0.002692"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:12.805724" elapsed="0.005429"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:12.811199" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:12.811368" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:12.804443" elapsed="0.006952"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:12.804056" elapsed="0.007372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.811672" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.811481" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.804028" elapsed="0.007729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.812565" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:12.811914" elapsed="0.000681"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:12.812646" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:12.799590" elapsed="0.013185"/>
</kw>
<msg time="2026-05-01T00:58:12.812831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:12.785260" elapsed="0.027623"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.826319" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.839755" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.853479" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.853854" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.854166" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.854791" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.854564" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:12.854536" elapsed="0.000376"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.855128" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.855377" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.855642" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:12.854476" elapsed="0.001245"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.854284" elapsed="0.001478"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.855990" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.856103" elapsed="0.000025"/>
</return>
<msg time="2026-05-01T00:58:12.856326" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:12.778549" elapsed="0.077820"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:12.858610" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.858178" elapsed="0.000540">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:12.858876" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:12.857507" elapsed="0.001416"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.859295" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.859015" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.859909" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:12.859598" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:12.859378" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.858992" elapsed="0.001003"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.862661" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:12.860153" elapsed="0.002536"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:12.862744" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:12.862909" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:12.856969" elapsed="0.005966"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:12.864178" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.863945" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:12.864390" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:12.863602" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:12.864640" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:12.864502" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.864483" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.864876" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.865053" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.865118" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:12.867094" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:12.863249" elapsed="0.003871"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.868551" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:12.868280" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.869009" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:12.868760" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:12.876807" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:12.876952" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:12.877052" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.871252" elapsed="0.006178">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:12.869120" elapsed="0.008419">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.877777" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.877575" elapsed="0.000276"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:12.869102" elapsed="0.008773">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.878271" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.878405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:12.878368" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:12.878351" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.878640" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.878710" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.867434" elapsed="0.011382">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.878938" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.752443" elapsed="0.126594">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.879317" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.879132" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:12.879115" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.879445" elapsed="0.000029"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${ADJ_RIB_OUT}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.746066" elapsed="0.133493">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<msg time="2026-05-01T00:58:12.879660" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${ADJ_RIB_OUT}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.468493" elapsed="4.411274">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</kw>
<doc>Checks l3vpn route is present in node 2 effective-rib-in table.</doc>
<status status="FAIL" start="2026-05-01T00:58:08.348534" elapsed="4.531406">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.3/adj-rib-out/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</status>
</test>
<test id="s1-s19-t6" name="Check_l3vpn_Route_Advertisement_On_Each_Node" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:12.883666" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:12.883373" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.884977" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:12.884864" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.884845" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.890244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:12.890137" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.890119" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.891330" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:12.890947" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.891833" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:12.891538" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:12.891903" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:12.892061" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:12.890563" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.897718" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:12.897563" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.897544" elapsed="0.000246"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.898994" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:12.898887" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.898869" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:12.899536" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.899216" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:12.899949" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:12.899729" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:12.927908" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:12.900500" elapsed="0.027527"/>
</kw>
<msg time="2026-05-01T00:58:12.928226" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:12.928275" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:12.900142" elapsed="0.028171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:12.974757" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "C "h "e "c "k "_ "l "3 "v "p "n "_ "R "o "u "t "e "_ "A "d "v "e "r "t "i "s "e "m "e "n "[78Ct "[A[78C_
 "O "n "_ "E "a "c "h "_ "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:12.928877" elapsed="0.046093"/>
</kw>
<msg time="2026-05-01T00:58:12.975194" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:12.975254" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:12.928527" elapsed="0.046772"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.975803" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.975423" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.975385" elapsed="0.000509"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.976419" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "C "h "e "c "k "_ "l "3 "v "p "n "_ "R "o "u "t "e "_ "A "d "v "e "r "t "i "s "e "m "e "n "[78Ct "[A[78C_
 "O "n "_ "E "a "c "h "_ "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:12.976050" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.976824" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.976595" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.976576" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:12.976945" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:12.979790" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:58:12.980005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:12.978682" elapsed="0.001462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.980438" elapsed="0.000105"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.980838" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:12.977974" elapsed="0.003061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:12.977299" elapsed="0.003804"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:12.898583" elapsed="0.082619"/>
</kw>
<msg time="2026-05-01T00:58:12.981298" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:12.981342" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:12.897954" elapsed="0.083426"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:12.981823" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:12.981709" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.981687" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.982332" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.982699" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:12.982770" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:12.897212" elapsed="0.085673"/>
</kw>
<msg time="2026-05-01T00:58:12.982978" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:12.983022" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:12.892484" elapsed="0.090575"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.983390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.983134" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.983117" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:12.892318" elapsed="0.091190"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:12.892143" elapsed="0.091398"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:12.889773" elapsed="0.093826"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:12.884569" elapsed="0.099086"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:12.884109" elapsed="0.099592"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:12.880788" elapsed="0.102967"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:12.984097" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/announce_ext_l3vpn_rt_arg.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/announce_ext_l3vpn_rt_arg.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:12.984276" level="INFO">${announce} = ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
</msg>
<var>${announce}</var>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/announce_ext_l3vpn_rt_arg.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:12.983930" elapsed="0.000372"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-05-01T00:58:12.984702" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<var>${announce_hex}</var>
<arg>${announce}</arg>
<arg>\n</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-05-01T00:58:12.984485" elapsed="0.000243"/>
</kw>
<kw name="Check_For_L3VPN_Odl_Avertisement">
<for flavor="IN ZIP">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.985845" level="INFO">${keyword_name} = Get_Update_Message_And_Compare_With_Hex_BgpRpcClient2</msg>
<var>${keyword_name}</var>
<arg>Get_Update_Message_And_Compare_With_Hex_BgpRpcClient${i}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:12.985495" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="Get_Update_Message_And_Compare_With_Hex_BgpRpcClient2">
<kw name="Play Get" owner="BgpRpcClient2">
<msg time="2026-05-01T00:58:12.990374" level="INFO">${update} = ffffffffffffffffffffffffffffffff001d0200000006800f03000205</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:58:12.986855" elapsed="0.003547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;true&quot;">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${update}</arg>
<arg>${hex}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.990727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.990495" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.990474" elapsed="0.000337"/>
</if>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;false&quot;">
<kw name="Should Not Be Equal As Strings" owner="BuiltIn">
<arg>${update}</arg>
<arg>${hex}</arg>
<doc>Fails if objects are equal after converting them to strings.</doc>
<status status="PASS" start="2026-05-01T00:58:12.991118" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:12.990870" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:12.990854" elapsed="0.000691"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="PASS" start="2026-05-01T00:58:12.986488" elapsed="0.005102"/>
</kw>
<arg>${keyword_name}</arg>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-05-01T00:58:12.986039" elapsed="0.005601"/>
</kw>
<var name="${i}">2</var>
<var name="${option}">false</var>
<status status="PASS" start="2026-05-01T00:58:12.985335" elapsed="0.006339"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.992318" level="INFO">${keyword_name} = Get_Update_Message_And_Compare_With_Hex_BgpRpcClient3</msg>
<var>${keyword_name}</var>
<arg>Get_Update_Message_And_Compare_With_Hex_BgpRpcClient${i}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:12.991971" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword" owner="BuiltIn">
<kw name="Get_Update_Message_And_Compare_With_Hex_BgpRpcClient3">
<kw name="Play Get" owner="BgpRpcClient3">
<msg time="2026-05-01T00:58:12.997445" level="INFO">${update} = ffffffffffffffffffffffffffffffff001d0200000006800f03000205</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:58:12.993732" elapsed="0.003828"/>
</kw>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;true&quot;">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-05-01T00:58:12.998641" level="FAIL">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<arg>${update}</arg>
<arg>${hex}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.998073" elapsed="0.000677">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:12.997703" elapsed="0.001150">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</branch>
<status status="FAIL" start="2026-05-01T00:58:12.997665" elapsed="0.001236">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</if>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;false&quot;">
<kw name="Should Not Be Equal As Strings" owner="BuiltIn">
<arg>${update}</arg>
<arg>${hex}</arg>
<doc>Fails if objects are equal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:12.999213" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:12.998997" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:12.998974" elapsed="0.000385"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.992983" elapsed="0.006524">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<arg>${keyword_name}</arg>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.992530" elapsed="0.007066">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<var name="${i}">3</var>
<var name="${option}">true</var>
<status status="FAIL" start="2026-05-01T00:58:12.991827" elapsed="0.007857">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</iter>
<var>${i}</var>
<var>${option}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${L3VPN_RT_CHECK}</value>
<status status="FAIL" start="2026-05-01T00:58:12.985135" elapsed="0.014638">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</for>
<arg>${announce_hex}</arg>
<doc>Checks that each node received or did not receive update message containing given hex message.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.984910" elapsed="0.014998">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<doc>Checks that each node received or did not receive update message containing given hex message.</doc>
<status status="FAIL" start="2026-05-01T00:58:12.880173" elapsed="0.119932">ffffffffffffffffffffffffffffffff001d0200000006800f03000205 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</test>
<test id="s1-s19-t7" name="Play_To_Odl_rt_constrain_type_1" line="128">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:13.005301" elapsed="0.000363"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:13.004891" elapsed="0.000853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.007335" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:13.007177" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.007151" elapsed="0.000284"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.014618" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:13.014444" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.014419" elapsed="0.000295"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.016122" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:13.015590" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.016821" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:13.016391" elapsed="0.000466"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:13.016919" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:58:13.017136" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:13.015038" elapsed="0.002132"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.023145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:13.023037" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.023019" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.024379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:13.024274" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.024257" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:13.024926" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.024626" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:13.025330" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:13.025119" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:13.053720" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:13.025891" elapsed="0.027934"/>
</kw>
<msg time="2026-05-01T00:58:13.053989" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:13.054035" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:13.025548" elapsed="0.028523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:13.093843" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "[78C1 "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:13.054622" elapsed="0.039374"/>
</kw>
<msg time="2026-05-01T00:58:13.094203" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:13.094265" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:13.054249" elapsed="0.040066"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.094768" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.094417" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.094390" elapsed="0.000490"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.095517" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "t "_ "c "o "n "s "t "r "a "i "n "_ "t "y "p "e "_ "[78C1 "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:13.095095" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.096009" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.095715" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.095691" elapsed="0.000426"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:13.096168" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:13.099656" elapsed="0.000196"/>
</kw>
<msg time="2026-05-01T00:58:13.099932" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:13.098219" elapsed="0.001885"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.100497" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.100960" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:13.097351" elapsed="0.003854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:13.096605" elapsed="0.004687"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:13.023974" elapsed="0.077445"/>
</kw>
<msg time="2026-05-01T00:58:13.101580" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:13.101641" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:13.023372" elapsed="0.078379"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:13.102001" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T00:58:13.101857" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.101832" elapsed="0.000284"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.102669" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.103133" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.103229" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:13.022697" elapsed="0.080671"/>
</kw>
<msg time="2026-05-01T00:58:13.103510" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:13.103570" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:13.017810" elapsed="0.085810"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.104094" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.103725" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.103700" elapsed="0.000549"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:13.017599" elapsed="0.086684"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:13.017294" elapsed="0.087031"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:13.013938" elapsed="0.090459"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:13.006760" elapsed="0.097725"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:13.005967" elapsed="0.098575"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:13.001633" elapsed="0.102977"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:13.117299" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/announce_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:13.117528" level="INFO">${announce_hex} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
</msg>
<var>${announce_hex}</var>
<arg>${dir}/${totest}/announce_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:13.117085" elapsed="0.000473"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient4">
<arg>${announce_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:13.117726" elapsed="0.002967"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/announce_${totest}.hex and send it to odl.</doc>
<status status="PASS" start="2026-05-01T00:58:13.116676" elapsed="0.004082"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.121520" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F127.0.0.4/effective-rib-in | BGP_RIB=example-bgp-rib }</msg>
<var>&amp;{effective_rib_in}</var>
<arg>PATH=peer\=bgp:%2F%2F${ODL_4_IP}/effective-rib-in</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.120964" elapsed="0.000588"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.176778" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:13.176375" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:13.177639" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.177327" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:13.177816" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:13.176987" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.178481" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:13.178081" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:13.178819" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:13.178971" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:13.178679" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.179411" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:13.179164" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.180443" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.4/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:13.180189" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.180930" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.180669" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.181864" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:13.181331" elapsed="0.000560"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:13.182807" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.182441" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:13.182886" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:13.183050" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:13.182089" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.183240" elapsed="0.000323"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.4/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:58:13.181189" elapsed="0.002416"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.184181" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:13.183863" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:13.185088" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.184754" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:13.185165" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:13.185317" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:13.184394" elapsed="0.000947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:13.185535" elapsed="0.000273"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:13.183722" elapsed="0.002128"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:13.181011" elapsed="0.004875"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:13.185929" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:13.186087" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:13.179861" elapsed="0.006252"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:13.179548" elapsed="0.006596"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.186325" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.186169" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.179526" elapsed="0.006874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.187168" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:13.186570" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:13.187245" elapsed="0.000063"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:13.175757" elapsed="0.011650"/>
</kw>
<msg time="2026-05-01T00:58:13.187483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:13.162873" elapsed="0.024660"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.200262" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.213065" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.225665" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.225890" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.226081" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.226509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.226335" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:13.226317" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.226746" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.226920" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.227091" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:13.226278" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.226164" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.227325" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.227402" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:58:13.227566" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:13.158229" elapsed="0.069365"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:13.229040" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.228759" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:13.229214" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:13.228344" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.229609" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.229310" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.230193" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:13.229898" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:13.229691" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.229291" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.232903" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:13.230434" elapsed="0.002496"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:13.232982" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:13.233139" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:13.227987" elapsed="0.005177"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:13.234405" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.234176" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:13.234579" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:13.233836" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:13.234809" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:13.234673" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:13.234655" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.235048" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.235225" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.235290" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:13.237244" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:13.233503" elapsed="0.003767"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.238862" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:13.238603" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:13.239308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:13.239067" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:13.248479" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:13.248675" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:13.248857" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.241557" elapsed="0.007829">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:13.239416" elapsed="0.010109">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.249800" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.249575" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:13.239399" elapsed="0.010522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.250442" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.250646" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:13.250596" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:13.250572" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.250943" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.251040" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.237624" elapsed="0.013563">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.251291" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.132781" elapsed="0.118644">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:13.251828" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:13.251578" elapsed="0.000350"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:13.251554" elapsed="0.000407"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:13.252006" elapsed="0.000020"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_1/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:13.126615" elapsed="0.125524">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.312680" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.312248" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.313527" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:15.313256" elapsed="0.000426">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:15.313780" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:15.312904" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.314366" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.313978" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.314723" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:15.314883" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-targ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:15.314579" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.315349" level="INFO">rests/data/bgp-rib:bgp-rib/rib=$BGP_RIB/$PATH/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.315074" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.316520" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F127.0.0.4/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.316239" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.317011" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.316737" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.317795" level="INFO">${value} = peer=bgp:%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.317416" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:15.318762" level="INFO">${encoded} = peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.318378" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:15.318845" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:58:15.319058" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:15.318025" elapsed="0.001060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.319250" elapsed="0.000324"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F127.0.0.4/effective-rib-in</var>
<status status="PASS" start="2026-05-01T00:58:15.317272" elapsed="0.002345"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.320223" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.319874" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:15.321337" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.320995" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:15.321415" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:15.321587" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:15.320635" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.321773" elapsed="0.000276"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:15.319733" elapsed="0.002358"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:15.317093" elapsed="0.005034"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:15.322172" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:15.322330" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:15.315855" elapsed="0.006501"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.315502" elapsed="0.006886"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.322590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.322415" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.315475" elapsed="0.007194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.323522" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:15.322864" elapsed="0.000688"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:15.323602" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.311531" elapsed="0.012202"/>
</kw>
<msg time="2026-05-01T00:58:15.323791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.298204" elapsed="0.025637"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.336937" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.349603" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.362687" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.362974" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.363175" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.363645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.363482" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:15.363449" elapsed="0.000284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.363919" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.364096" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.364271" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:15.363404" elapsed="0.000920"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.363264" elapsed="0.001088"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.364521" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.364604" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:58:15.364781" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:15.293486" elapsed="0.071324"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.366345" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:15.366045" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:15.366535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:15.365632" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.366909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.366634" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.367509" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.367194" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.366991" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.366615" elapsed="0.000980"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.370231" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.367755" elapsed="0.002503"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:15.370313" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:15.370491" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:15.365246" elapsed="0.005271"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.371811" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:15.371540" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:15.371989" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:15.371179" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:15.372225" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:15.372087" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.372068" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.372476" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.372658" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.372724" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:15.374911" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:15.370841" elapsed="0.004097"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.376573" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.376249" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.377048" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.376793" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:15.388515" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:15.388795" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.4/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '346'} 
 body={"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}} 
 </msg>
<msg time="2026-05-01T00:58:15.388949" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:15.379609" elapsed="0.009370"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.377346" elapsed="0.011691"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.389296" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.389073" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.377323" elapsed="0.012064"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.393356" level="INFO">{"bgp-route-target-constrain:route-target-constrain-routes":{"route-target-constrain-route":[{"path-id":0,"route-key":"AQLAAAICAHs=","attributes":{"ipv4-next-hop":{"global":"199.20.166.41"},"origin":{"value":"igp"},"local-pref":{"pref":100}},"origin-as":64511,"route-target-ipv4":{"local-administrator":123,"global-administrator":"192.0.2.2"}}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.390582" elapsed="0.002825"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.390316" elapsed="0.003127"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.390297" elapsed="0.003186"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.396138" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.393775" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.393541" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.393524" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.396936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:15.396501" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.397471" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.397082" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.398300" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.397857" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.397595" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.397056" elapsed="0.001367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.399234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:15.398701" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.399762" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.399377" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.400629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.400163" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.399904" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.399350" elapsed="0.001402"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.400988" elapsed="0.000538"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:15.402218" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:15.401784" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.402517" elapsed="0.003587"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:15.389837" elapsed="0.016366"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.406494" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.406313" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.406284" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:15.410411" level="INFO">${text_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.406833" elapsed="0.003794"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:58:15.410688" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:58:15.410864" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:15.375295" elapsed="0.035596"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:15.410957" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:58:15.411111" level="INFO">${response_text} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:15.268507" elapsed="0.142631"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.444590" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.444135" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.445577" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:15.445171" elapsed="0.000484">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:15.445750" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:15.444815" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.446342" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.445949" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.446703" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:15.446870" level="INFO">${template} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:15.446559" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.447313" level="INFO">{
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
                "attributes": {
                    "ipv4-next-hop": {
                        "global": "199.20.166.41"
                    },
                    "origin": {
                        "value": "igp"
                    },
                    "local-pref": {
                        "pref": 100
                    }
                },
                "route-target-ipv4": {
                    "global-administrator": "192.0.2.2",
                    "local-administrator": 123
                },
                "origin-as": 64511
            }
        ]
    }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.447068" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:15.447847" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.447445" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.448395" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F127.0.0.4/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:15.448095" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.447938" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.447420" elapsed="0.001077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.449119" level="INFO">${final_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:15.448652" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:15.449201" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.443306" elapsed="0.006095"/>
</kw>
<msg time="2026-05-01T00:58:15.449475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.427870" elapsed="0.021657"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.462377" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.475062" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.487940" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.488155" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.488347" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.488782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.488624" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:15.488607" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.489012" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.489187" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.489363" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:15.488572" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.488433" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.489619" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.489698" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:58:15.489853" level="INFO">${expected_text} = {
    "bgp-route-target-constrain:route-target-constrain-routes": {
        "route-target-constrain-route": [
            {
                "route-key": "AQLAAAICAHs=",
                "path-id": 0,
 ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:15.425055" elapsed="0.064825"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.490123" elapsed="0.002774"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:15.494189" level="INFO">${expected_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.493741" elapsed="0.000477"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:15.494797" level="INFO">${actual_normalized} = {
 "bgp-route-target-constrain:route-target-constrain-routes": {
  "route-target-constrain-route": [
   {
    "attributes": {
     "ipv4-next-hop": {
      "global": "199.20.166.41"
     },
     "loca...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.494384" elapsed="0.000442"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:58:15.494992" elapsed="0.000347"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:58:15.493264" elapsed="0.002139"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.492990" elapsed="0.002448"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.495641" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.495481" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.492968" elapsed="0.002753"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:58:15.412441" elapsed="0.083332"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:58:15.411565" elapsed="0.084309"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:15.411222" elapsed="0.084702"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.411205" elapsed="0.084744"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:15.495987" elapsed="0.000037"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_1/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:58:15.263087" elapsed="0.233043"/>
</kw>
<arg>3x</arg>
<arg>2s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${RT_CONSTRAIN_DIR}/rt_constrain_type_1/rib</arg>
<arg>mapping=${effective_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:58:13.121731" elapsed="2.374460"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient4">
<msg time="2026-05-01T00:58:15.499222" level="INFO">${update} = ffffffffffffffffffffffffffffffff00170200000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-05-01T00:58:15.496371" elapsed="0.002881"/>
</kw>
<doc>Sends RT route from node 3 to odl and then checks that odl does not advertize l3vpn route from previous TC,
that is that update message is empty.</doc>
<status status="PASS" start="2026-05-01T00:58:13.000590" elapsed="2.498779"/>
</test>
<test id="s1-s19-t8" name="Play_To_Odl_remove_rt" line="145">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:15.503134" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:15.502853" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.504516" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.504380" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.504361" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.510073" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.509917" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.509887" elapsed="0.000286"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.511684" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.511103" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.512506" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:15.511996" elapsed="0.000549"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:15.512611" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:58:15.512835" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.510524" elapsed="0.002346"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.520675" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.520561" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.520540" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.521968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.521859" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.521841" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:15.522541" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.522192" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.522974" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.522740" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.554478" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:15.523536" elapsed="0.031096"/>
</kw>
<msg time="2026-05-01T00:58:15.554814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:15.554864" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.523170" elapsed="0.031733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.589286" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "e "m "o "v "e "_ "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:15.555526" elapsed="0.034033"/>
</kw>
<msg time="2026-05-01T00:58:15.589828" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:15.589877" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.555120" elapsed="0.034796"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.590491" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.590044" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.590002" elapsed="0.000607"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.591297" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "e "m "o "v "e "_ "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.590821" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.591717" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.591482" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.591444" elapsed="0.000430"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:15.591918" elapsed="0.000058"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.594811" elapsed="0.000159"/>
</kw>
<msg time="2026-05-01T00:58:15.595036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.593628" elapsed="0.001546"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.595481" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.595872" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:15.592922" elapsed="0.003149"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:15.592301" elapsed="0.003837"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:15.521551" elapsed="0.074685"/>
</kw>
<msg time="2026-05-01T00:58:15.596335" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.596382" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.520908" elapsed="0.075619"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:15.596726" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:15.596613" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.596594" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.597263" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.597644" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.597717" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:15.520191" elapsed="0.077639"/>
</kw>
<msg time="2026-05-01T00:58:15.597929" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.597973" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.513520" elapsed="0.084490"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.598347" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.598088" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.598070" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:15.513281" elapsed="0.085168"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:15.513027" elapsed="0.085554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:15.509346" elapsed="0.089297"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:15.504086" elapsed="0.094617"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.503612" elapsed="0.095138"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:15.500617" elapsed="0.098189"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:58:15.598977" elapsed="0.003939"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.616219" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/withdraw_rt_constrain_type_0.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:15.616436" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:15.615899" elapsed="0.000594"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:58:15.616717" elapsed="0.002393"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient3">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:15.619337" elapsed="0.001958"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/withdraw_${totest}.hex and send it to odl to remove rt argument from odl.</doc>
<status status="PASS" start="2026-05-01T00:58:15.615301" elapsed="0.006083"/>
</kw>
<doc>Removes RT from odl and then checks that second node withdrew l3vpn route and third node did not receive any message.</doc>
<status status="PASS" start="2026-05-01T00:58:15.499766" elapsed="0.121796"/>
</test>
<test id="s1-s19-t9" name="Play_To_Odl_remove_routes" line="150">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:15.626161" elapsed="0.000316"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:15.625782" elapsed="0.000776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.627996" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.627841" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.627815" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.634260" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.634153" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.634135" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.635347" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.634962" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.635925" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:15.635599" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:15.636017" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:58:15.636188" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.634580" elapsed="0.001634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.641911" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.641801" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.641783" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.643135" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.643030" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.643013" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:15.643677" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.643355" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.644150" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.643914" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.674991" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:15.644699" elapsed="0.030397"/>
</kw>
<msg time="2026-05-01T00:58:15.675257" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:15.675304" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.644340" elapsed="0.031001"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.711494" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "e "m "o "v "e "_ "r "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:15.675919" elapsed="0.035723"/>
</kw>
<msg time="2026-05-01T00:58:15.711862" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:15.711913" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.675541" elapsed="0.036416"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.712311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.712050" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.712024" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.712900" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "P "l "a "y "_ "T "o "_ "O "d "l "_ "r "e "m "o "v "e "_ "r "o "u "t "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.712569" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.713275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.713050" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.713031" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:15.713389" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.716091" elapsed="0.000148"/>
</kw>
<msg time="2026-05-01T00:58:15.716302" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.714939" elapsed="0.001552"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.716784" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.717176" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:15.714275" elapsed="0.003087"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:15.713717" elapsed="0.003709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:15.642725" elapsed="0.074824"/>
</kw>
<msg time="2026-05-01T00:58:15.717644" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.717689" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.642141" elapsed="0.075586"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:15.717918" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:58:15.717806" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.717787" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.718577" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.718921" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.718993" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:15.641461" elapsed="0.077642"/>
</kw>
<msg time="2026-05-01T00:58:15.719198" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.719241" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.636609" elapsed="0.082671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.719628" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.719356" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.719339" elapsed="0.000398"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:15.636443" elapsed="0.083319"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:15.636268" elapsed="0.083526"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:15.633789" elapsed="0.086062"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:15.627388" elapsed="0.092518"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.626779" elapsed="0.093183"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:15.622698" elapsed="0.097336"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.732053" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/withdraw_ext_l3vpn_rt_arg.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/withdraw_ext_l3vpn_rt_arg.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:15.732261" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:15.731846" elapsed="0.000442"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient2">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:58:15.732446" elapsed="0.003370"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient2">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:15.735981" elapsed="0.008245"/>
</kw>
<arg>ext_l3vpn_rt_arg</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/withdraw_${totest}.hex and send it to odl to remove rt argument from odl.</doc>
<status status="PASS" start="2026-05-01T00:58:15.731432" elapsed="0.012938"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.763714" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_1/withdraw_rt_constrain_type_1.hex&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:15.763908" level="INFO">${withdraw_hex} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
</msg>
<var>${withdraw_hex}</var>
<arg>${dir}/${totest}/withdraw_${totest}.hex</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:15.763388" elapsed="0.000552"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient4">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-05-01T00:58:15.764147" elapsed="0.007247"/>
</kw>
<kw name="Play Send" owner="BgpRpcClient4">
<arg>${withdraw_hex}</arg>
<doc>Sends given hex data, already encoded bgp update message is expected.</doc>
<status status="PASS" start="2026-05-01T00:58:15.771582" elapsed="0.003769"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<doc>Read contents of file ${dir}/${totest}/withdraw_${totest}.hex and send it to odl to remove rt argument from odl.</doc>
<status status="PASS" start="2026-05-01T00:58:15.762853" elapsed="0.012677"/>
</kw>
<doc>Removes rt arguments from odl.</doc>
<status status="PASS" start="2026-05-01T00:58:15.621984" elapsed="0.153816"/>
</test>
<test id="s1-s19-t10" name="Kill_Talking_BGP_Speakers" line="155">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:15.783253" elapsed="0.000554"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:15.782647" elapsed="0.001279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.785338" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.785184" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.785159" elapsed="0.000276"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.792525" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.792353" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.792329" elapsed="0.000293"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.794048" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:15.793512" elapsed="0.000573"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.794749" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:15.794315" elapsed="0.000470"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:15.794847" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:58:15.795065" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.792953" elapsed="0.002146"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.804769" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.804616" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.804587" elapsed="0.000275"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.806295" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:15.806186" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.806168" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:15.806882" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:15.806549" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.807305" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.807083" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.837529" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:15.807897" elapsed="0.029739"/>
</kw>
<msg time="2026-05-01T00:58:15.837797" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:15.837843" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.807515" elapsed="0.030365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.875858" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:15.838407" elapsed="0.037631"/>
</kw>
<msg time="2026-05-01T00:58:15.876200" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:15.876245" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.838062" elapsed="0.038221"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.876618" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.876361" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.876342" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.877228" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "K "i "l "l "_ "T "a "l "k "i "n "g "_ "B "G "P "_ "S "p "e "a "k "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.876922" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.877618" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.877375" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.877357" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:15.877729" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:15.880382" elapsed="0.000158"/>
</kw>
<msg time="2026-05-01T00:58:15.880602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:15.879231" elapsed="0.001505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.881017" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.881358" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:15.878595" elapsed="0.002970"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:15.878038" elapsed="0.003591"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:15.805876" elapsed="0.075850"/>
</kw>
<msg time="2026-05-01T00:58:15.881816" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.881860" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.805092" elapsed="0.076806"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:15.882079" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T00:58:15.881973" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.881955" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.882580" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.882915" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:15.882990" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:15.803579" elapsed="0.079518"/>
</kw>
<msg time="2026-05-01T00:58:15.883189" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:15.883239" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.795677" elapsed="0.087601"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:15.883639" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:15.883353" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:15.883336" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:15.795416" elapsed="0.088323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:15.795174" elapsed="0.088598"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:15.791851" elapsed="0.091977"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:15.784779" elapsed="0.099104"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:15.784151" elapsed="0.099778"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:15.777581" elapsed="0.106409"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.893420" level="INFO">Executing command 'cat play.py.090.2'.</msg>
<msg time="2026-05-01T00:58:15.906630" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:15.906799" level="INFO">${output_log} = 2026-05-01 00:58:01,388 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,388 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:58:01,388 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:15.893281" elapsed="0.013559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.907839" level="INFO">2026-05-01 00:58:01,388 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,388 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-05-01 00:58:01,388 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:58:01,388 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:58:01,389 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf0005ac0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   My Autonomous System number: 65000
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:58:01,404 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   My Autonomous System=65000 (0xfde8)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fde800b47f0000026002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8'
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fde800b47f0000026002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,407 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,407 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,407 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:01,412 INFO BGP-Thread-1 (job): ... idle for 0.005s
2026-05-01 00:58:01,412 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.005s
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:01] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.006s
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:02,420 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.007s
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:04,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.008s
2026-05-01 00:58:04,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:04,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:04,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.010s
2026-05-01 00:58:05,425 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:05,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:05,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:06,426 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:06,428 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.011s
2026-05-01 00:58:06,428 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:06,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:06,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:07,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:07,430 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.012s
2026-05-01 00:58:07,430 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:07,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:07,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:08,440 INFO BGP-Thread-1 (job): ... idle for 1.010s
2026-05-01 00:58:08,440 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.022s
2026-05-01 00:58:08,440 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:08,440 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:08,440 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:09,441 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:09,442 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.023s
2026-05-01 00:58:09,442 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:09,442 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:09,442 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:10,443 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:10,444 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.024s
2026-05-01 00:58:10,444 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:10,444 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:10,444 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:11,445 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:11,445 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.025s
2026-05-01 00:58:11,445 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:11,445 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:11,446 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:12,447 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:12,447 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.026s
2026-05-01 00:58:12,447 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:12,447 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:12,447 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:12] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:58:13,448 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:13,449 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.027s
2026-05-01 00:58:13,449 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:13,449 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:13,449 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:14,450 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:14,450 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.029s
2026-05-01 00:58:14,450 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:14,451 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:14,451 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:15,452 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:15,452 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.030s
2026-05-01 00:58:15,452 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:15,452 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:15,452 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.907206" elapsed="0.001210"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.909675" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:58:15.908878" elapsed="0.000921"/>
</kw>
<arg>play.py.090.2</arg>
<arg>090_rt_constrain_play_1.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.892943" elapsed="0.016993"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.921686" level="INFO">Executing command 'cat play.py.090.3'.</msg>
<msg time="2026-05-01T00:58:15.956303" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:15.956560" level="INFO">${output_log} = 2026-05-01 00:58:01,387 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,387 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:58:01,387 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:15.921546" elapsed="0.035076"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:15.957590" level="INFO">2026-05-01 00:58:01,387 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,387 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-05-01 00:58:01,387 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:58:01,387 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:58:01,387 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:58:01,388 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:58:01,393 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:58:01,393 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:58:01,393 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:58:01,393 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:58:01,393 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000036002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-05-01 00:58:01,393 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000036002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,398 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,398 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,399 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,399 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job): ... idle for 0.004s
2026-05-01 00:58:01,403 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,403 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,404 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,411 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,412 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,413 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,414 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,414 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,414 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:02,415 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:02,416 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.005s
2026-05-01 00:58:02,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:02,416 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:02,416 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:03,417 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:03,417 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.006s
2026-05-01 00:58:03,417 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:03,418 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:03,418 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:04,419 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:04,419 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.007s
2026-05-01 00:58:04,419 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:04,419 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:04,419 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:05,421 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:05,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.008s
2026-05-01 00:58:05,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:05,421 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:05,421 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:05] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:58:06,422 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:06,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.009s
2026-05-01 00:58:06,423 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-05-01 00:58:06,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:06,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:06,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:07,424 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:07,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.010s
2026-05-01 00:58:07,425 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:07,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:07,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:08,426 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:08,426 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.011s
2026-05-01 00:58:08,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:08,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:08,427 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:09,428 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:09,428 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.013s
2026-05-01 00:58:09,428 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:09,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:09,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:10,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:10,430 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.014s
2026-05-01 00:58:10,430 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:10,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:10,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:11,431 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:11,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.015s
2026-05-01 00:58:11,432 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:11,433 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:11,433 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:12,434 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:12,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.016s
2026-05-01 00:58:12,434 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:12,434 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:12,434 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:12] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:58:13,436 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:13,436 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.017s
2026-05-01 00:58:13,436 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:13,436 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:13,436 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:14,438 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:14,438 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.018s
2026-05-01 00:58:14,438 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:14,438 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:14,438 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:15,439 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:15,440 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.019s
2026-05-01 00:58:15,440 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:15,440 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:15,440 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:15.956995" elapsed="0.001176"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:15.959241" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:58:15.958611" elapsed="0.000749"/>
</kw>
<arg>play.py.090.3</arg>
<arg>090_rt_constrain_play_2.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.921196" elapsed="0.038326"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:15.975013" level="INFO">Executing command 'cat play.py.090.4'.</msg>
<msg time="2026-05-01T00:58:16.004665" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:16.004850" level="INFO">${output_log} = 2026-05-01 00:58:01,389 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-05-01 00:58:01,389 DEBUG BGP-Thread-...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:15.974814" elapsed="0.030089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.005863" level="INFO">2026-05-01 00:58:01,389 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.185
2026-05-01 00:58:01,389 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job): Connected to ODL.
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job): Open message received.
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c40044700000101000002860000010500000184000002850000028100000186000002800000018500000204000001810000018000000104000002010000194600000205004700
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job): Generator initialisation
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706436
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Originator ID: None
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Cluster list: None
2026-05-01 00:58:01,390 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-05-01 00:58:01,391 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-05-01 00:58:01,391 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-05-01 00:58:01,391 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-05-01 00:58:01,391 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-05-01 00:58:01,391 INFO BGP-Thread-1 (job):   Let's go ...

2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706436 (0x7f000004)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000046002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-05-01 00:58:01,391 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000046002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,392 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,392 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:01,405 INFO BGP-Thread-1 (job): ... idle for 0.012s
2026-05-01 00:58:01,405 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,405 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,406 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,407 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,408 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-05-01 00:58:01,409 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,410 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,414 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,416 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Evpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Mvpn False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Allf True
2026-05-01 00:58:01,417 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:01,417 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:02,418 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.014s
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:02,419 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:03,420 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:03,420 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.015s
2026-05-01 00:58:03,420 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:03,420 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:03,421 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.016s
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:04,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:05,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.017s
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:05,424 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:06,425 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:06,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.018s
2026-05-01 00:58:06,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:06,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:06,426 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:07,427 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:07,427 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.019s
2026-05-01 00:58:07,427 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:07,427 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:07,427 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:08,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:08,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.020s
2026-05-01 00:58:08,429 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:08,429 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:08,429 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:09,430 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:09,431 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.021s
2026-05-01 00:58:09,431 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:09,431 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:09,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:10,432 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:10,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.022s
2026-05-01 00:58:10,432 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:10,432 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:10,432 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:11,434 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:11,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.023s
2026-05-01 00:58:11,434 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:11,434 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:11,434 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:12,435 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:12,435 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.024s
2026-05-01 00:58:12,436 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:12,436 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:12,436 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:13] "POST /RPC2 HTTP/1.1" 200 -
2026-05-01 00:58:13,437 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:13,437 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.025s
2026-05-01 00:58:13,438 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-05-01 00:58:13,438 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:13,438 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:13,438 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:14,439 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:14,439 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.027s
2026-05-01 00:58:14,440 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:14,440 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:14,440 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-05-01 00:58:15,441 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-05-01 00:58:15,441 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.028s
2026-05-01 00:58:15,441 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-05-01 00:58:15,441 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-05-01 00:58:15,441 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.142 - - [01/May/2026 00:58:15] "POST /RPC2 HTTP/1.1" 200 -</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.005272" elapsed="0.001164"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.007513" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_3.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/090_rt_constrain_play_3.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:58:16.006872" elapsed="0.000761"/>
</kw>
<arg>play.py.090.4</arg>
<arg>090_rt_constrain_play_3.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:15.974309" elapsed="0.033453"/>
</kw>
<kw name="Kill_All_BGP_Speakers" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.009529" level="INFO">${command} = ps axf | grep play.py | grep -v grep | awk '{print "kill -9 " $1}' | sh</msg>
<var>${command}</var>
<arg>ps axf | grep play.py | grep -v grep | awk '{print \"kill -9 \" $1}' | sh</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.008920" elapsed="0.000670"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.010743" level="INFO">[?2004l[2] 5895</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:16.009937" elapsed="0.000918"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.012371" level="INFO">[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:58:16.012583" level="INFO">${output} = [?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:58:16.011213" elapsed="0.001427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.013549" level="INFO">[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.012987" elapsed="0.000662"/>
</kw>
<doc>Kill all play.py processes.</doc>
<status status="PASS" start="2026-05-01T00:58:16.008248" elapsed="0.005519"/>
</kw>
<doc>Abort all Python speakers.</doc>
<status status="PASS" start="2026-05-01T00:58:15.776394" elapsed="0.237592"/>
</test>
<test id="s1-s19-t11" name="Delete_Bgp_Peers_Configuration" line="163">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:16.019003" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:16.018735" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.020304" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.020184" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.020163" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.027050" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.026941" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.026923" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.028162" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.027754" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.028672" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:16.028355" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:16.028743" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:16.028902" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:16.027353" elapsed="0.001573"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.034483" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.034361" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.034342" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.035736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.035629" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.035610" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:16.036252" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.035954" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.036670" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:16.036441" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.065353" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:16.037202" elapsed="0.028273"/>
</kw>
<msg time="2026-05-01T00:58:16.065637" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:16.065684" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.036861" elapsed="0.028901"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.105108" level="INFO">". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[78C[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:16.066286" elapsed="0.038948"/>
</kw>
<msg time="2026-05-01T00:58:16.105393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:16.105439" level="INFO">${message_wait} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.065942" elapsed="0.039555"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.105858" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.105576" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.105556" elapsed="0.000412"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.106425" level="INFO"> ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V "a "l "i "d "a "t "i "o "n ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "s "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[78C[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.106117" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.106819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.106596" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.106578" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:16.106929" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:16.109470" elapsed="0.000144"/>
</kw>
<msg time="2026-05-01T00:58:16.109675" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.108378" elapsed="0.001438"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.110099" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.110438" elapsed="0.000101"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:16.107761" elapsed="0.002890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:16.107206" elapsed="0.003508"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:16.035292" elapsed="0.075518"/>
</kw>
<msg time="2026-05-01T00:58:16.110900" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:16.110944" level="INFO">${message} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.034711" elapsed="0.076271"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:16.111165" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:16.111058" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.111040" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.162511" elapsed="0.000064"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.162978" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.163059" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:16.034025" elapsed="0.129178"/>
</kw>
<msg time="2026-05-01T00:58:16.163312" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:16.163358" level="INFO">${output} =  ". "t "x "t ". "0 "9 "0 "[C "B "g "p "[C "F "u "n "c "t "i "o "n "a "l "[C "R "t "[C "C "o "n "s "t "r "a "i "n "[C "V ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.029309" elapsed="0.134085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.163921" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.163503" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.163479" elapsed="0.000537"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:16.029159" elapsed="0.134892"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:16.028981" elapsed="0.135112"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:16.026569" elapsed="0.137584"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:16.019877" elapsed="0.144335"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.019417" elapsed="0.144841"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:16.015910" elapsed="0.148401"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.165547" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.2 | TYPE=external | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.164790" elapsed="0.000789"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.209417" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.209039" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.210280" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:16.210031" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:16.210471" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:16.209683" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.211058" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.210671" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.211405" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:16.211588" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:16.211254" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.212021" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.211778" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.213176" level="INFO">mapping: {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.212784" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.213677" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.213392" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.214368" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.214069" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.215150" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.214930" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.215241" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:16.215401" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.214602" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.215655" elapsed="0.000285"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:58:16.213928" elapsed="0.002054"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.216553" level="INFO">${value} = external</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.216238" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.217302" level="INFO">${encoded} = external</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.217093" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.217377" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.217547" level="INFO">${encoded_value} = external</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.216768" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.217730" elapsed="0.000220"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-05-01T00:58:16.216097" elapsed="0.001893"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.218559" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.218245" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.219337" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.219122" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.219414" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:58:16.219589" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.218778" elapsed="0.000835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.219772" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:16.218105" elapsed="0.001929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.220603" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.220290" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.221356" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.221148" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.221433" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:58:16.221601" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.220826" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.221784" elapsed="0.000219"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:16.220150" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.222609" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.222298" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.223367" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.223157" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.223460" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.223614" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.222824" elapsed="0.000814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.223795" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:16.222159" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.224804" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.224314" elapsed="0.000516"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.225571" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.225345" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.225646" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.225796" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.225023" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.225980" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:16.224171" elapsed="0.002108"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.226852" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.226553" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.227629" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.227399" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.227706" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.227856" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.227077" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.228038" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:16.226396" elapsed="0.001905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.213751" elapsed="0.014585"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.228379" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:16.228556" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:16.212439" elapsed="0.016143"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.212133" elapsed="0.016481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.228796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.228640" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.212115" elapsed="0.016759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.229712" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.229023" elapsed="0.000718"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.229790" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:16.208406" elapsed="0.021510"/>
</kw>
<msg time="2026-05-01T00:58:16.229976" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.195492" elapsed="0.034531"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.242867" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.255734" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.268516" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.268717" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.268940" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.269316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.269164" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:16.269150" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.269561" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.269739" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.269923" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:16.269120" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.269017" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.270160" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.270235" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:16.270357" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:16.191092" elapsed="0.079292"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.271522" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.271257" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:16.281746" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.281795" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.281901" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:16.274055" elapsed="0.007872"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.271638" elapsed="0.010329"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.282155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.281994" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.271620" elapsed="0.010618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.285691" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.283254" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.283025" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.283007" elapsed="0.002789"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.288421" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.286086" elapsed="0.002401"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.285853" elapsed="0.002670"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.285836" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.289122" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.288736" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.289506" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.289221" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.290106" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.289806" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.289628" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.289203" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.290742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.290362" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.291085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.290839" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.291651" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.291339" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.291165" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.290821" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.291890" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:16.292698" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.292404" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.292886" elapsed="0.002355"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:16.282615" elapsed="0.012688"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:16.295350" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:16.298042" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:58:16.270678" elapsed="0.027392"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.298126" elapsed="0.000029"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:58:16.165827" elapsed="0.132424"/>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="PASS" start="2026-05-01T00:58:16.164631" elapsed="0.133659"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.299224" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.3 | TYPE=internal | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.298568" elapsed="0.000685"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.343327" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.342949" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.344204" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:16.343894" elapsed="0.000385">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:16.344374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:16.343549" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.344981" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.344595" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.345315" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:16.345494" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:16.345178" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.346015" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.345765" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.347065" level="INFO">mapping: {'IP': '127.0.0.3', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.346802" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.347557" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.347275" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.348278" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.347978" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.349066" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.348851" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.349143" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:16.349301" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.348523" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.349503" elapsed="0.000232"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:58:16.347822" elapsed="0.001954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.350329" level="INFO">${value} = internal</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.350033" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.351099" level="INFO">${encoded} = internal</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.350887" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.351177" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.351332" level="INFO">${encoded_value} = internal</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.350560" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.351531" elapsed="0.000225"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-05-01T00:58:16.349893" elapsed="0.001904"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.352367" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.352067" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.353307" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.353097" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.353384" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.353553" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.352769" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.353738" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:16.351925" elapsed="0.002074"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.354572" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.354255" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.355332" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.355123" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.355406" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.355576" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.354792" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.355780" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:16.354113" elapsed="0.001929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.356660" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.356339" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.357407" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.357199" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.357499" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.357653" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.356878" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.357836" elapsed="0.000225"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:16.356194" elapsed="0.001908"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.358672" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.358357" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.359423" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.359212" elapsed="0.000256"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.359521" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:16.359688" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.358889" elapsed="0.000824"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.359874" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:16.358217" elapsed="0.001921"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.360712" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.360394" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.361472" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.361249" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.361549" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.361701" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.360927" elapsed="0.000799"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.361883" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:16.360254" elapsed="0.001890"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.347634" elapsed="0.014546"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.362224" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:16.362384" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:16.346467" elapsed="0.015944"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.346146" elapsed="0.016298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.362646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.362486" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.346122" elapsed="0.016600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.363557" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.362874" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.363637" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:16.342314" elapsed="0.021448"/>
</kw>
<msg time="2026-05-01T00:58:16.363817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.329292" elapsed="0.034573"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.376908" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.389869" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.402654" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.402858" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.403076" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.403465" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.403299" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:16.403285" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.403697" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.403872" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.404050" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:16.403254" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.403152" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.404282" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.404358" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:16.404496" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:16.324583" elapsed="0.079942"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.405639" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.405366" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:16.416305" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.416399" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.416519" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:16.407858" elapsed="0.008689"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.405752" elapsed="0.010835"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.416774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.416614" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.405734" elapsed="0.011124"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.421636" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.418259" elapsed="0.003439"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.417930" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.417904" elapsed="0.003879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.425495" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.422194" elapsed="0.003368"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.421861" elapsed="0.003749"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.421838" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.426485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.425900" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.426968" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.426625" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.427535" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.427223" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.427049" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.426600" elapsed="0.001020"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.428156" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.427792" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.428513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.428252" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.429061" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.428769" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.428594" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.428234" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.429300" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:16.430124" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.429836" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.430310" elapsed="0.002511"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:16.417337" elapsed="0.015548"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:16.432931" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:16.435261" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:58:16.404790" elapsed="0.030498"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.435342" elapsed="0.000028"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:58:16.299511" elapsed="0.135970"/>
</kw>
<var name="${i}">3</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-05-01T00:58:16.298400" elapsed="0.137121"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.436465" level="INFO">&amp;{ODL_CONFIG} = { IP=127.0.0.4 | TYPE=internal | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true }</msg>
<var>&amp;{ODL_CONFIG}</var>
<arg>IP=${ODL_${i}_IP}</arg>
<arg>TYPE=${type}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.435791" elapsed="0.000705"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.479850" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.479466" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.480650" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:16.480385" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:16.480819" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:16.480047" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.481399" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.481015" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:16.481753" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:16.481999" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:16.481614" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.482439" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.482194" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.483473" level="INFO">mapping: {'IP': '127.0.0.4', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.483204" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.483947" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.483686" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.484666" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.484339" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.485423" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.485212" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.485516" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:16.485670" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.484883" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.485853" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:58:16.484198" elapsed="0.001923"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.486851" level="INFO">${value} = internal</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.486375" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.487625" level="INFO">${encoded} = internal</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.487397" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.487701" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.487854" level="INFO">${encoded_value} = internal</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.487073" elapsed="0.000805"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.488034" elapsed="0.000221"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-05-01T00:58:16.486235" elapsed="0.002060"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.488878" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.488582" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.489682" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.489472" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.489757" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.489906" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.489135" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.490087" elapsed="0.000219"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:16.488409" elapsed="0.001938"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.490914" level="INFO">${value} = 17900</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.490617" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.491680" level="INFO">${encoded} = 17900</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.491470" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.491756" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.491906" level="INFO">${encoded_value} = 17900</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.491131" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.492089" elapsed="0.000220"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-05-01T00:58:16.490475" elapsed="0.001874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.492945" level="INFO">${value} = false</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.492648" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.493845" level="INFO">${encoded} = false</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.493639" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.493920" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.494069" level="INFO">${encoded_value} = false</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.493301" elapsed="0.000792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.494250" elapsed="0.000234"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-05-01T00:58:16.492507" elapsed="0.002018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.495069" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.494777" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.495830" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.495623" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.495906" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.496056" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.495284" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.496236" elapsed="0.000256"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:16.494638" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.497081" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:16.496789" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:16.498011" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.497801" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:16.498089" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:16.498239" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:16.497294" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.498419" elapsed="0.000235"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:16.496649" elapsed="0.002045"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.484022" elapsed="0.014707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:16.498774" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:16.498972" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'TYPE': 'internal', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:16.482877" elapsed="0.016122"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.482576" elapsed="0.016455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.499213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.499057" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.482557" elapsed="0.016732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.500104" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.499436" elapsed="0.000697"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.500192" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:16.478836" elapsed="0.021481"/>
</kw>
<msg time="2026-05-01T00:58:16.500371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.465923" elapsed="0.034495"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.513135" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.526159" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.538766" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.538969" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.539150" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.539570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.539394" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:16.539380" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.539797" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.539970" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.540140" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:16.539351" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.539249" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.540367" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.540492" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:58:16.540619" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:16.461499" elapsed="0.079147"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.541751" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.541499" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:16.550710" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01bkwp9t9b48vyp3sh2gloz7ft28.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.550757" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:16.550847" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:16.543958" elapsed="0.006914"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.541864" elapsed="0.009064"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.551188" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.550961" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.541846" elapsed="0.009458"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.556321" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.552730" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.552392" elapsed="0.004040"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.552368" elapsed="0.004123"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.559850" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.556891" elapsed="0.003006"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.556572" elapsed="0.003360"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.556548" elapsed="0.003409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.560555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.560156" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.560908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.560654" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.561478" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.561165" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.560989" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.560635" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.562099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.561739" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.562439" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.562195" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.563014" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.562717" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:16.562535" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.562177" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.563253" elapsed="0.000403"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:16.564110" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:16.563827" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.564293" elapsed="0.002453"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:16.551832" elapsed="0.014978"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:16.566858" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:16.569197" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:58:16.540910" elapsed="0.028314"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:16.569279" elapsed="0.000028"/>
</return>
<arg>${EBGP_DIR}</arg>
<arg>mapping=${ODL_CONFIG}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:58:16.436785" elapsed="0.132621"/>
</kw>
<var name="${i}">4</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-05-01T00:58:16.435635" elapsed="0.133810"/>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="PASS" start="2026-05-01T00:58:16.164375" elapsed="0.405124"/>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:58:16.014625" elapsed="0.554996"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:58:16.570408" elapsed="0.000460"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:16.571105" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:58:16.571031" elapsed="0.000157"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:58:16.570181" elapsed="0.001057"/>
</kw>
<doc>Functional test for bgp - route-target-constrain safi

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distbmution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite tests advertising rt-constrain routes to odl. For advertising from peer,
play.py is used, sending hex messages to odl.
There are 3 peers: ebgp and two ibgps. First peer sends l3vpn route with specific RT to odl, second peer
sends RT route and third peer only establishes connection. Then it is checked that odl advertizes l3vpn route
to second peer. Third peer sends wildcard RT route and it is checked that odl doesn't advertize l3vpn route
to it. Then second peer removes RT and it is checked that second peer withdrew RT route and that odl withdrew
l3vpn route from it.</doc>
<status status="FAIL" start="2026-05-01T00:57:59.166608" elapsed="17.404659"/>
</suite>
<suite id="s1-s20" name="Bgp Policies Default" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot">
<kw name="Start_Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.656749" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:16.652589" elapsed="0.004215"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:58:16.652310" elapsed="0.004578"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.661622" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:58:16.658037" elapsed="0.003613"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:58:16.661870" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.661741" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.661714" elapsed="0.000230"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.662466" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:16.662098" elapsed="0.000413"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.662981" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:58:16.662672" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:58:16.663531" elapsed="0.000285"/>
</kw>
<msg time="2026-05-01T00:58:16.663913" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:16.663961" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:16.663173" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.664577" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.664168" elapsed="0.000440"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.665612" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:16.665330" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.666130" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:16.665872" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.666621" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.666316" elapsed="0.000332"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.669703" elapsed="0.000211"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.670391" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.670071" elapsed="0.000346"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.670582" elapsed="0.000228"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.671602" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.671295" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:58:16.671674" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:58:16.671835" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:58:16.671005" elapsed="0.000854"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:16.672645" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18b283d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:58:16.672037" elapsed="0.000748"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.672949" elapsed="0.000189"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:58:16.669129" elapsed="0.004068"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:16.668936" elapsed="0.004306"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:58:16.666707" elapsed="0.006566"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.673850" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:16.673437" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.674446" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:16.674053" elapsed="0.000451"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.675047" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:16.674666" elapsed="0.000422"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:58:16.664880" elapsed="0.010265"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:58:16.657696" elapsed="0.017505"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:16.675379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:16.675266" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.675248" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.678493" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:16.678103" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.678972" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:16.678678" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:16.679043" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:16.679199" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:16.677783" elapsed="0.001440"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:16.680257" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.679995" elapsed="0.000288"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.681047" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:58:16.681147" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:58:16.680877" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:16.684596" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:16.684012" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:16.683992" elapsed="0.000729"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.685358" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:58:16.685610" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:58:16.684918" elapsed="0.000744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.686595" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:16.685926" elapsed="0.000775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.687885" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:16.686967" elapsed="0.000972"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:58:16.689986" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:58:16.690162" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:58:16.689481" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.690562" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:58:16.692316" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:58:17.293249" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:58:16 UTC 2026

  System load:  0.19               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:58:00 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:58:16.691964" elapsed="0.601462"/>
</kw>
<msg time="2026-05-01T00:58:17.293545" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.691522" elapsed="0.602217"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:58:16.688375" elapsed="0.605587"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.295146" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:58:17.308566" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:58:17.308976" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:58:17.309174" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:17.294486" elapsed="0.014788"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.309996" elapsed="0.001577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.314489" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:17.313018" elapsed="0.001844"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.315833" elapsed="0.000146"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.315235" elapsed="0.000962"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.315182" elapsed="0.001129"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:58:17.317159" elapsed="0.000150"/>
</return>
<status status="PASS" start="2026-05-01T00:58:17.316582" elapsed="0.001131"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.316531" elapsed="0.001316"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.317994" elapsed="0.000020"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.321367" elapsed="0.000602"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.322255" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.322856" elapsed="0.000242"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:17.318532" elapsed="0.004640"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:58:16.683027" elapsed="0.640325"/>
</kw>
<msg time="2026-05-01T00:58:17.323413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.682323" elapsed="0.641168"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:58:16.681846" elapsed="0.641731"/>
</kw>
<msg time="2026-05-01T00:58:17.323620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.681329" elapsed="0.642340"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.326496" elapsed="0.000335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.327000" elapsed="0.000162"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.327311" elapsed="0.000102"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:17.323972" elapsed="0.003511"/>
</kw>
<msg time="2026-05-01T00:58:17.327583" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:58:16.680520" elapsed="0.647089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.328082" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:17.327820" elapsed="0.000306"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:58:17.328174" elapsed="0.000036"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:58:16.679594" elapsed="0.648718"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:16.679400" elapsed="0.648952"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:16.679274" elapsed="0.649116"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:58:16.675686" elapsed="0.652778"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:58:17.328633" elapsed="0.000235"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.343207" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.343062" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.343036" elapsed="0.000256"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.343690" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:58:17.343807" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.343508" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.344293" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:17.343997" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.344894" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:17.344604" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:17.345778" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:58:17.345540" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:58:17.346000" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:58:17.346048" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.345113" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.346381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:17.346151" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.346131" elapsed="0.000370"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:17.347281" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.347006" elapsed="0.000302"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:58:17.347358" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:17.347534" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:58:17.346723" elapsed="0.000838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.347718" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.348422" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:58:17.348545" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.348311" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.348763" elapsed="0.002226"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.351432" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:58:17.492564" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.351159" elapsed="0.141560"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.496392" elapsed="0.000389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.496950" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.497429" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:17.493856" elapsed="0.003764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:17.493141" elapsed="0.004526"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.342658" elapsed="0.155060"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:58:17.329738" elapsed="0.168029"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.329278" elapsed="0.168544"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:17.329093" elapsed="0.168834"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:58:17.328931" elapsed="0.169034"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:58:16.657228" elapsed="0.840799"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.500702" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.500582" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.500561" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.505509" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.505355" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.505338" elapsed="0.000241"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.506547" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:17.506143" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.507033" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:17.506735" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:17.507106" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:58:17.507272" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:17.505807" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.512696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.512586" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.512566" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.514041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:17.513912" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.513894" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:17.514602" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.514260" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.515122" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:17.514836" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.549224" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "b "g "p "[78Cc "[A[78Ce</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:17.515894" elapsed="0.033535"/>
</kw>
<msg time="2026-05-01T00:58:17.549633" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:17.549682" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.515349" elapsed="0.034370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.621093" level="INFO">"p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "p "o "[78Cl "[A[78Ci
 "c "i "e "s "_ "d "e "f "a "u "l "t ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:17.550676" elapsed="0.070660"/>
</kw>
<msg time="2026-05-01T00:58:17.621546" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:17.621594" level="INFO">${message_wait} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.549958" elapsed="0.071672"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.622110" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:17.621753" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.621715" elapsed="0.000582"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.622936" level="INFO"> "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "b "g "p "c "e "p "/ "b "g "p "f "u "n "c "t "/ "b "g "p "_ "p "o "[78Cl "[A[78Ci
 "c "i "e "s "_ "d "e "f "a "u "l "t ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:17.622450" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.623422" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:17.623174" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.623154" elapsed="0.000469"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:17.623664" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.626111" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.626957" elapsed="0.000312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:58:17.627624" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:17.625304" elapsed="0.002654"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:17.623991" elapsed="0.004106"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:17.513623" elapsed="0.114579"/>
</kw>
<msg time="2026-05-01T00:58:17.628297" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:17.628343" level="INFO">${message} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.512921" elapsed="0.115459"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:17.628750" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:17.628635" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.628441" elapsed="0.000399"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.629261" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.629625" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:17.629699" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:17.512245" elapsed="0.117564"/>
</kw>
<msg time="2026-05-01T00:58:17.629903" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:17.629949" level="INFO">${output} =  "p "- "c "s "i "t "- "1 "n "o "d "e "- "u "s "e "r "f "e "a "t "u "r "e "s "- "a "l "l "- "v "a "n "a "d "i "u "m "/ "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.507692" elapsed="0.122293"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:17.630312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:17.630061" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:17.630043" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:17.507546" elapsed="0.122868"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:17.507355" elapsed="0.123090"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:17.505065" elapsed="0.125453"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-01T00:58:17.498676" elapsed="0.131899"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:17.498211" elapsed="0.132407"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-01T00:58:16.651996" elapsed="0.978796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.631316" level="INFO">${conn_id} = 7</msg>
<var>${conn_id}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<arg>prompt=${DEFAULT_LINUX_PROMPT}</arg>
<arg>timeout=10s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:58:17.630957" elapsed="0.000385"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.631901" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:58:17.631582" elapsed="0.000361"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.633723" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:58:17.633801" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:58:17.633425" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.634038" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.635249" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:58:17.943770" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:58:16 UTC 2026

  System load:  0.19               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:58:17 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:58:17.634931" elapsed="0.308925"/>
</kw>
<msg time="2026-05-01T00:58:17.943919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.634548" elapsed="0.309431"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:58:17.632990" elapsed="0.311075"/>
</kw>
<msg time="2026-05-01T00:58:17.944115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.632601" elapsed="0.311559"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:58:17.632146" elapsed="0.312101"/>
</kw>
<kw name="Virtual_Env_Create" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:17.950215" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:17.949883" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:17.951851" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:58:18.227368" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:18.227760" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 132ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-05-01T00:58:18.227868" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:58:18.227961" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:17.951665" elapsed="0.276351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.229997" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:58:18.229367" elapsed="0.000734"/>
</kw>
<msg time="2026-05-01T00:58:18.230312" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:58:18.230412" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:18.228523" elapsed="0.001968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.231852" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:18.230883" elapsed="0.001028"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.234394" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 132ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/jenkins/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:18.233787" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.235474" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:18.234910" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.236418" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:18.235902" elapsed="0.000641"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:58:18.232909" elapsed="0.003754"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:18.232096" elapsed="0.004650"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:18.232048" elapsed="0.004756"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:58:18.237161" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:18.236931" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:18.236894" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:58:18.237800" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-05-01T00:58:18.237594" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:18.237557" elapsed="0.000442"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:18.238349" elapsed="0.000050"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:58:17.950953" elapsed="0.287753"/>
</kw>
<msg time="2026-05-01T00:58:18.238836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.950405" elapsed="0.288541"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the virtualenv /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:58:17.949257" elapsed="0.289836"/>
</kw>
<msg time="2026-05-01T00:58:18.239150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:17.945162" elapsed="0.294033"/>
</kw>
<arg>virtualenv ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:58:17.944808" elapsed="0.294493"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:18.239492" elapsed="0.000315"/>
</kw>
<arg>upgrade_pip=False</arg>
<doc>Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:58:17.944491" elapsed="0.295383"/>
</kw>
<kw name="Virtual_Env_Install_Package" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Virtual_Env_Run_Cmd_At_Cwd" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:18.247013" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:18.246667" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:18.248871" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate'.</msg>
<msg time="2026-05-01T00:58:43.363899" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:43.364517" level="INFO">${stdout} = Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 37.9 MB/s eta 0:00:00
Installing collected packages: exabgp
Suc...</msg>
<msg time="2026-05-01T00:58:43.364705" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:58:43.364814" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:18.248499" elapsed="25.116375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.369638" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:58:43.368346" elapsed="0.001538"/>
</kw>
<msg time="2026-05-01T00:58:43.370209" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:58:43.370310" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:43.365584" elapsed="0.004777"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.372811" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:43.370892" elapsed="0.001981"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.377320" level="INFO">Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 37.9 MB/s eta 0:00:00
Installing collected packages: exabgp
Successfully installed exabgp-4.0.5</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:43.376936" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.378120" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:43.377802" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.378811" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:43.378494" elapsed="0.000386"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:58:43.374930" elapsed="0.004128"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:43.373180" elapsed="0.005985"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:43.373127" elapsed="0.006070"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:58:43.379411" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:43.379259" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:43.379241" elapsed="0.000312"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:58:43.379743" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-05-01T00:58:43.379610" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:43.379593" elapsed="0.000300"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:43.380051" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:58:18.247872" elapsed="25.132323"/>
</kw>
<msg time="2026-05-01T00:58:43.380255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:18.247205" elapsed="25.133108"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:58:18.246031" elapsed="25.134382"/>
</kw>
<msg time="2026-05-01T00:58:43.380484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:18.242050" elapsed="25.138496"/>
</kw>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:58:18.241504" elapsed="25.139135"/>
</kw>
<msg time="2026-05-01T00:58:43.380690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Cwd_Should_Pass</arg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate; ${cmd}; deactivate</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:18.241110" elapsed="25.139624"/>
</kw>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs given command within activated virtual env and returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:58:18.240740" elapsed="25.140079"/>
</kw>
<msg time="2026-05-01T00:58:43.380863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install ${package}</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:18.240349" elapsed="25.140558"/>
</kw>
<arg>exabgp==4.0.5</arg>
<doc>Installs python package into virtual env. Use with version if needed (e.g. exabgp==3.4.16). Returns stdout.</doc>
<status status="PASS" start="2026-05-01T00:58:18.240086" elapsed="25.140902"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:43.381444" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19e16210&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:58:43.381149" elapsed="0.000547"/>
</kw>
<kw name="Upload_Config_Files">
<for flavor="IN">
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.413986" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:58:43.422697" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp1.cfg' -&gt; '/home/jenkins//exabgp1.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.382334" elapsed="0.040544"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:43.382191" elapsed="0.040783"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.439802" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp2.cfg' -&gt; '/home/jenkins//exabgp2.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.423449" elapsed="0.016539"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-05-01T00:58:43.423171" elapsed="0.016923"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.454719" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp3.cfg' -&gt; '/home/jenkins//exabgp3.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.440980" elapsed="0.013881"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-05-01T00:58:43.440605" elapsed="0.014464"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.466756" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp4.cfg' -&gt; '/home/jenkins//exabgp4.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.455669" elapsed="0.011207"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-05-01T00:58:43.455288" elapsed="0.011659"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.474902" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp5.cfg' -&gt; '/home/jenkins//exabgp5.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.467553" elapsed="0.007485"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-05-01T00:58:43.467159" elapsed="0.007968"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.485214" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/exabgp_configs/exabgp6.cfg' -&gt; '/home/jenkins//exabgp6.cfg'</msg>
<arg>${POLICIES_VAR}/exabgp_configs/exabgp${index}.cfg</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:58:43.475690" elapsed="0.009619"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-05-01T00:58:43.475328" elapsed="0.010043"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-05-01T00:58:43.382052" elapsed="0.103366"/>
</for>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.498107" level="INFO">10 files:
exa4.cfg
exabgp1.cfg
exabgp2.cfg
exabgp3.cfg
exabgp4.cfg
exabgp5.cfg
exabgp6.cfg
exabgp_graceful_restart.cfg
exaipv4.cfg
exaipv6.cfg</msg>
<msg time="2026-05-01T00:58:43.498381" level="INFO">@{cfgfiles} = [ exa4.cfg | exabgp1.cfg | exabgp2.cfg | exabgp3.cfg | exabgp4.cfg | exabgp5.cfg | exabgp6.cfg | exabgp_graceful_restart.cfg | exaipv4.cfg | exaipv6.cfg ]</msg>
<var>@{cfgfiles}</var>
<arg>.</arg>
<arg>*.cfg</arg>
<doc>A wrapper for `List Directory` that returns only files.</doc>
<status status="PASS" start="2026-05-01T00:58:43.485704" elapsed="0.012741"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.499718" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:58:43.512766" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.499310" elapsed="0.013542"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.513564" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:58:43.560261" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.513183" elapsed="0.047251"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.561200" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-05-01T00:58:43.612630" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.560868" elapsed="0.051946"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.613705" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-05-01T00:58:43.664228" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:43.664484" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 4210010000;
    peer-as 4210010000;

    capability {
        route-refresh disable;
     ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.613277" elapsed="0.051257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.665354" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 4210010000;
    peer-as 4210010000;

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:43.664891" elapsed="0.000536"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-05-01T00:58:43.498983" elapsed="0.166519"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.666160" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp1.cfg'.</msg>
<msg time="2026-05-01T00:58:43.716657" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.665912" elapsed="0.050914"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.717510" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-05-01T00:58:43.770777" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.717200" elapsed="0.053778"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.771809" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-05-01T00:58:43.825578" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.771414" elapsed="0.054314"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.826342" level="INFO">Executing command 'cat exabgp1.cfg'.</msg>
<msg time="2026-05-01T00:58:43.876809" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:43.877159" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.1;
    local-address 127.0.0.1;
    local-as 64496;
    peer-as 64496;

    static {
        route 1.1.1.1/24 {
            next-hop 11.0.255.254;
      ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.826061" elapsed="0.051168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:43.878580" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.1;
    local-address 127.0.0.1;
    local-as 64496;
    peer-as 64496;

    static {
        route 1.1.1.1/24 {
            next-hop 11.0.255.254;
            community [ 30741:30741 30741:0 ];
        }
    }

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:43.877803" elapsed="0.001027"/>
</kw>
<var name="${cfgfile}">exabgp1.cfg</var>
<status status="PASS" start="2026-05-01T00:58:43.665691" elapsed="0.213233"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.879642" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp2.cfg'.</msg>
<msg time="2026-05-01T00:58:43.933645" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.879370" elapsed="0.054450"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.934735" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-05-01T00:58:43.984608" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.934314" elapsed="0.050477"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:43.985699" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-05-01T00:58:44.037447" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:43.985262" elapsed="0.052411"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:44.038564" level="INFO">Executing command 'cat exabgp2.cfg'.</msg>
<msg time="2026-05-01T00:58:45.308378" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:45.308743" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.2;
    local-address 127.0.0.2;
    local-as 64496;
    peer-as 64496;

    static {
        route 2.1.1.0/24 {
            next-hop 12.0.255.254;
      ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:44.038147" elapsed="1.270664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:45.310185" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.2;
    local-address 127.0.0.2;
    local-as 64496;
    peer-as 64496;

    static {
        route 2.1.1.0/24 {
            next-hop 12.0.255.254;
        }
        route 2.2.1.0/24 {
            next-hop 12.1.255.254;
        }
        route 2.3.1.0/24 {
            next-hop 12.3.255.254;
        }
    }

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:45.309517" elapsed="0.000779"/>
</kw>
<var name="${cfgfile}">exabgp2.cfg</var>
<status status="PASS" start="2026-05-01T00:58:43.879146" elapsed="1.431230"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.311447" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp3.cfg'.</msg>
<msg time="2026-05-01T00:58:45.672449" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.311067" elapsed="0.361606"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.673385" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-05-01T00:58:45.724315" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.673060" elapsed="0.051497"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.725421" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-05-01T00:58:45.777293" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.725035" elapsed="0.052566"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.778641" level="INFO">Executing command 'cat exabgp3.cfg'.</msg>
<msg time="2026-05-01T00:58:45.828094" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:45.828447" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.3;
    local-address 127.0.0.3;
    local-as 64496;
    peer-as 64496;

    static {
        route 103.36.0.5/24 {
            rd 3548:478513974;
       ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.778181" elapsed="0.050377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:45.829855" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.3;
    local-address 127.0.0.3;
    local-as 64496;
    peer-as 64496;

    static {
        route 103.36.0.5/24 {
            rd 3548:478513974;
            as-path [ 35000 64000 60000 ];
            next-hop 104.36.0.254;
            originator-id 27.4.5.6;
            local-preference 100;
            community [ 64000:43 ];
            extended-community [ target:24563:7.35.75.46 ];
            label 256;
        }
	}

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:45.829097" elapsed="0.000871"/>
</kw>
<var name="${cfgfile}">exabgp3.cfg</var>
<status status="PASS" start="2026-05-01T00:58:45.310706" elapsed="0.519381"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.831194" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp4.cfg'.</msg>
<msg time="2026-05-01T00:58:45.876607" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.830802" elapsed="0.046019"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.877756" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-05-01T00:58:45.929074" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.877331" elapsed="0.051961"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.930382" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-05-01T00:58:45.981525" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.929887" elapsed="0.051849"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:45.982704" level="INFO">Executing command 'cat exabgp4.cfg'.</msg>
<msg time="2026-05-01T00:58:46.033076" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:46.033309" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.4;
    local-address 127.0.0.4;
    local-as 64496;
    peer-as 64496;

    static {
        route 4.1.1.0/24 {
            next-hop 14.0.255.254;
      ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:45.982260" elapsed="0.051271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:46.034684" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.4;
    local-address 127.0.0.4;
    local-as 64496;
    peer-as 64496;

    static {
        route 4.1.1.0/24 {
            next-hop 14.0.255.254;
            community [ 30740:30740 30740:0 ];
        }
    }

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:46.034024" elapsed="0.000771"/>
</kw>
<var name="${cfgfile}">exabgp4.cfg</var>
<status status="PASS" start="2026-05-01T00:58:45.830384" elapsed="0.204488"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.035931" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp5.cfg'.</msg>
<msg time="2026-05-01T00:58:46.090141" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.035553" elapsed="0.054736"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.091043" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-05-01T00:58:46.146772" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.090719" elapsed="0.056194"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.147658" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-05-01T00:58:46.202400" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.147293" elapsed="0.055352"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.203639" level="INFO">Executing command 'cat exabgp5.cfg'.</msg>
<msg time="2026-05-01T00:58:46.257131" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:46.257527" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.5;
    local-address 127.0.0.5;
    local-as 64496;
    peer-as 64496;

    static {
        route 5.1.1.0/24 {
            next-hop 15.0.255.254;
      ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.203160" elapsed="0.054440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:46.258989" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.5;
    local-address 127.0.0.5;
    local-as 64496;
    peer-as 64496;

    static {
        route 5.1.1.0/24 {
            next-hop 15.0.255.254;
            extended-community 31740:31740 extended-community [ 32740:32740 32740:0 ];
        }
    }

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:46.258265" elapsed="0.000839"/>
</kw>
<var name="${cfgfile}">exabgp5.cfg</var>
<status status="PASS" start="2026-05-01T00:58:46.035190" elapsed="0.223993"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.260217" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.308342" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.259819" elapsed="0.048696"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.309200" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.362527" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.308886" elapsed="0.053789"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.363405" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.417794" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.363058" elapsed="0.055036"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.419232" level="INFO">Executing command 'cat exabgp6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.471282" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:46.471765" level="INFO">${stdout} = neighbor 10.30.170.185 {
    router-id 127.0.0.6;
    local-address 127.0.0.6;
    local-as 64496;
    peer-as 64496;

    static {
        route 2001:4B50:20C0::/48 {
            rd 3215:583457597;
 ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.418709" elapsed="0.053123"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:46.473378" level="INFO">neighbor 10.30.170.185 {
    router-id 127.0.0.6;
    local-address 127.0.0.6;
    local-as 64496;
    peer-as 64496;

    static {
        route 2001:4B50:20C0::/48 {
            rd 3215:583457597;
            as-path [ 25186 65000 64512 ];
            next-hop ::FFFF;
            originator-id 57.35.2.240;
            local-preference 100;
            community [ 65000:33 ];
            extended-community [ target:10283:4.249.92.120 ];
            label 926;
        }
    }

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        all
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:46.472505" elapsed="0.002150"/>
</kw>
<var name="${cfgfile}">exabgp6.cfg</var>
<status status="PASS" start="2026-05-01T00:58:46.259479" elapsed="0.215316"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.475867" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:58:46.524704" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.475480" elapsed="0.049436"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.525674" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:58:46.576862" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.525299" elapsed="0.051805"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.578397" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:58:46.629363" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.577941" elapsed="0.051749"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.630686" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-05-01T00:58:46.681165" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:46.681665" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        graceful-restart 40;
    }

    family...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.630252" elapsed="0.051487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:46.683117" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        graceful-restart 40;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:46.682308" elapsed="0.000958"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-05-01T00:58:46.475109" elapsed="0.208258"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.684581" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:58:46.733858" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.684137" elapsed="0.049902"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.734733" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:58:46.788967" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.734407" elapsed="0.054827"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.790249" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:58:46.841604" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.789822" elapsed="0.051986"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.842790" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-05-01T00:58:46.892903" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:46.893265" level="INFO">${stdout} = neighbor 10.30.170.185 {
                  router-id 127.0.0.1;
                  local-address 127.0.0.1;
                  local-as 64496;
                  peer-as 64496;
                  family {...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.842333" elapsed="0.050981"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:46.894412" level="INFO">neighbor 10.30.170.185 {
                  router-id 127.0.0.1;
                  local-address 127.0.0.1;
                  local-as 64496;
                  peer-as 64496;
                  family {
                        ipv4 unicast;
                  }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:46.893831" elapsed="0.000682"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-05-01T00:58:46.683719" elapsed="0.210849"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.895278" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.185/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.941410" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.895011" elapsed="0.046631"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.942338" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:58:46.993188" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ROUTEREFRESH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.942032" elapsed="0.051381"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:46.994367" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:58:47.045903" level="INFO">Command exited with return code 0.</msg>
<arg>sed -i -e 's/ADDPATH/disable/g' ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:46.993952" elapsed="0.052114"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.046945" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-05-01T00:58:47.097827" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:58:47.098171" level="INFO">${stdout} = neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        route-refresh disable;
        add-pat...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:58:47.046568" elapsed="0.051667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.099562" level="INFO">neighbor ::1 {
    router-id 1.2.3.4;
    local-address 2607:f0d0:1002:0011:0000:0000:0000:0002;
    local-as 64496;
    peer-as 64496;

    capability {
        route-refresh disable;
        add-path disable;
    }

    family {
        ipv6 unicast;
    }

    static {
        route 2a04:6d80::1/128 next-hop self;
    }
}</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.098816" elapsed="0.000859"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-05-01T00:58:46.894778" elapsed="0.204973"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-05-01T00:58:43.498617" elapsed="3.601215"/>
</for>
<doc>Uploads exabgp config files and replaces variables within those
config files with desired values.</doc>
<status status="PASS" start="2026-05-01T00:58:43.381924" elapsed="3.718052"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:16.651639" elapsed="30.448452"/>
</kw>
<test id="s1-s20-t1" name="Verify_Rib_Empty" line="40">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:47.105434" elapsed="0.000315"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:47.105057" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.107283" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.107100" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.107068" elapsed="0.000319"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.113869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.113763" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.113745" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.114933" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.114549" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.115415" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:47.115123" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:47.115501" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:58:47.115666" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.114164" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.121041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.120929" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.120910" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.122291" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.122183" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.122165" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:47.122839" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.122533" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.123244" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:47.123026" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.155443" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:47.123778" elapsed="0.031913"/>
</kw>
<msg time="2026-05-01T00:58:47.155927" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:47.155975" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.123428" elapsed="0.032602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.177093" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:47.156776" elapsed="0.020442"/>
</kw>
<msg time="2026-05-01T00:58:47.177400" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:47.177446" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "E "m "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.156296" elapsed="0.021209"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.177891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.177617" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.177585" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.178439" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "E "m "p "t "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.178120" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.178809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.178592" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.178573" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:47.178993" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:47.181605" elapsed="0.000147"/>
</kw>
<msg time="2026-05-01T00:58:47.181814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.180536" elapsed="0.001420"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.182231" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.182587" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:47.179886" elapsed="0.002890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:47.179310" elapsed="0.003530"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:47.121882" elapsed="0.061057"/>
</kw>
<msg time="2026-05-01T00:58:47.183032" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:47.183076" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "E "m "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.121267" elapsed="0.061847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:47.183298" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:47.183191" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.183172" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.183814" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.184158" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.184230" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:47.120570" elapsed="0.063772"/>
</kw>
<msg time="2026-05-01T00:58:47.184446" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:47.184506" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "E "m "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.116065" elapsed="0.068478"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.184884" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.184619" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.184601" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:47.115923" elapsed="0.069063"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:47.115746" elapsed="0.069274"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:47.113384" elapsed="0.071693"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:47.106684" elapsed="0.078449"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.106038" elapsed="0.079140"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:47.101607" elapsed="0.083624"/>
</kw>
<kw name="Verify_Rib_Status_Empty">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.235796" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.235374" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.236693" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.236338" elapsed="0.000455">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.236890" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.236000" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.237488" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.237079" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.237816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:47.237989" level="INFO">${template} = /rests/data/network-topology:network-topology/topology=example-ipv4-topology
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:47.237678" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.238424" level="INFO">/rests/data/network-topology:network-topology/topology=example-ipv4-topology
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.238176" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.239487" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.239176" elapsed="0.000360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.239967" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.239696" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.240319" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.240546" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.240718" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:58:47.240186" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.240043" elapsed="0.000805"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:47.240892" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:47.241053" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:47.238859" elapsed="0.002219"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.238560" elapsed="0.002550"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.241281" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.241135" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.238541" elapsed="0.002814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.241955" level="INFO">${final_text} = /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.241514" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.242030" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.234758" elapsed="0.007397"/>
</kw>
<msg time="2026-05-01T00:58:47.242209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.222307" elapsed="0.019950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.254500" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.266641" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.278596" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.278794" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.278969" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.279334" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.279190" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:47.279176" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.279567" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.279734" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.279898" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:47.279147" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.279044" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.280122" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.280198" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:47.280316" level="INFO">${uri} = /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:47.218023" elapsed="0.062318"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.281973" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.281721" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.282135" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.281342" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.282491" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.282230" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.283033" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.282745" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.282574" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.282211" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.285402" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.283265" elapsed="0.002164"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:47.285493" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:47.285697" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:47.280686" elapsed="0.005037"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.286940" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.286704" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.287096" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.286350" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:47.287327" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:47.287191" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.287173" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.287574" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.287744" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.287809" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:47.289851" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:47.286029" elapsed="0.003849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.291264" level="INFO">/rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.291018" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.291717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.291476" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:47.306528" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology 
 path_url=/rests/data/network-topology:network-topology/topology=example-ipv4-topology 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:47.306995" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:58:47 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '223'} 
 body={"network-topology:topology":[{"topology-id":"example-ipv4-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]} 
 </msg>
<msg time="2026-05-01T00:58:47.307320" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:47.293842" elapsed="0.013521"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.291827" elapsed="0.015613"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.307811" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.307521" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.291810" elapsed="0.016186"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.313070" level="INFO">{"network-topology:topology":[{"topology-id":"example-ipv4-topology","odl-bgp-topology-config:rib-id":"example-bgp-rib","server-provided":true,"topology-types":{"odl-bgp-topology-types:bgp-ipv4-reachability-topology":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.309652" elapsed="0.003491"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.309298" elapsed="0.003893"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.309269" elapsed="0.003958"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.316784" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.313635" elapsed="0.003213"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.313305" elapsed="0.003591"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.313282" elapsed="0.003649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.317759" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.317180" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.318225" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.317897" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.319102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.318678" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.318423" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.317871" elapsed="0.001359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.320022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.319483" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.320524" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.320165" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.321311" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.320926" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.320645" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.320139" elapsed="0.001256"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.321565" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:47.322384" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.322080" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.322579" elapsed="0.002270"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:47.308596" elapsed="0.016317"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.325097" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.324985" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.324966" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:47.327940" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.325316" elapsed="0.002653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:58:47.328021" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:58:47.328190" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:47.290196" elapsed="0.038022"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.328281" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:47.328436" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:47.195866" elapsed="0.132612"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.356084" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.355616" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.356974" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.356634" elapsed="0.000468">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.357280" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.356277" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.358204" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.357730" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.358576" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:47.358739" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "example-ipv4-topology",
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:47.358397" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.359186" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "example-ipv4-topology",
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,
            "topology-types": {
                "odl-bgp-topology-types:bgp-ipv4-reachability-topology": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.358921" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:47.359726" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.359303" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.360472" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.359957" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.359812" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.359284" elapsed="0.001274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.361199" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "example-ipv4-topology",
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.360726" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.361276" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.354987" elapsed="0.006419"/>
</kw>
<msg time="2026-05-01T00:58:47.361482" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.342774" elapsed="0.018760"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.373678" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.385738" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.405345" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.405707" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.406011" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.406505" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.406329" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:47.406309" elapsed="0.000284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.406741" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.406913" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.407084" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:47.406259" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.406102" elapsed="0.001066"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.407319" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.407403" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:58:47.407584" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "example-ipv4-topology",
            "odl-bgp-topology-config:rib-id": "example-bgp-rib",
            "server-provided": true,...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:47.340161" elapsed="0.067453"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.407798" elapsed="0.002568"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:47.411578" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.411212" elapsed="0.000396"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:47.412059" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "odl-bgp-topology-config:rib-id": "example-bgp-rib",
   "server-provided": true,
   "topology-id": "example-ipv4-topology",
   "topology-types": {
    "odl-bgp...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.411764" elapsed="0.000323"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:58:47.412243" elapsed="0.000498"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:58:47.410770" elapsed="0.002036"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.410470" elapsed="0.002371"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.413021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.412868" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.410433" elapsed="0.002665"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:58:47.329642" elapsed="0.083507"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:58:47.328827" elapsed="0.084402"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.328565" elapsed="0.084711"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.328548" elapsed="0.084752"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.413336" elapsed="0.000043"/>
</return>
<arg>${POLICIES_VAR}/topology_state</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:58:47.189807" elapsed="0.223703"/>
</kw>
<arg>60s</arg>
<arg>3s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${POLICIES_VAR}/topology_state</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:58:47.185671" elapsed="0.227899"/>
</kw>
<doc>Checks that example-ipv4-topology is ready, and therefore full rib is ready to be configured.</doc>
<status status="PASS" start="2026-05-01T00:58:47.185380" elapsed="0.228308"/>
</kw>
<doc>Checks empty example-ipv4-topology ready.</doc>
<status status="PASS" start="2026-05-01T00:58:47.100242" elapsed="0.313563"/>
</test>
<test id="s1-s20-t2" name="Configure_App_Peer" line="44">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:47.417028" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:47.416756" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.418320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.418204" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.418184" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.423257" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.423147" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.423129" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.424339" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.423953" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.424865" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:47.424543" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:47.424936" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:47.425094" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.423576" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.430775" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.430665" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.430645" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.432044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:47.431936" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.431918" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:47.432580" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.432258" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.433026" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:47.432802" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.473393" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:47.433567" elapsed="0.040121"/>
</kw>
<msg time="2026-05-01T00:58:47.473999" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:47.474070" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.433210" elapsed="0.040913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:47.497936" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:47.475105" elapsed="0.022946"/>
</kw>
<msg time="2026-05-01T00:58:47.498219" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:47.498266" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.474498" elapsed="0.023805"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.498743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.498437" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.498394" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.499296" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.498981" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.499761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.499540" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.499520" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:47.499884" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:47.502730" elapsed="0.000152"/>
</kw>
<msg time="2026-05-01T00:58:47.502946" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.501573" elapsed="0.001513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.503369" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.503750" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:47.500890" elapsed="0.003052"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:47.500233" elapsed="0.003777"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:47.431633" elapsed="0.072477"/>
</kw>
<msg time="2026-05-01T00:58:47.504207" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:47.504404" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.430998" elapsed="0.073445"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:47.504932" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-05-01T00:58:47.504544" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.504524" elapsed="0.000526"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.505519" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.505868" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.505941" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:47.430306" elapsed="0.075759"/>
</kw>
<msg time="2026-05-01T00:58:47.506164" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:47.506208" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "C "o "n "f "i "g "u "r "e "_ "A "p "p "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.425507" elapsed="0.080740"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.506605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.506326" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.506308" elapsed="0.000378"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:47.425349" elapsed="0.081361"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:47.425174" elapsed="0.081580"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:47.422780" elapsed="0.084038"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:47.417914" elapsed="0.088965"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:47.417468" elapsed="0.089459"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:47.414615" elapsed="0.092370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.507768" level="INFO">&amp;{mapping} = { RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.185 }</msg>
<var>&amp;{mapping}</var>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>APP_PEER_ID=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.507165" elapsed="0.000634"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.541917" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.541541" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.542747" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.542470" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.542923" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.542119" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.543509" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.543110" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.543834" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:47.544010" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:47.543696" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.544434" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.544191" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.545495" level="INFO">mapping: {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.545224" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.545960" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.545698" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.546665" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.546350" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:47.547421" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.547200" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:47.547513" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:47.547666" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:47.546880" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.547841" elapsed="0.000240"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:47.546216" elapsed="0.001904"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.548694" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.548365" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:47.549633" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.549403" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:47.549709" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:47.549862" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:47.548903" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.550035" elapsed="0.000221"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:58:47.548234" elapsed="0.002062"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.550855" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.550557" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:47.551642" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.551380" elapsed="0.000288"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:47.551717" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:47.551868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:47.551066" elapsed="0.000826"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.552039" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:47.550410" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.552881" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:47.552555" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:47.553629" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.553403" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:47.553704" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:47.553855" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:47.553093" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.554028" elapsed="0.000221"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:58:47.552411" elapsed="0.001878"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:47.546036" elapsed="0.008288"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:47.554365" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:47.554540" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:47.544903" elapsed="0.009663"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.544566" elapsed="0.010032"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.554769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.554623" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.544546" elapsed="0.010300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.555631" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.554987" elapsed="0.000673"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.555709" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.540908" elapsed="0.014926"/>
</kw>
<msg time="2026-05-01T00:58:47.555888" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.528160" elapsed="0.027775"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.568771" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.582860" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.597105" elapsed="0.000143"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.597481" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.597674" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.598122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.597943" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:47.597923" elapsed="0.000287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.598355" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.598539" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.598707" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:47.597880" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.597756" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.598935" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.599016" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:58:47.599185" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:47.523885" elapsed="0.075330"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.623474" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.623060" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.624279" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.624008" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.624470" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.623671" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.625061" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.624677" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.625395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:47.625579" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/conf...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:47.625250" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.626007" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.625764" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:47.626483" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.626163" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.627014" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.626716" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.626570" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.626145" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.627880" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:47.627246" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:47.627962" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:47.622423" elapsed="0.005672"/>
</kw>
<msg time="2026-05-01T00:58:47.628151" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:47.609916" elapsed="0.018283"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.640333" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.652473" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.664336" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.664548" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.664752" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.665124" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.664981" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:47.664966" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.665345" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.665530" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.665698" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:47.664935" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.664831" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.665988" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:47.666066" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:47.666194" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:47.608992" elapsed="0.057231"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:47.667530" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:47.667248" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:47.667695" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:47.666905" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:47.668039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:47.667791" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.668616" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:47.668306" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.668123" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.667772" elapsed="0.000967"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.671010" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:47.668894" elapsed="0.002143"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:47.671089" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:47.671244" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:47.666576" elapsed="0.004693"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.672826" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.672557" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.673267" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.673025" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.673727" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.673468" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.674156" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.673918" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:47.675016" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:47.674816" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:47.675375" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:47.675201" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:47.675567" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:47.676180" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:47.675931" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:47.676265" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:47.676418" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:47.674397" elapsed="0.002082"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:49.277157" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '225', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.185&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;application-peers&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:49.277316" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.185', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:49.277571" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:47.678775" elapsed="1.598839"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:47.676570" elapsed="1.601129"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.278058" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.277752" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:47.676552" elapsed="1.601647"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.283278" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.279855" elapsed="0.003505"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.279507" elapsed="0.003918"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.279460" elapsed="0.004018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.287139" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.283974" elapsed="0.003233"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.283605" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.283575" elapsed="0.003717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.288187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.287604" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.288745" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.288339" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.289554" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.289103" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.288870" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.288308" elapsed="0.001371"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.290449" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.289933" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.290984" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.290619" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.291825" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.291356" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.291108" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.290591" elapsed="0.001348"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.292166" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:49.293322" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.292915" elapsed="0.000445"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.293598" elapsed="0.003247"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:49.278823" elapsed="0.018228"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:49.297343" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-05-01T00:58:49.297178" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.297145" elapsed="0.000365"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.297771" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.297875" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:58:49.301074" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:47.671616" elapsed="1.629503"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.301235" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:58:49.301531" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:47.513017" elapsed="1.788556"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.302162" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.301742" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.301713" elapsed="0.000813"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.302619" elapsed="0.000067"/>
</return>
<arg>${POLICIES_VAR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:47.508067" elapsed="1.794866"/>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.344422" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.343967" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.345346" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.345023" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.345538" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.344664" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.346133" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.345735" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.346477" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.346672" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.346324" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.347114" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.346861" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.348318" level="INFO">mapping: {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.347981" elapsed="0.000465"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.348914" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.348634" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.349652" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.349325" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.350445" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.350221" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.350546" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:58:49.350715" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.349887" elapsed="0.000854"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.350899" elapsed="0.000240"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.349183" elapsed="0.001998"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.351765" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.351439" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.352573" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.352340" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.352652" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:49.352811" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.351988" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.352990" elapsed="0.000230"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:58:49.351305" elapsed="0.001957"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.353839" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.353535" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.354865" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.354647" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.354945" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:49.355103" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.354299" elapsed="0.000830"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.355290" elapsed="0.000248"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.353381" elapsed="0.002199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.356141" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.355834" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.356967" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.356755" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.357044" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:49.357201" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.356412" elapsed="0.000813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.357377" elapsed="0.000254"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:58:49.355697" elapsed="0.001975"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.348994" elapsed="0.008714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.357755" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:49.357920" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:49.347631" elapsed="0.010315"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.347244" elapsed="0.010736"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.358169" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.358012" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.347219" elapsed="0.011107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.359164" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.358483" elapsed="0.000710"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.359243" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.343117" elapsed="0.016255"/>
</kw>
<msg time="2026-05-01T00:58:49.359431" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.330222" elapsed="0.029267"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.372052" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.384531" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.396823" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.397119" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.397311" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.397767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.397615" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.397597" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.398030" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.398202" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.398368" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.397556" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.397393" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.398613" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.398696" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:58:49.398864" level="INFO">${uri} = rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.325740" elapsed="0.073153"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.424546" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.424074" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.425385" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/post_data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.425119" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.425575" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.424767" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.426197" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/post_data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.425768" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.426553" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.426736" level="INFO">${template} = &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.426391" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.427208" level="INFO">&lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.11.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
    &lt;/attributes&gt;
&lt;/ipv4-route&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.426927" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:49.427729" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.427356" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.428267" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.185'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.427964" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.427816" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.427330" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.428988" level="INFO">${final_text} = &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.428520" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.429073" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.423258" elapsed="0.005950"/>
</kw>
<msg time="2026-05-01T00:58:49.429265" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.409961" elapsed="0.019355"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.442138" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.454326" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.466367" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.466607" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.466797" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.467213" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.467062" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.467045" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.467441" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.467631" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.467801" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.467006" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.466883" elapsed="0.001000"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.468031" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.468112" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:58:49.468268" level="INFO">${data} = &lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.408939" elapsed="0.059360"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.469942" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.469602" elapsed="0.000415">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.470111" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.469029" elapsed="0.001108"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.470481" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.470209" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.471061" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.470761" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.470580" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.470191" elapsed="0.000956"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.473806" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.471305" elapsed="0.002549"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:49.473983" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:58:49.474152" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:49.468664" elapsed="0.005513"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.475745" level="INFO">rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.475469" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.476187" level="INFO">&lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.11.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
    &lt;/attributes&gt;
&lt;/ipv4-route&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.475948" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.476661" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.476392" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.477132" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.476858" elapsed="0.000322"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:49.478124" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:49.477913" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:49.478485" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:49.478309" elapsed="0.000227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.478690" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.479297" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.479051" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:49.479384" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:49.479561" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:49.477385" elapsed="0.002202"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:49.491751" level="INFO">POST Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '458', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"&gt;
    &lt;path-id&gt;0&lt;/path-id&gt;
    &lt;prefix&gt;10.0.0.17/32&lt;/prefix&gt;
    &lt;route-key&gt;10.0.0.17/32&lt;/route-key&gt;
    &lt;attributes&gt;
        &lt;as-path/&gt;
        &lt;origin&gt;
            &lt;value&gt;igp&lt;/value&gt;
        &lt;/origin&gt;
        &lt;local-pref&gt;
            &lt;pref&gt;100&lt;/pref&gt;
        &lt;/local-pref&gt;
        &lt;ipv4-next-hop&gt;
            &lt;global&gt;10.11.1.1&lt;/global&gt;
        &lt;/ipv4-next-hop&gt;
    &lt;/attributes&gt;
&lt;/ipv4-route&gt; 
 </msg>
<msg time="2026-05-01T00:58:49.491893" level="INFO">POST Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=201, reason=Created 
 headers={'Location': 'http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route=10.0.0.17%2F32,0', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:49.492136" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:49.481755" elapsed="0.010444"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.479659" elapsed="0.012652"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.492779" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.492375" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.479641" elapsed="0.013400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.499474" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.495660" elapsed="0.003875"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.495095" elapsed="0.004478"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.495052" elapsed="0.004547"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.502449" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.499937" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.499706" elapsed="0.002844"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.499688" elapsed="0.002888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.503148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.502751" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.503513" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.503254" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.504068" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.503763" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.503600" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.503236" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.504754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.504338" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.505092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.504855" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.505658" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.505335" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.505175" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.504837" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.505899" elapsed="0.000407"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:49.506813" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.506517" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.506998" elapsed="0.002272"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:49.494009" elapsed="0.015327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:49.509542" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-05-01T00:58:49.509412" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.509393" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.509808" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.509881" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:49.512255" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:49.474530" elapsed="0.037753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.512354" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:49.512531" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:49.311918" elapsed="0.200639"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.512907" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.512661" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.512644" elapsed="0.000355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.513035" elapsed="0.000026"/>
</return>
<arg>${POLICIES_VAR}/app_peer_route</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:49.303580" elapsed="0.209670"/>
</kw>
<doc>Configures bgp application peer, and configures it's routes.</doc>
<status status="PASS" start="2026-05-01T00:58:47.414023" elapsed="2.099351"/>
</test>
<test id="s1-s20-t3" name="Reconfigure_ODL_To_Accept_Connections" line="60">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:49.517049" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:49.516779" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.518369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:49.518256" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.518237" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.523479" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:49.523367" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.523349" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.524580" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.524168" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.525065" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:49.524769" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:49.525136" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:49.525296" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.523792" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.531065" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:49.530954" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.530934" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.532393" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:49.532284" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.532266" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:49.532964" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.532648" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:49.533374" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:49.533154" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:49.563178" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:49.533914" elapsed="0.029399"/>
</kw>
<msg time="2026-05-01T00:58:49.563520" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:49.563571" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:49.533577" elapsed="0.030030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:49.594078" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:49.564198" elapsed="0.030025"/>
</kw>
<msg time="2026-05-01T00:58:49.594405" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:49.594453" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:49.563808" elapsed="0.030705"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.594893" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.594614" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.594587" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.595478" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "e "p "t "_ "C "o "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.595126" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.595938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.595713" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.595693" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:49.596058" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:49.598852" elapsed="0.000157"/>
</kw>
<msg time="2026-05-01T00:58:49.599074" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.597646" elapsed="0.001570"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.599522" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.599867" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:49.596969" elapsed="0.003091"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:49.596373" elapsed="0.003756"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:49.531973" elapsed="0.068261"/>
</kw>
<msg time="2026-05-01T00:58:49.600340" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:49.600387" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:49.531341" elapsed="0.069088"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:49.600657" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:49.600540" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.600519" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.601171" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.601548" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.601625" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:49.530605" elapsed="0.071141"/>
</kw>
<msg time="2026-05-01T00:58:49.601847" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:49.601895" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "R "e "c "o "n "f "i "g "u "r "e "_ "O "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:49.525730" elapsed="0.076204"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.602317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.602049" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.602027" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:49.525585" elapsed="0.076837"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:49.525381" elapsed="0.077076"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:49.522984" elapsed="0.079551"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:49.517959" elapsed="0.084637"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:49.517510" elapsed="0.085135"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:49.514550" elapsed="0.088152"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.603771" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.603147" elapsed="0.000654"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.638706" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.638283" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.639614" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.639257" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.639791" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.638910" elapsed="0.000908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.640379" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.639985" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.640741" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.640911" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.640594" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.641347" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.641098" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.642395" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.642134" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.642896" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.642623" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.643656" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.643315" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.644706" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.644197" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.644789" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:49.644950" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.643876" elapsed="0.001100"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.645132" elapsed="0.000276"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:58:49.643153" elapsed="0.002313"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.646144" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.645790" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.647438" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.646944" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.647550" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:49.647717" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.646408" elapsed="0.001337"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.647984" elapsed="0.000241"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:49.645626" elapsed="0.002647"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.648917" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.648550" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.649923" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.649466" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.650003" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:49.650158" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.649140" elapsed="0.001044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.650337" elapsed="0.000244"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:49.648393" elapsed="0.002230"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.651175" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.650873" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.652223" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.651735" elapsed="0.000517"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.652304" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:49.652461" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.651390" elapsed="0.001113"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.652659" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.650740" elapsed="0.002183"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.653472" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.653171" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.654459" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.654017" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.654555" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:49.654710" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.653701" elapsed="0.001035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.654888" elapsed="0.000224"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.653038" elapsed="0.002114"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.642974" elapsed="0.012215"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.655233" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:49.655394" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:49.641808" elapsed="0.013612"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.641478" elapsed="0.013978"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.655664" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.655483" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.641453" elapsed="0.014289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.656575" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.655886" elapsed="0.000718"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.656654" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.637629" elapsed="0.019151"/>
</kw>
<msg time="2026-05-01T00:58:49.656836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.624362" elapsed="0.032524"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.670719" elapsed="0.000121"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.689276" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.701313" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.701561" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.701751" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.702205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.702050" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.702031" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.702436" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.702626" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.702793" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.701985" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.701835" elapsed="0.001040"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.703022" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.703103" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T00:58:49.703281" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.620093" elapsed="0.083218"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.729200" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.728809" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.730012" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.729750" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.730185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.729391" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.730853" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.730440" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.731319" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.731505" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.731172" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.731942" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.731695" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:49.732551" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.732084" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.733076" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.732781" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.732636" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.732065" elapsed="0.001096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.734138" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.733306" elapsed="0.000862"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.734218" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.728178" elapsed="0.006170"/>
</kw>
<msg time="2026-05-01T00:58:49.734413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.715855" elapsed="0.018608"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.746712" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.758737" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.770680" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.770875" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.771045" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.771405" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.771264" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.771250" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.771642" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.771807" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.771970" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.771221" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.771118" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.772192" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.772268" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:49.772420" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.713037" elapsed="0.059412"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.773759" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.773509" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.773914" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.773156" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.774258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.774010" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.774825" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.774535" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.774337" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.773991" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.777191" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.775057" elapsed="0.002161"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:49.777308" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:49.777470" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:49.772836" elapsed="0.004674"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.778883" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.778640" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.779317" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.779078" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.779797" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.779553" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.780225" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.779988" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:49.781120" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:49.780917" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:49.781481" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:49.781304" elapsed="0.000216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.781669" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.782282" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.782034" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:49.782366" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:49.782540" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:49.780473" elapsed="0.002092"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:49.795404" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2156', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.1&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:49.795537" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:49.795633" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:49.784800" elapsed="0.010860"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.782636" elapsed="0.013069"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.795883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.795732" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.782618" elapsed="0.013354"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.800456" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.797237" elapsed="0.003298"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.796934" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.796910" elapsed="0.003710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.804395" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.801000" elapsed="0.003464"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.800697" elapsed="0.003834"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.800674" elapsed="0.003893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.805415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.804834" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.806026" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.805663" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.806658" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.806314" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.806140" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.805637" elapsed="0.001110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.807278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.806905" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.807623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.807375" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.808151" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.807862" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.807705" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.807357" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.808376" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:49.809173" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.808895" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.809350" elapsed="0.002277"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:49.796410" elapsed="0.015279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:49.811861" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:49.811756" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.811738" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.812094" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.812161" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:49.814379" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:49.777843" elapsed="0.036563"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.814521" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:49.814687" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:49.609005" elapsed="0.205707"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.815053" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.814813" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.814796" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.815179" elapsed="0.000026"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:49.604122" elapsed="0.211182"/>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-05-01T00:58:49.602976" elapsed="0.212370"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.816217" level="INFO">&amp;{mapping} = { IP=127.0.0.2 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.815644" elapsed="0.000602"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.848595" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.848209" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.849334" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.849110" elapsed="0.000290">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.849510" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.848784" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.850076" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.849699" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.850392" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.850557" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.850259" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.850974" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.850736" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.852071" level="INFO">mapping: {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.851817" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.852549" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.852270" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.853225" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.852930" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.854250" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.853769" elapsed="0.000507"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.854326" elapsed="0.000068"/>
</return>
<msg time="2026-05-01T00:58:49.854593" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.853436" elapsed="0.001183"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.854773" elapsed="0.000230"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:58:49.852797" elapsed="0.002245"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.855656" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.855293" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.857942" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.857501" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.858020" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:49.858175" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.857158" elapsed="0.001042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.858351" elapsed="0.000241"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:49.855156" elapsed="0.003477"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.859181" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.858879" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.860302" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.859868" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.860380" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:49.860553" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.859397" elapsed="0.001181"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.860729" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:49.858747" elapsed="0.002243"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.861553" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.861236" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.862539" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.862079" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.862618" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:49.862772" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.861765" elapsed="0.001031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.862945" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.861105" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.863811" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:49.863457" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:49.864819" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.864345" elapsed="0.000501"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:49.864898" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:49.865051" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:49.864028" elapsed="0.001048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.865226" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:49.863321" elapsed="0.002188"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.852623" elapsed="0.012923"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:49.865591" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:58:49.865749" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:49.851439" elapsed="0.014336"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.851087" elapsed="0.014720"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.865980" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.865832" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.851068" elapsed="0.015028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.866879" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.866238" elapsed="0.000669"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.866957" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.847602" elapsed="0.019480"/>
</kw>
<msg time="2026-05-01T00:58:49.867137" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.835422" elapsed="0.031763"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.879496" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.891618" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.903564" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.903757" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.903931" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.904293" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.904151" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.904137" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.904528" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.904695" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.904857" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.904107" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.904004" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.905078" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.905155" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:58:49.905307" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.831305" elapsed="0.074061"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.931184" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.930812" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.931934" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.931723" elapsed="0.000277">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.932093" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.931371" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.932680" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.932278" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.933002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:49.933135" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:49.932868" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.933581" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.933318" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:49.934013" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.933720" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.934572" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.934259" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.934096" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.933701" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.935585" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:49.934803" elapsed="0.000841"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:49.935697" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:49.930180" elapsed="0.005647"/>
</kw>
<msg time="2026-05-01T00:58:49.935891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:49.917866" elapsed="0.018072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.948420" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.960476" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.972559" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.972751" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.972924" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.973286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.973142" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:49.973127" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.973524" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.973694" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.973858" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:49.973098" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.972997" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.974079" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:49.974155" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:49.974313" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:49.915265" elapsed="0.059076"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:49.975673" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:49.975388" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:49.975835" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:49.975051" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.976178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.975932" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.976738" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:49.976429" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.976259" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.975913" elapsed="0.000908"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.979095" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:49.976972" elapsed="0.002150"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:49.979174" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:58:49.979334" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:49.974728" elapsed="0.004631"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.980778" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.980532" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.981211" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.980977" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.981692" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.981433" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.982117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.981883" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:49.982965" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:49.982775" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:49.983313" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:49.983142" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:49.983501" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:49.984120" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.983858" elapsed="0.000340"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:49.984241" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:49.984400" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:49.982360" elapsed="0.002065"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:49.996072" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2156', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.2&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:49.996149" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:49.996257" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:49.986690" elapsed="0.009599"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.984512" elapsed="0.011857"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:49.996572" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:49.996397" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.984481" elapsed="0.012183"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.003339" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:49.998153" elapsed="0.005282"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:49.997658" elapsed="0.005887"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:49.997617" elapsed="0.005988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.007036" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.004216" elapsed="0.002866"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.003731" elapsed="0.003384"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.003694" elapsed="0.003446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.007691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.007300" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.008018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.007788" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.008569" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.008257" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.008099" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.007770" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.009235" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.008868" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.009578" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.009332" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.010109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.009818" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.009660" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.009315" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.010339" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:50.011136" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.010862" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.011314" elapsed="0.002280"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:49.997025" elapsed="0.016633"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:50.013831" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.013726" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.013707" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.014064" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.014132" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.016320" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:49.979701" elapsed="0.036646"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.016411" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:50.016583" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:49.820860" elapsed="0.195748"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.017103" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.016843" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.016824" elapsed="0.000371"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.017229" elapsed="0.000026"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:49.816531" elapsed="0.200821"/>
</kw>
<var name="${index}">2</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-05-01T00:58:49.815466" elapsed="0.201924"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.018246" level="INFO">&amp;{mapping} = { IP=127.0.0.3 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.017685" elapsed="0.000589"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.051089" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.050717" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.051905" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.051626" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.052068" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.051277" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.052666" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.052258" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.052988" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.053124" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.052854" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.053565" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.053305" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.054596" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.054320" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.055062" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.054800" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.055759" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.055444" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.056888" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.056283" elapsed="0.000631"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.056966" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:50.057121" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.055971" elapsed="0.001175"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.057297" elapsed="0.000253"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:58:50.055312" elapsed="0.002279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.058133" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.057838" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.059148" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.058706" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.059224" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.059376" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.058348" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.059567" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:50.057706" elapsed="0.002125"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.060595" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.060079" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.061581" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.061123" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.061658" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.061810" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.060809" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.061984" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:50.059949" elapsed="0.002342"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.062968" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.062664" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.063985" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.063548" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.064063" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.064215" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.063184" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.064388" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.062445" elapsed="0.002223"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.065207" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.064913" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.066191" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.065753" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.066272" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.066424" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.065417" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.066641" elapsed="0.000386"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.064781" elapsed="0.002296"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.055138" elapsed="0.011975"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.067161" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.067322" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:50.053971" elapsed="0.013377"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.053679" elapsed="0.013702"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.067604" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.067412" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.053661" elapsed="0.014021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.068538" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.067830" elapsed="0.000738"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.068617" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.050072" elapsed="0.018672"/>
</kw>
<msg time="2026-05-01T00:58:50.068802" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.037687" elapsed="0.031169"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.081144" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.093152" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.105462" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.105673" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.105853" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.106236" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.106091" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.106076" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.106457" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.106639" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.106803" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.106042" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.105931" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.107029" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.107107" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.107235" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.033526" elapsed="0.073737"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.133048" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.132655" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.133829" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.133584" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.134000" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.133236" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.134582" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.134184" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.134903" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.135102" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.134767" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.135548" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.135286" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:50.135979" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.135687" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.136516" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.136205" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.136061" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.135669" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.137565" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.136745" elapsed="0.000850"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.137645" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.132035" elapsed="0.005737"/>
</kw>
<msg time="2026-05-01T00:58:50.137836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.119654" elapsed="0.018227"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.150046" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.162103" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.174123" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.174315" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.174526" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.174892" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.174750" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.174735" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.175109" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.175275" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.175437" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.174706" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.174602" elapsed="0.000933"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.175681" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.175757" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.175911" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.117032" elapsed="0.058908"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.177357" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.177090" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.177541" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.176612" elapsed="0.000954"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.177879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.177637" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.178427" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.178138" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.177959" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.177619" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.180841" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.178718" elapsed="0.002150"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:50.180920" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.181074" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:50.176273" elapsed="0.004825"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.182507" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.182246" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.183019" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.182778" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.183589" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.183245" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.184024" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.183784" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.184898" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:50.184693" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:50.185249" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:50.185076" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.185421" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.186044" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.185801" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:50.186130" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:50.186289" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:50.184272" elapsed="0.002042"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:50.198943" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2156', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.3&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:50.199089" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:50.199224" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:50.188590" elapsed="0.010698"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.186384" elapsed="0.012968"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.199627" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.199389" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.186367" elapsed="0.013385"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.204262" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.201054" elapsed="0.003267"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.200755" elapsed="0.003613"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.200731" elapsed="0.003673"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.207916" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.204806" elapsed="0.003172"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.204500" elapsed="0.003526"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.204461" elapsed="0.003600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.208827" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.208283" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.209289" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.208965" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.210069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.209651" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.209403" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.208940" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.210932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.210404" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.211383" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.211065" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.212205" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.211789" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.211520" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.211041" elapsed="0.001252"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.212438" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:50.213235" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.212957" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.213410" elapsed="0.002264"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:50.200245" elapsed="0.015491"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:50.215927" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.215802" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.215784" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.216159" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.216226" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.218419" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:50.181436" elapsed="0.037010"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.218559" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.218720" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:50.022781" elapsed="0.195964"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.219079" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.218844" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.218827" elapsed="0.000343"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.219203" elapsed="0.000026"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:50.018555" elapsed="0.200772"/>
</kw>
<var name="${index}">3</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-05-01T00:58:50.017524" elapsed="0.201843"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.220260" level="INFO">&amp;{mapping} = { IP=127.0.0.4 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.219660" elapsed="0.000628"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.252922" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.252551" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.253698" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.253476" elapsed="0.000285">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.253853" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.253140" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.254414" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.254037" elapsed="0.000403"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.254747" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.254883" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.254613" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.255298" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.255060" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.256291" level="INFO">mapping: {'IP': '127.0.0.4', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.256034" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.256767" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.256507" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.257463" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.257144" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.258475" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.258004" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.258574" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:50.258767" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.257691" elapsed="0.001101"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.258944" elapsed="0.000227"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:58:50.257012" elapsed="0.002200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.259774" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.259462" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.260886" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.260433" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.260963" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.261115" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.260117" elapsed="0.001024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.261290" elapsed="0.000278"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:50.259329" elapsed="0.002280"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.262147" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.261853" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.263143" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.262708" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.263225" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.263377" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.262356" elapsed="0.001045"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.263590" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:50.261723" elapsed="0.002130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.264395" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.264098" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.265372" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.264941" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.265448" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:50.265648" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.264627" elapsed="0.001045"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.265820" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.263967" elapsed="0.002113"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.266638" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.266325" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.267616" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.267160" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.267694" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.267846" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.266847" elapsed="0.001024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.268018" elapsed="0.000225"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.266194" elapsed="0.002090"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.256839" elapsed="0.011480"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.268361" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.268581" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:50.255717" elapsed="0.012891"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.255410" elapsed="0.013230"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.268813" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.268666" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.255392" elapsed="0.013534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.269737" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.269070" elapsed="0.000696"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.269815" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.251920" elapsed="0.018022"/>
</kw>
<msg time="2026-05-01T00:58:50.269997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.239657" elapsed="0.030387"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.282346" elapsed="0.000202"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.294618" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.306645" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.306841" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.307034" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.307418" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.307275" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.307259" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.307657" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.307823" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.307984" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.307224" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.307116" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.308204" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.308287" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:50.308430" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.235531" elapsed="0.072987"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.334324" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.333945" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.335241" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.335008" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.335403" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.334528" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.336020" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.335610" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.336343" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.336505" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.336208" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.336931" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.336691" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:50.337367" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.337075" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.337905" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.337611" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.337453" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.337056" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.338977" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.338132" elapsed="0.000903"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.339087" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.333321" elapsed="0.005899"/>
</kw>
<msg time="2026-05-01T00:58:50.339286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.321047" elapsed="0.018286"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.352714" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.364691" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.376711" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.376904" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.377074" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.377462" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.377293" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.377279" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.377701" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.377867" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.378029" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.377250" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.377147" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.378250" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.378325" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.378481" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.318376" elapsed="0.060147"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.379810" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.379573" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.379966" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.379218" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.380302" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.380060" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.380862" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.380572" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.380383" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.380042" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.383231" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.381095" elapsed="0.002163"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:50.383310" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.383467" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:50.378895" elapsed="0.004612"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.384876" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.384631" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.385308" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.385073" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.385823" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.385548" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.386254" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.386016" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.387106" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:50.386913" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:50.387457" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:50.387284" elapsed="0.000211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.387646" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.388245" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.388002" elapsed="0.000517"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:50.388565" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.388723" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:50.386514" elapsed="0.002234"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:50.402022" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2156', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.4&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;false&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;EXTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:50.402101" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:50.402203" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:50.391007" elapsed="0.011261"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.388818" elapsed="0.013498"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.402518" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.402343" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.388801" elapsed="0.013808"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.409115" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.403961" elapsed="0.005250"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.403437" elapsed="0.005853"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.403398" elapsed="0.005947"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.412937" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.409995" elapsed="0.002987"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.409478" elapsed="0.003538"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.409433" elapsed="0.003607"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.413592" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.413202" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.413921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.413689" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.414460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.414161" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.414003" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.413671" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.415153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.414786" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.415497" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.415251" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.416032" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.415738" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.415580" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.415233" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.416264" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:50.417065" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.416790" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.417245" elapsed="0.002279"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:50.402957" elapsed="0.016630"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:50.419762" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.419655" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.419637" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.419995" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.420063" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.422253" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:50.383830" elapsed="0.038449"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.422344" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:50.422513" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:50.224898" elapsed="0.197641"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.422871" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.422636" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.422619" elapsed="0.000361"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.423013" elapsed="0.000027"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:50.220572" elapsed="0.202563"/>
</kw>
<var name="${index}">4</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-05-01T00:58:50.219498" elapsed="0.203676"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.424037" level="INFO">&amp;{mapping} = { IP=127.0.0.5 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.423446" elapsed="0.000619"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.456891" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.456515" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.457704" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.457407" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.457864" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.457079" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.458434" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.458052" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.458774" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.458921" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.458639" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.459349" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.459103" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.460389" level="INFO">mapping: {'IP': '127.0.0.5', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.460096" elapsed="0.000340"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.460874" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.460612" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.461574" level="INFO">${value} = 127.0.0.5</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.461258" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.462589" level="INFO">${encoded} = 127.0.0.5</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.462101" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.462667" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.462820" level="INFO">${encoded_value} = 127.0.0.5</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.461788" elapsed="0.001057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.462995" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.5</var>
<status status="PASS" start="2026-05-01T00:58:50.461122" elapsed="0.002136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.463815" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.463519" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.464811" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.464344" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.464887" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.465038" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.464024" elapsed="0.001039"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.465213" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:50.463370" elapsed="0.002107"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.466198" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.465736" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.467180" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.466743" elapsed="0.000463"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.467257" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.467410" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.466410" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.467620" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:50.465606" elapsed="0.002314"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.468472" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.468171" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.469496" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.469049" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.469576" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.469731" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.468734" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.469907" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.468037" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.470736" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.470421" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.471716" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.471257" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.471793" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.471944" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.470945" elapsed="0.001023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.472118" elapsed="0.000218"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.470289" elapsed="0.002087"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.460949" elapsed="0.011462"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.472458" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:58:50.472632" level="INFO">${mapping_to_use} = {'IP': '127.0.0.5', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:50.459776" elapsed="0.012914"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.459466" elapsed="0.013258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.472897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.472749" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.459444" elapsed="0.013529"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.473740" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.473115" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.473817" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.455869" elapsed="0.018075"/>
</kw>
<msg time="2026-05-01T00:58:50.473998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.443585" elapsed="0.030459"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.486174" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.498113" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.510566" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.510762" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.510936" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.511300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.511156" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.511141" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.511539" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.511709" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.511874" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.511112" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.511009" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.512099" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.512175" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.512297" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.439312" elapsed="0.073012"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.537961" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.537587" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.538711" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.538482" elapsed="0.000292">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.538866" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.538149" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.539451" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.539072" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.539789" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.539964" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.539653" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.540400" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.540150" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:50.540854" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.540560" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.541375" level="INFO">${mapping_to_use} = {'IP': '127.0.0.5', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.541080" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.540936" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.540540" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.542391" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.5&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.541621" elapsed="0.000800"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.542475" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.536964" elapsed="0.005657"/>
</kw>
<msg time="2026-05-01T00:58:50.542685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.524690" elapsed="0.018042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.555099" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.567099" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.579208" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.579399" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.579587" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.579953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.579811" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.579796" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.580174" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.580342" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.580541" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.579767" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.579662" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.580768" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.580845" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:50.581000" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.5&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.522079" elapsed="0.058950"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.582290" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.582039" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.582444" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.581705" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.582801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.582557" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.583335" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.583048" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.582883" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.582538" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.585734" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.583584" elapsed="0.002177"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:50.585813" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.585967" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:50.581364" elapsed="0.004627"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.587361" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.587113" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.587855" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.5&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.587617" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.588318" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.588075" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.588793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.588528" elapsed="0.000309"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.589643" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:50.589436" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:50.589989" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:50.589818" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.590159" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.590771" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.590525" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:50.590858" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.591014" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:50.589035" elapsed="0.002004"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:50.603719" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2155', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.5&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:50.603955" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:50.604161" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:50.593327" elapsed="0.010891"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.591110" elapsed="0.013209"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.604764" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.604380" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.591092" elapsed="0.013874"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.611617" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.607109" elapsed="0.004569"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.606619" elapsed="0.005107"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.606578" elapsed="0.005184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.615296" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.612147" elapsed="0.003212"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.611839" elapsed="0.003569"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.611816" elapsed="0.003627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.616212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.615691" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.616706" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.616353" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.617458" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.617042" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.616820" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.616328" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.618329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.617857" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.618673" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.618425" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.619199" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.618911" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.618754" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.618407" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.619431" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:50.620231" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.619958" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.620407" elapsed="0.002292"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:50.605804" elapsed="0.016957"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:50.622932" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.622827" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.622809" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.623165" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.623235" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:58:50.625419" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:50.586316" elapsed="0.039129"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.625559" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.625723" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:50.428558" elapsed="0.197190"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.626127" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.625853" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.625836" elapsed="0.000383"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.626253" elapsed="0.000027"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:50.424328" elapsed="0.202048"/>
</kw>
<var name="${index}">5</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-05-01T00:58:50.423286" elapsed="0.203129"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.627267" level="INFO">&amp;{mapping} = { IP=127.0.0.6 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.626704" elapsed="0.000592"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.659983" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.659604" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.660730" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.660517" elapsed="0.000278">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.660888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.660173" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.661454" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.661075" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.661788" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.661918" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.661655" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.662339" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.662099" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.663349" level="INFO">mapping: {'IP': '127.0.0.6', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.663076" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.663829" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.663568" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.664519" level="INFO">${value} = 127.0.0.6</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.664208" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.665521" level="INFO">${encoded} = 127.0.0.6</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.665042" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.665635" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:50.665795" level="INFO">${encoded_value} = 127.0.0.6</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.664731" elapsed="0.001089"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.665970" elapsed="0.000226"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.6</var>
<status status="PASS" start="2026-05-01T00:58:50.664076" elapsed="0.002164"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.666799" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.666501" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.667949" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.667511" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.668027" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.668179" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.667010" elapsed="0.001193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.668359" elapsed="0.000240"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:58:50.666353" elapsed="0.002287"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.669180" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.668884" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.670158" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.669723" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.670235" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.670385" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.669392" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.670600" elapsed="0.000224"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:58:50.668752" elapsed="0.002112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.671407" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.671109" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.672518" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.672064" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.672596" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.672747" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.671753" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.672920" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.670977" elapsed="0.002203"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.673738" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:50.673422" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:50.674724" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.674268" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:50.674803" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.674955" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:50.673947" elapsed="0.001033"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.675128" elapsed="0.000221"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:58:50.673292" elapsed="0.002098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.663904" elapsed="0.011521"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:50.675474" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T00:58:50.675721" level="INFO">${mapping_to_use} = {'IP': '127.0.0.6', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:50.662759" elapsed="0.012988"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.662455" elapsed="0.013324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.675994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.675841" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.662433" elapsed="0.013638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.676842" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.676212" elapsed="0.000659"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.676920" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.658949" elapsed="0.018096"/>
</kw>
<msg time="2026-05-01T00:58:50.677099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.646600" elapsed="0.030545"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.689446" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.701467" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.713456" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.713663" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.713835" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.714193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.714052" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.714038" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.714409" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.714590" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.714754" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.714009" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.713907" elapsed="0.000924"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.714973" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.715049" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.715171" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.642443" elapsed="0.072795"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.741130" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.740715" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.741900" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.741679" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.742094" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.741328" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.742675" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.742279" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.742991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:50.743120" level="INFO">${template} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:50.742859" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.743560" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;$IP&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;$HOLDTIME&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.743302" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:58:50.743986" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.743698" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.744523" level="INFO">${mapping_to_use} = {'IP': '127.0.0.6', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.744212" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.744069" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.743679" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.745579" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.6&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.744782" elapsed="0.000828"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.745659" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.740036" elapsed="0.005750"/>
</kw>
<msg time="2026-05-01T00:58:50.745850" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.727750" elapsed="0.018146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.758058" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.770128" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.782121" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.782311" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.782497" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.782862" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.782718" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:50.782704" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.783079" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.783250" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.783465" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:50.782675" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.782572" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.783707" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.783782" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.783934" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.6&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:50.725142" elapsed="0.058820"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:50.785253" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:50.785021" elapsed="0.000295">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:50.785408" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:50.784679" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.785767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.785524" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.786295" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.786008" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.785847" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.785503" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.788660" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.786543" elapsed="0.002143"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:50.788737" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.788891" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:50.784332" elapsed="0.004583"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.790273" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.790030" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.790724" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.6&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.790474" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.791180" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.790941" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.791664" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.791369" elapsed="0.000340"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.792522" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:58:50.792314" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:58:50.792910" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:58:50.792735" elapsed="0.000201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.793085" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.793706" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.793443" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:58:50.793792" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:50.793947" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:58:50.791915" elapsed="0.002058"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:50.806281" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '2155', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;127.0.0.6&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflector-client&gt;true&lt;/route-reflector-client&gt;
        &lt;/config&gt;
    &lt;/route-reflector&gt;
    &lt;timers&gt;
        &lt;config&gt;
            &lt;hold-time&gt;180&lt;/hold-time&gt;
        &lt;/config&gt;
    &lt;/timers&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;remote-port&gt;179&lt;/remote-port&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;afi-safis&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV4-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:IPV6-LABELLED-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV4-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L3VPN-IPV6-UNICAST&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name xmlns:x="http://openconfig.net/yang/bgp-types"&gt;x:L2VPN-EVPN&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;LINKSTATE&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV4-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
        &lt;afi-safi&gt;
            &lt;afi-safi-name&gt;IPV6-L3VPN-FLOW&lt;/afi-safi-name&gt;
        &lt;/afi-safi&gt;
    &lt;/afi-safis&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-05-01T00:58:50.806389" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:50.806548" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:50.796243" elapsed="0.010343"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.794042" elapsed="0.012607"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.806898" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.806686" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.794025" elapsed="0.012995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.811559" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.808363" elapsed="0.003256"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.808026" elapsed="0.003642"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.808001" elapsed="0.003702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.815225" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.812084" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.811779" elapsed="0.003557"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.811756" elapsed="0.003614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.816125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.815613" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.816698" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.816259" elapsed="0.000523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.817399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.817042" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.816817" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.816234" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.818020" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.817663" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.818345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.818116" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.818894" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.818603" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.818425" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.818098" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.819125" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:50.819918" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:50.819644" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.820096" elapsed="0.002256"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:50.807538" elapsed="0.014876"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:58:50.822604" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.822497" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.822466" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.822837" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.822905" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:50.825125" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:50.789237" elapsed="0.035914"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.825222" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:50.825410" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:50.631911" elapsed="0.193524"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.825786" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.825551" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.825533" elapsed="0.000344"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:50.825911" elapsed="0.000026"/>
</return>
<arg>${POLICIES_VAR}${/}${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:58:50.627577" elapsed="0.198455"/>
</kw>
<var name="${index}">6</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-05-01T00:58:50.626543" elapsed="0.199528"/>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="PASS" start="2026-05-01T00:58:49.602770" elapsed="1.223337"/>
</for>
<doc>Configure BGP peer modules with initiate-connection set to false.
Configures 6 different peers, two internal, two external and two route-reflectors.</doc>
<status status="PASS" start="2026-05-01T00:58:49.513765" elapsed="1.312562"/>
</test>
<test id="s1-s20-t4" name="Start_Exabgps" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:50.829651" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:50.829370" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.830977" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.830866" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.830839" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.837339" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.837232" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.837214" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.838397" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.838020" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.838894" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:50.838601" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:50.838966" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.839121" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.837649" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.844513" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.844389" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.844370" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.845793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.845686" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.845669" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.846306" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.846006" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.846732" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:50.846510" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.876981" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.847252" elapsed="0.029878"/>
</kw>
<msg time="2026-05-01T00:58:50.877327" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:50.877374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.846919" elapsed="0.030491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.897934" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "a "r "t "_ "E "x "a "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:50.878057" elapsed="0.019976"/>
</kw>
<msg time="2026-05-01T00:58:50.898190" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:50.898235" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "a "r "t "_ "E "x "a "b "g "p "s "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.877653" elapsed="0.020617"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.898624" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.898360" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.898334" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.899184" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "a "r "t "_ "E "x "a "b "g "p "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.898883" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.899550" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.899316" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.899298" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:50.899667" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:50.902327" elapsed="0.000150"/>
</kw>
<msg time="2026-05-01T00:58:50.902554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.901232" elapsed="0.001456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.902980" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.903318" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:50.900604" elapsed="0.002926"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:50.900027" elapsed="0.003571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:50.845353" elapsed="0.058343"/>
</kw>
<msg time="2026-05-01T00:58:50.903790" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:50.903834" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "a "r "t "_ "E "x "a "b "g "p "s "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.844732" elapsed="0.059139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:50.904254" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:50.903949" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.903930" elapsed="0.000415"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.904775" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.905115" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.905188" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:50.844057" elapsed="0.061239"/>
</kw>
<msg time="2026-05-01T00:58:50.905389" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:50.905432" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "a "r "t "_ "E "x "a "b "g "p "s "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.839529" elapsed="0.065942"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.905808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.905561" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.905543" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:50.839372" elapsed="0.066537"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:50.839199" elapsed="0.066743"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:50.836845" elapsed="0.069153"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:50.830569" elapsed="0.075484"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.830113" elapsed="0.075985"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:50.827263" elapsed="0.078887"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.909266" level="INFO">source /tmp/defaultvenv/bin/activate</msg>
<arg>source ${SSHKeywords__current_venv_path}/bin/activate</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.906793" elapsed="0.002529"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.913578" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<msg time="2026-05-01T00:58:50.913669" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:58:50.909501" elapsed="0.004195"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.914257" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.914007" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:50.913762" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.913745" elapsed="0.000616"/>
</if>
<arg>log_output=${True}</arg>
<doc>Activates virtual environment. To run anything in the env activated this way you should use SSHLibrary.Write and Read commands.</doc>
<status status="PASS" start="2026-05-01T00:58:50.906409" elapsed="0.007997"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.915142" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.914801" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.915618" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.915327" elapsed="0.000336"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.918072" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<msg time="2026-05-01T00:58:50.918160" level="INFO">${output} =  env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.915810" elapsed="0.002377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.918608" level="INFO"> env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.918343" elapsed="0.000311"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:50.914665" elapsed="0.004022"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.919261" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.918922" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.919723" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.919445" elapsed="0.000323"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.920289" level="INFO">[?2004l[1] 6119</msg>
<msg time="2026-05-01T00:58:50.920372" level="INFO">${output} = [?2004l[1] 6119
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.919915" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.920811" level="INFO">[?2004l[1] 6119
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.920570" elapsed="0.000285"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-05-01T00:58:50.918787" elapsed="0.002101"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.921519" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.921139" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.921943" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.921703" elapsed="0.000284"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.924134" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<msg time="2026-05-01T00:58:50.924226" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.922136" elapsed="0.002119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.924683" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.924412" elapsed="0.000318"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-05-01T00:58:50.921004" elapsed="0.003759"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.925336" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.924999" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.925772" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.925534" elapsed="0.000283"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.926334" level="INFO">[?2004l[2] 6120</msg>
<msg time="2026-05-01T00:58:50.926417" level="INFO">${output} = [?2004l[2] 6120
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.925963" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.926854" level="INFO">[?2004l[2] 6120
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.926615" elapsed="0.000302"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-05-01T00:58:50.924865" elapsed="0.002085"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.927575" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.927198" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.928020" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.927779" elapsed="0.000286"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.930346" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<msg time="2026-05-01T00:58:50.930437" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.928212" elapsed="0.002433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.931057" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.930811" elapsed="0.000296"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-05-01T00:58:50.927052" elapsed="0.004088"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.931743" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:50.931376" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.932354" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;</msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.932070" elapsed="0.000533"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.933351" level="INFO">[?2004l[3] 6121</msg>
<msg time="2026-05-01T00:58:50.933443" level="INFO">${output} = [?2004l[3] 6121
</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.932766" elapsed="0.000707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.933905" level="INFO">[?2004l[3] 6121
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.933644" elapsed="0.000307"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-05-01T00:58:50.931243" elapsed="0.002741"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-05-01T00:58:50.914509" elapsed="0.019505"/>
</for>
<doc>Start 6 exabgps as processes in background, each with it's own configuration.</doc>
<status status="PASS" start="2026-05-01T00:58:50.826720" elapsed="0.107421"/>
</test>
<test id="s1-s20-t5" name="Verify_Rib_Filled" line="86">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:58:50.937444" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:58:50.937183" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.938714" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.938605" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.938586" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.944507" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.944383" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.944365" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.945571" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:50.945175" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.946045" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:58:50.945755" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:58:50.946114" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:50.946416" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:58:50.944802" elapsed="0.001640"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.951924" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.951816" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.951797" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:58:50.953159" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:50.953051" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.953034" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:58:50.953707" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:58:50.953378" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.954102" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:50.953892" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.977964" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:58:50.954642" elapsed="0.023422"/>
</kw>
<msg time="2026-05-01T00:58:50.978229" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:58:50.978278" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.954287" elapsed="0.024026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:58:50.995826" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "F "i "l "l "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:58:50.978910" elapsed="0.017016"/>
</kw>
<msg time="2026-05-01T00:58:50.996087" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:58:50.996134" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "F "i "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.978554" elapsed="0.017616"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.996478" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.996248" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.996229" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:50.997027" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "F "i "l "l "e "d "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:50.996725" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:50.997382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:50.997162" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:50.997143" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:58:50.997521" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:58:51.000098" elapsed="0.000143"/>
</kw>
<msg time="2026-05-01T00:58:51.000304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:50.999036" elapsed="0.001403"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.000747" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.001090" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:58:50.998384" elapsed="0.002899"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:58:50.997789" elapsed="0.003559"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:58:50.952750" elapsed="0.048697"/>
</kw>
<msg time="2026-05-01T00:58:51.001561" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:51.001610" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "F "i "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.952145" elapsed="0.049502"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:58:51.001837" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:58:51.001726" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.001706" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.002345" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.002700" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.002772" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:58:50.951469" elapsed="0.051412"/>
</kw>
<msg time="2026-05-01T00:58:51.002973" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:58:51.003016" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "V "e "r "i "f "y "_ "R "i "b "_ "F "i "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.946829" elapsed="0.056222"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.003373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.003125" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.003108" elapsed="0.000404"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:58:50.946688" elapsed="0.056849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:58:50.946516" elapsed="0.057050"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:58:50.944001" elapsed="0.059620"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:58:50.938301" elapsed="0.065375"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:58:50.937878" elapsed="0.065841"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:58:50.935033" elapsed="0.068737"/>
</kw>
<kw name="Verify_Rib_Status">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.059829" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.059413" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.060641" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.060350" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.060814" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.060021" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.061380" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:51.061001" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.061721" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:51.061885" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:51.061584" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.062305" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.062064" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.063298" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.063047" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.063787" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.063514" elapsed="0.000339"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.064182" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.064393" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.064583" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:58:51.064049" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.063910" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:51.064713" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:58:51.064871" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:51.062730" elapsed="0.002165"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.062416" elapsed="0.002511"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.065098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.064951" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.062397" elapsed="0.002778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.065870" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:51.065315" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:51.065989" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:51.058794" elapsed="0.007326"/>
</kw>
<msg time="2026-05-01T00:58:51.066174" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:51.044251" elapsed="0.021970"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.078548" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.090523" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.102741" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.102934" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.103106" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.103474" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.103329" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:51.103314" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.103706" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.103870" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.104032" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:51.103286" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.103179" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.104251" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.104325" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:51.104441" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:51.040023" elapsed="0.064446"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.105827" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.105569" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.105985" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.105168" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.106323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.106081" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.106879" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.106588" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.106404" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.106062" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.109250" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:51.107112" elapsed="0.002165"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:51.109328" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:58:51.109500" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:51.104810" elapsed="0.004716"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.110745" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.110506" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rib_state/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.110901" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.110154" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:51.111130" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:51.110996" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.110978" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.111359" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.111548" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.111616" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:51.113680" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:51.109834" elapsed="0.003873"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.115099" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.114854" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.115551" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.115295" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:51.126837" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:51.128905" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://10.30.170.185","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-targ... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-01T00:58:51.129219" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:58:51.117683" elapsed="0.011577"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.115661" elapsed="0.013663"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.129603" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.129362" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.115643" elapsed="0.014082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.134878" level="INFO">{"bgp-rib:rib":[{"id":"example-bgp-rib","peer":[{"peer-id":"bgp://192.0.2.6","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"},{"peer-id":"bgp://10.30.170.185","supported-tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"}],"effective-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"route-key":"10.0.0.17/32","path-id":0,"prefix":"10.0.0.17/32","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv4-next-hop":{"global":"10.11.1.1"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"adj-rib-out":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family"},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family"}]},"adj-rib-in":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"route-key":"10.0.0.17/32","path-id":0,"prefix":"10.0.0.17/32","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv4-next-hop":{"global":"10.11.1.1"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]},"peer-role":"internal"}],"loc-rib":{"tables":[{"afi":"bgp-types:ipv4-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"odl-bgp-evpn:l2vpn-address-family","safi":"odl-bgp-evpn:evpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-route-target-constrain:route-target-constrain-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-linkstate:linkstate-address-family","safi":"bgp-linkstate:linkstate-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-flowspec:flowspec-l3vpn-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv6-address-family","safi":"bgp-labeled-unicast:labeled-unicast-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:unicast-subsequent-address-family","attributes":{"uptodate":false},"bgp-inet:ipv4-routes":{"ipv4-route":[{"path-id":0,"route-key":"10.0.0.17/32","prefix":"10.0.0.17/32","attributes":{"origin":{"value":"igp"},"local-pref":{"pref":100},"ipv4-next-hop":{"global":"10.11.1.1"}}}]}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-types:mpls-labeled-vpn-subsequent-address-family","attributes":{"uptodate":false}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.131194" elapsed="0.003999"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.130890" elapsed="0.004355"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.130865" elapsed="0.004420"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.138863" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.135696" elapsed="0.003230"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.135364" elapsed="0.003611"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.135341" elapsed="0.003668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.139641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:51.139233" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.139972" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.139739" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.140528" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.140212" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.140053" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.139721" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.141132" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:51.140772" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.141462" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.141229" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.142009" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.141718" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.141559" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.141211" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:51.142254" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:58:51.143064" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:51.142776" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.143242" elapsed="0.002256"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:58:51.130283" elapsed="0.015279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.145737" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:51.145631" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.145613" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:58:51.154924" level="INFO">${text_normalized} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:58:51.145951" elapsed="0.009009"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:58:51.155018" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:58:51.155187" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:58:51.114021" elapsed="0.041192"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:51.155280" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:51.155438" level="INFO">${response_text} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:58:51.017571" elapsed="0.137896"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.155807" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.155565" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.155548" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:58:51.155984" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:51.156138" level="INFO">${output} = {
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "...</msg>
<var>${output}</var>
<arg>${POLICIES_VAR}/rib_state</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:58:51.011587" elapsed="0.144578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.156597" level="INFO">{
 "bgp-rib:rib": [
  {
   "id": "example-bgp-rib",
   "loc-rib": {
    "tables": [
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "bgp-inet:ipv4-routes": {
       "ipv4-route": [
        {
         "attributes": {
          "ipv4-next-hop": {
           "global": "10.11.1.1"
          },
          "local-pref": {
           "pref": 100
          },
          "origin": {
           "value": "igp"
          }
         },
         "path-id": 0,
         "prefix": "10.0.0.17/32",
         "route-key": "10.0.0.17/32"
        }
       ]
      },
      "safi": "bgp-types:unicast-subsequent-address-family"
     },
     {
      "afi": "bgp-linkstate:linkstate-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-linkstate:linkstate-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-flowspec:flowspec-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv4-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-flowspec:flowspec-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
     },
     {
      "afi": "bgp-types:ipv6-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "bgp-types:unicast-subsequent-address-family"
     },
     {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "attributes": {
       "uptodate": false
      },
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
     }
    ]
   },
   "peer": [
    {
     "adj-rib-in": {
      "tables": [
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "bgp-inet:ipv4-routes": {
         "ipv4-route": [
          {
           "attributes": {
            "ipv4-next-hop": {
             "global": "10.11.1.1"
            },
            "local-pref": {
             "pref": 100
            },
            "origin": {
             "value": "igp"
            }
           },
           "path-id": 0,
           "prefix": "10.0.0.17/32",
           "route-key": "10.0.0.17/32"
          }
         ]
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "adj-rib-out": {
      "tables": [
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "effective-rib-in": {
      "tables": [
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "bgp-inet:ipv4-routes": {
         "ipv4-route": [
          {
           "attributes": {
            "ipv4-next-hop": {
             "global": "10.11.1.1"
            },
            "local-pref": {
             "pref": 100
            },
            "origin": {
             "value": "igp"
            }
           },
           "path-id": 0,
           "prefix": "10.0.0.17/32",
           "route-key": "10.0.0.17/32"
          }
         ]
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "peer-id": "bgp://10.30.170.185",
     "peer-role": "internal",
     "supported-tables": [
      {
       "afi": "bgp-linkstate:linkstate-address-family",
       "safi": "bgp-linkstate:linkstate-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-flowspec:flowspec-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-types:unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-flowspec:flowspec-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-types:unicast-subsequent-address-family"
      },
      {
       "afi": "odl-bgp-evpn:l2vpn-address-family",
       "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
      }
     ]
    },
    {
     "adj-rib-in": {
      "tables": [
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "adj-rib-out": {
      "tables": [
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "effective-rib-in": {
      "tables": [
       {
        "afi": "bgp-linkstate:linkstate-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-linkstate:linkstate-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv4-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-flowspec:flowspec-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
       },
       {
        "afi": "bgp-types:ipv6-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "bgp-types:unicast-subsequent-address-family"
       },
       {
        "afi": "odl-bgp-evpn:l2vpn-address-family",
        "attributes": {
         "uptodate": false
        },
        "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
       }
      ]
     },
     "peer-id": "bgp://192.0.2.6",
     "peer-role": "internal",
     "supported-tables": [
      {
       "afi": "bgp-linkstate:linkstate-address-family",
       "safi": "bgp-linkstate:linkstate-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-flowspec:flowspec-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-route-target-constrain:route-target-constrain-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv4-address-family",
       "safi": "bgp-types:unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-flowspec:flowspec-l3vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-flowspec:flowspec-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-l3vpn-mcast:mcast-mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-mvpn:mcast-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
      },
      {
       "afi": "bgp-types:ipv6-address-family",
       "safi": "bgp-types:unicast-subsequent-address-family"
      },
      {
       "afi": "odl-bgp-evpn:l2vpn-address-family",
       "safi": "odl-bgp-evpn:evpn-subsequent-address-family"
      }
     ]
    }
   ]
  }
 ]
}
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.156323" elapsed="0.000566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.157631" level="INFO">&amp;{mapping} = { IP=127.0.0.1 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.157223" elapsed="0.000436"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.205318" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.204947" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.206240" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.205869" elapsed="0.000441">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.206406" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.205539" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.206998" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:51.206617" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.207318" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:51.207546" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:51.207184" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.207968" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.207728" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.209131" level="INFO">mapping: {'IP': '127.0.0.1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.208761" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.209850" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.209339" elapsed="0.000538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.211153" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:51.210304" elapsed="0.000930"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:51.213190" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.212867" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:51.213363" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T00:58:51.213720" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:51.211906" elapsed="0.001897"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:51.214098" elapsed="0.000499"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:58:51.210117" elapsed="0.004624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:51.209927" elapsed="0.004856"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:51.214827" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:58:51.214988" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:51.208393" elapsed="0.006620"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.208080" elapsed="0.006965"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.215218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.215070" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.208061" elapsed="0.007234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.215996" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:51.215433" elapsed="0.000592"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:51.216111" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:51.204320" elapsed="0.011919"/>
</kw>
<msg time="2026-05-01T00:58:51.216295" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:51.192044" elapsed="0.024301"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.228657" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.240633" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.252685" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.252880" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.253054" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.253414" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.253271" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:51.253257" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.253687" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.253853" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.254018" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:51.253228" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.253128" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.254241" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.254318" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:51.254439" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:51.187921" elapsed="0.066548"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.255772" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.255525" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.255929" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.255170" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.256266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.256024" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.256823" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:51.256531" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:51.256347" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.256006" elapsed="0.000900"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.259355" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:51.257054" elapsed="0.002328"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:51.259435" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:51.259609" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:51.254846" elapsed="0.004787"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:51.260952" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.260714" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:51.261107" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:51.260253" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:51.261338" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:51.261203" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:51.261185" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.261593" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.261767" elapsed="0.000049"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.261864" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:58:51.263720" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:51.259935" elapsed="0.003811"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.265128" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.264881" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:51.265584" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:51.265324" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:51.274207" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:51.274396" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:51.274576" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.267731" elapsed="0.007430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:51.265696" elapsed="0.009590">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.275569" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.275333" elapsed="0.000329"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:51.265678" elapsed="0.010017">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.276271" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.276497" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:51.276423" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:51.276397" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.276792" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.276890" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.264057" elapsed="0.012984">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.277145" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.166257" elapsed="0.111020">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:51.277677" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:51.277407" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:51.277383" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:51.277856" elapsed="0.000020"/>
</return>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.161916" elapsed="0.116073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.331679" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:54.331142" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:54.332684" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.332244" elapsed="0.000519">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:54.332938" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:54.331898" elapsed="0.001066"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.333547" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:54.333133" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:54.333891" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:54.334049" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:54.333740" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.334512" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:54.334237" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.335710" level="INFO">mapping: {'IP': '127.0.0.1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:54.335313" elapsed="0.000444"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.336244" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:54.335919" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.337676" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:54.336777" elapsed="0.000980"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:54.339735" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:54.339250" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:54.339903" elapsed="0.000082"/>
</return>
<msg time="2026-05-01T00:58:54.340232" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:54.338398" elapsed="0.001917"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:54.340631" elapsed="0.000490"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:58:54.336538" elapsed="0.004711"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:54.336325" elapsed="0.004963"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:54.341333" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:54.341519" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:54.334950" elapsed="0.006596"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:54.334638" elapsed="0.006940"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.341754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:54.341604" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:54.334615" elapsed="0.007217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.342758" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:54.341974" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:54.342838" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:54.330248" elapsed="0.012716"/>
</kw>
<msg time="2026-05-01T00:58:54.343018" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:54.317907" elapsed="0.025159"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.355362" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.367429" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.379327" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.379556" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.379744" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.380180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:54.380029" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:54.380012" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.380408" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.380592" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.380758" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:54.379973" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.379825" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.380987" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.381065" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:58:54.381211" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:54.313706" elapsed="0.067538"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:54.382632" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.382329" elapsed="0.000379">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:54.382802" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:54.381950" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.383157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:54.382899" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.383732" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:54.383417" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:54.383240" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:54.382880" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.386115" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:54.383985" elapsed="0.002157"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:54.386237" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:58:54.386397" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:54.381604" elapsed="0.004818"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:54.387706" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.387459" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:54.387862" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:54.387118" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:54.388139" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:58:54.387958" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:54.387940" elapsed="0.000287"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.388373" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.388562" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.388630" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:54.392012" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:54.386794" elapsed="0.005246"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.393483" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:54.393211" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:54.393928" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:54.393683" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:54.401511" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:54.401653" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:54.401762" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.396055" elapsed="0.006103">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:54.394038" elapsed="0.008203">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.402436" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:54.402276" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:54.394020" elapsed="0.008525">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.402922" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.403099" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:54.403060" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:54.403042" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.403310" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.403380" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.392378" elapsed="0.011130">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.403586" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.291946" elapsed="0.111736">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:54.403955" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:54.403776" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:54.403760" elapsed="0.000292"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:54.404085" elapsed="0.000015"/>
</return>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:54.286025" elapsed="0.118157">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.462394" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:57.461938" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:57.463446" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.462989" elapsed="0.000560">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:57.463647" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:57.462632" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.464274" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:57.463843" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:58:57.464651" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:58:57.464837" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:58:57.464496" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.465293" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:57.465028" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.466627" level="INFO">mapping: {'IP': '127.0.0.1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:57.466213" elapsed="0.000595"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.467322" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:58:57.466980" elapsed="0.000368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.468846" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:58:57.467874" elapsed="0.001059"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:58:57.470846" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:58:57.470494" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:58:57.471020" elapsed="0.000088"/>
</return>
<msg time="2026-05-01T00:58:57.471366" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:58:57.469616" elapsed="0.001833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:58:57.471775" elapsed="0.000544"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:58:57.467666" elapsed="0.004823"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:58:57.467405" elapsed="0.005129"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:58:57.472581" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:58:57.472747" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:58:57.465825" elapsed="0.006947"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:57.465428" elapsed="0.007377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.472994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:57.472835" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:57.465402" elapsed="0.007671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.473902" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:58:57.473222" elapsed="0.000712"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:58:57.473986" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:58:57.461105" elapsed="0.013018"/>
</kw>
<msg time="2026-05-01T00:58:57.474183" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:58:57.446643" elapsed="0.027597"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.487245" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.504331" elapsed="0.000112"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.519623" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.519982" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.520176" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.520640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:57.520478" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:57.520442" elapsed="0.000297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.520885" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.521052" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.521218" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:58:57.520394" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.520262" elapsed="0.001038"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.521446" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.521546" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:58:57.521722" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:58:57.441768" elapsed="0.079983"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:57.523227" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.522902" elapsed="0.000405">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:57.523402" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:57.522462" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.523785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:57.523517" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.524345" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:58:57.524047" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:58:57.523868" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:57.523498" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.526780" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:58:57.524596" elapsed="0.002211"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:58:57.526859" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:58:57.527019" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:57.522093" elapsed="0.004951"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:58:57.528273" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.528029" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:58:57.528430" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:58:57.527694" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:58:57.528681" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:58:57.528545" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T00:58:57.528526" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.528976" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.529147" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.529213" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:58:57.531248" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:58:57.527352" elapsed="0.003924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.532712" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:57.532430" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:58:57.533188" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:58:57.532942" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:58:57.540597" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:58:57.540740" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:58:57.540845" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.535393" elapsed="0.005881">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:58:57.533298" elapsed="0.008060">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.541606" elapsed="0.000210"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:57.541392" elapsed="0.000485"/>
</branch>
<status status="FAIL" start="2026-05-01T00:58:57.533281" elapsed="0.008629">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.542438" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.542649" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:58:57.542596" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:57.542572" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.542941" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.543040" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.531609" elapsed="0.011581">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.543296" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.418769" elapsed="0.124662">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:58:57.543885" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:58:57.543634" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:58:57.543608" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:58:57.544065" elapsed="0.000020"/>
</return>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:58:57.412838" elapsed="0.131365">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.599369" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:00.598971" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:00.600357" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.599965" elapsed="0.000469">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:00.600558" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:00.599595" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.601144" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:00.600752" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:00.601496" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:00.601659" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:00.601335" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.602099" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:00.601847" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.603422" level="INFO">mapping: {'IP': '127.0.0.1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:00.603043" elapsed="0.000443"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.604006" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:00.603652" elapsed="0.000381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.605379" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:00.604493" elapsed="0.000996"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:00.607265" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:00.606947" elapsed="0.000359"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:00.607433" elapsed="0.000102"/>
</return>
<msg time="2026-05-01T00:59:00.607827" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:00.606140" elapsed="0.001769"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:00.608202" elapsed="0.000507"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:59:00.604284" elapsed="0.004610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:00.604086" elapsed="0.004850"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:00.608981" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:00.609143" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:00.602547" elapsed="0.006622"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:00.602223" elapsed="0.006979"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.609380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:00.609228" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:00.602200" elapsed="0.007275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.610193" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:00.609628" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:00.610273" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:00.598325" elapsed="0.012077"/>
</kw>
<msg time="2026-05-01T00:59:00.610562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:00.585887" elapsed="0.024732"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.622999" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.635083" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.647074" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.647273" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.647455" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.647842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:00.647696" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:00.647681" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.648070" elapsed="0.000054"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.648282" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.648448" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:00.647651" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.647544" elapsed="0.001041"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.648732" elapsed="0.000193"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.648981" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:00.649105" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:00.581579" elapsed="0.067553"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:00.650400" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.650156" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:00.650581" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:00.649811" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.650924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:00.650676" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.651488" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:00.651180" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:00.651004" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:00.650658" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.653920" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:00.651722" elapsed="0.002224"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:00.653999" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:00.654156" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:00.649479" elapsed="0.004702"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:00.655410" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.655166" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:00.655587" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:00.654831" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:00.655819" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:00.655682" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:00.655664" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.656049" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.656253" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.656321" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:00.658366" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:00.654509" elapsed="0.003885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.659845" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:00.659581" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:00.660380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:00.660105" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:00.668258" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:00.668429" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:59:00.668562" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.662558" elapsed="0.006389">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:00.660515" elapsed="0.008518">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.669222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:00.669067" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:00.660494" elapsed="0.008818">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.669779" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.669980" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:00.669919" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:00.669895" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.670269" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.670343" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.658738" elapsed="0.011749">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.670569" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.559109" elapsed="0.111565">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:00.670956" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:00.670769" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:00.670752" elapsed="0.000299"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:00.671084" elapsed="0.000014"/>
</return>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:00.552852" elapsed="0.118330">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.724039" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:03.723612" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.725005" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.724598" elapsed="0.000484">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:03.725179" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:03.724246" elapsed="0.000958"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.725796" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:03.725370" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.726128" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:03.726290" level="INFO">${template} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:03.725986" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.726747" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F$IP/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.726496" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.727932" level="INFO">mapping: {'IP': '127.0.0.1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.727542" elapsed="0.000435"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.728480" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:03.728137" elapsed="0.000370"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.729797" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:03.728952" elapsed="0.000931"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:03.731674" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:03.731334" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:03.731874" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T00:59:03.732207" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:03.730549" elapsed="0.001737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:03.732593" elapsed="0.000488"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:59:03.728762" elapsed="0.004444"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:03.728562" elapsed="0.004684"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:03.733292" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:03.733453" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:03.727172" elapsed="0.006321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:03.726868" elapsed="0.006657"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.733700" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.733550" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.726845" elapsed="0.006936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.734498" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:03.733924" elapsed="0.000605"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:03.734627" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:03.722979" elapsed="0.011777"/>
</kw>
<msg time="2026-05-01T00:59:03.734812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:03.710729" elapsed="0.024131"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.747217" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.759173" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.771113" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.771309" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.771502" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.771887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.771733" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:03.771717" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.772139" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.772308" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.772486" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:03.771686" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.771579" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.772714" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.772790" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:03.772917" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:03.706575" elapsed="0.066369"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.774284" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.774029" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:03.774447" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:03.773670" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.774808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.774561" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.775358" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:03.775066" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:03.774888" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.774542" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.777752" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:03.775608" elapsed="0.002170"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:03.777829" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:03.777983" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:03.773323" elapsed="0.004685"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.779218" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.778986" elapsed="0.000294">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:03.779373" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:03.778653" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:03.779622" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:03.779484" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.779449" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.779856" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.780024" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.780117" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:03.782114" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/effective_rib_in/peer_1/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:03.778314" elapsed="0.003827"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.783552" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.783286" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.783989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.783749" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:03.792114" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:03.792298" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-05-01T00:59:03.792400" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.786123" elapsed="0.006732">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:03.784112" elapsed="0.008828">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.793131" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.792974" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:03.784093" elapsed="0.009126">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.793623" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.793756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:03.793719" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:03.793702" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.793961" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.794030" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.782455" elapsed="0.011682">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.794211" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.684565" elapsed="0.109743">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.794597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.794402" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:03.794385" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.794728" elapsed="0.000016"/>
</return>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:03.678713" elapsed="0.116114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<msg time="2026-05-01T00:59:03.794929" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>5x</arg>
<arg>3s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${POLICIES_VAR}/effective_rib_in/peer_${index}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:58:51.157822" elapsed="12.637202">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-05-01T00:58:51.157081" elapsed="12.638022">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="FAIL" start="2026-05-01T00:58:51.156942" elapsed="12.638256">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</for>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping}</var>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.795377" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5x</arg>
<arg>3s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${POLICIES_VAR}/app_peer_rib</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.795576" elapsed="0.000021"/>
</kw>
<doc>Verify output from effective-rib-in for each of the 6 exabgp peers and app peer.
First request is for full example-bgp-rib and it's output is logged for debug purposes.
Each of the peers have different output which is stored in folder by their respective
numbers as peer_${index} (peer_1, peer_2 ...)</doc>
<status status="FAIL" start="2026-05-01T00:58:51.007633" elapsed="12.788068">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</kw>
<doc>Verifies that sent routes are present in particular ribs.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T00:58:50.934540" elapsed="12.861325">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.185:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F127.0.0.1/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</status>
</test>
<test id="s1-s20-t6" name="Stop_All_Peers" line="91">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:59:03.800137" elapsed="0.000348"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:59:03.799775" elapsed="0.000791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.801953" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:03.801797" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.801771" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.807805" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:03.807693" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.807675" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.808894" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:03.808512" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.809372" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:03.809079" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:59:03.809441" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:59:03.809618" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:59:03.808099" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.814991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:03.814883" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.814865" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.816226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:03.816118" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.816101" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:03.816803" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:03.816498" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.817205" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:03.816989" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.846697" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:03.817747" elapsed="0.029062"/>
</kw>
<msg time="2026-05-01T00:59:03.846978" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:59:03.847024" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:03.817388" elapsed="0.029672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.866774" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "o "p "_ "A "l "l "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:59:03.847673" elapsed="0.019217"/>
</kw>
<msg time="2026-05-01T00:59:03.867061" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:59:03.867106" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "o "p "_ "A "l "l "_ "P "e "e "r "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:03.847293" elapsed="0.019849"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.867517" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.867237" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.867210" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.868069" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "o "p "_ "A "l "l "_ "P "e "e "r "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.867749" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.868419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.868204" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.868186" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:59:03.868553" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:03.871511" elapsed="0.000334"/>
</kw>
<msg time="2026-05-01T00:59:03.871909" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:03.870364" elapsed="0.001682"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.872325" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.872697" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:03.869718" elapsed="0.003165"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:59:03.869121" elapsed="0.003827"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:59:03.815820" elapsed="0.057225"/>
</kw>
<msg time="2026-05-01T00:59:03.873136" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:03.873179" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "o "p "_ "A "l "l "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:03.815210" elapsed="0.058006"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:59:03.873404" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:03.873294" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.873274" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.873935" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.874278" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:59:03.874349" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:59:03.814543" elapsed="0.059931"/>
</kw>
<msg time="2026-05-01T00:59:03.874570" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:03.874613" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "S "t "o "p "_ "A "l "l "_ "P "e "e "r "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:03.810010" elapsed="0.064640"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:03.874982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:03.874730" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:03.874710" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:03.809869" elapsed="0.065283"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:59:03.809697" elapsed="0.065489"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:59:03.807320" elapsed="0.067923"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:59:03.801367" elapsed="0.073933"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:03.800775" elapsed="0.074570"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:59:03.796798" elapsed="0.078602"/>
</kw>
<kw name="Stop_All_ExaBgps" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.876055" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6122
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 6123
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 6124
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax</msg>
<msg time="2026-05-01T00:59:03.876181" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6122
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-b...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-05-01T00:59:03.875927" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.876649" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6122
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 6123
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 6124
[?2004h(defaultvenv) [jenkins@releng-26932-215-0-builder-0 ~]&gt; Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/tmp/defaultvenv/bin/exabgp", line 8, in &lt;module&gt;
    sys.exit(run_exabgp())
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/__init__.py", line 12, in run_exabgp
    from exabgp.application.bgp import main
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/application/bgp.py", line 22, in &lt;module&gt;
    from exabgp.reactor.loop import Reactor
  File "/tmp/defaultvenv/lib/python3.10/site-packages/exabgp/reactor/loop.py", line 24
    from exabgp.reactor.async import ASYNC
                        ^^^^^
SyntaxError: invalid syntax
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.876360" elapsed="0.000441"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.879136" level="INFO">ps axf | grep exabgp | grep -v grep | awk '{print "kill -9 " $1}' | sh</msg>
<msg time="2026-05-01T00:59:03.879224" level="INFO">${output} = ps axf | grep exabgp | grep -v grep | awk '{print "kill -9 " $1}' | sh
</msg>
<var>${output}</var>
<arg>${EXABGP_KILL_COMMAND}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:03.876955" elapsed="0.002295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.879668" level="INFO">ps axf | grep exabgp | grep -v grep | awk '{print "kill -9 " $1}' | sh
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.879407" elapsed="0.000306"/>
</kw>
<doc>Sends kill command to stop all exabgps running</doc>
<status status="PASS" start="2026-05-01T00:59:03.875646" elapsed="0.004121"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.888783" level="INFO">Executing command 'cat exa1.log'.</msg>
<msg time="2026-05-01T00:59:03.901421" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:03.901576" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:03.888623" elapsed="0.012988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.902183" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.901834" elapsed="0.000406"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.903005" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa1.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa1.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:03.902523" elapsed="0.000557"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:03.888215" elapsed="0.014948"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:03.879955" elapsed="0.023255"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.914889" level="INFO">Executing command 'cat exa2.log'.</msg>
<msg time="2026-05-01T00:59:03.952321" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:03.952688" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:03.914753" elapsed="0.038000"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:03.954071" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:03.953290" elapsed="0.000888"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:03.955324" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa2.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa2.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:03.954654" elapsed="0.000795"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:03.914350" elapsed="0.041285"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-05-01T00:59:03.903332" elapsed="0.052388"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:03.969374" level="INFO">Executing command 'cat exa3.log'.</msg>
<msg time="2026-05-01T00:59:04.004880" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:04.005096" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:03.969202" elapsed="0.035948"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.006161" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.005577" elapsed="0.000675"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.007312" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa3.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa3.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:04.006707" elapsed="0.000724"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:03.968792" elapsed="0.038812"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-05-01T00:59:03.955939" elapsed="0.051739"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.020294" level="INFO">Executing command 'cat exa4.log'.</msg>
<msg time="2026-05-01T00:59:04.057280" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:04.057535" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:04.020157" elapsed="0.037439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.058600" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.057990" elapsed="0.000704"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.059744" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa4.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa4.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:04.059082" elapsed="0.000787"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.019768" elapsed="0.040235"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-05-01T00:59:04.007882" elapsed="0.052195"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.072583" level="INFO">Executing command 'cat exa5.log'.</msg>
<msg time="2026-05-01T00:59:04.108565" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:04.108929" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:04.072425" elapsed="0.036570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.110017" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.109364" elapsed="0.000813"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.111250" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa5.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa5.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:04.110613" elapsed="0.000770"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.072022" elapsed="0.039542"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-05-01T00:59:04.060273" elapsed="0.051369"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.124688" level="INFO">Executing command 'cat exa6.log'.</msg>
<msg time="2026-05-01T00:59:04.156859" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:04.157080" level="INFO">${output_log} = </msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:04.124538" elapsed="0.032600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.158217" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.157627" elapsed="0.000690"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.159733" level="INFO" html="true">Created file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa6.log"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/exa6.log&lt;/a&gt;'.</msg>
<arg>${target_file_name}</arg>
<arg>${output_log}</arg>
<doc>Creates a file with the given content and encoding.</doc>
<status status="PASS" start="2026-05-01T00:59:04.158914" elapsed="0.000955"/>
</kw>
<arg>exa${index}.log</arg>
<arg>exa${index}.log</arg>
<doc>Store the ${source_file_name} to the workspace as ${target_file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.124091" elapsed="0.035919"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-05-01T00:59:04.111845" elapsed="0.048240"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-05-01T00:59:03.879817" elapsed="0.280341"/>
</for>
<doc>Send command to kill all exabgp processes running on controller</doc>
<status status="PASS" start="2026-05-01T00:59:03.796265" elapsed="0.364152"/>
</test>
<test id="s1-s20-t7" name="Delete_Bgp_Peer_Configuration" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:59:04.167347" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:59:04.167079" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.168774" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:04.168633" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.168609" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.173984" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:04.173857" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.173838" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.175154" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.174737" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.175668" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:04.175345" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:59:04.175739" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:59:04.175907" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.174305" elapsed="0.001627"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.181848" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:04.181734" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.181715" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.183192" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:04.183082" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.183063" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:04.183755" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.183410" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.184198" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:04.183970" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.217346" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:04.184794" elapsed="0.032683"/>
</kw>
<msg time="2026-05-01T00:59:04.217653" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:59:04.217717" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:04.184386" elapsed="0.033383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:59:04.240207" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:59:04.218308" elapsed="0.022011"/>
</kw>
<msg time="2026-05-01T00:59:04.240504" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:59:04.240552" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:04.217951" elapsed="0.022638"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.240926" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.240688" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.240659" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.241472" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "e "r "_ "C "o "n "f "i "g "u "r "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.241153" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.241861" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.241616" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.241598" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:59:04.241981" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:04.244693" elapsed="0.000149"/>
</kw>
<msg time="2026-05-01T00:59:04.244906" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.243552" elapsed="0.001498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.245353" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.245732" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:04.242846" elapsed="0.003232"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:59:04.242270" elapsed="0.003876"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:59:04.182771" elapsed="0.063493"/>
</kw>
<msg time="2026-05-01T00:59:04.246359" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:04.246404" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:04.182071" elapsed="0.064372"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:59:04.246847" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:04.246546" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.246526" elapsed="0.000459"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.247439" elapsed="0.000052"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.247832" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.247904" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:59:04.181351" elapsed="0.066663"/>
</kw>
<msg time="2026-05-01T00:59:04.248107" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:04.248193" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "l "e "t "e "_ "B "g "p "_ "P "e "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:04.176336" elapsed="0.071896"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.248614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.248310" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.248291" elapsed="0.000402"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:04.176185" elapsed="0.072532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:59:04.175991" elapsed="0.072756"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:59:04.173482" elapsed="0.075321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:59:04.168285" elapsed="0.080574"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:04.167818" elapsed="0.081085"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:59:04.162581" elapsed="0.086374"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.250016" level="INFO">&amp;{mapping} = { IP=127.0.0.1 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.249382" elapsed="0.000666"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.291567" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.291176" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.292336" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.292095" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.292528" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.291763" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.293099" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.292717" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.293421" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.293604" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.293285" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.294028" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.293787" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.295024" level="INFO">mapping: {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.294768" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.295538" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.295257" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.296213" level="INFO">${value} = 127.0.0.1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.295917" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.297170" level="INFO">${encoded} = 127.0.0.1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.296947" elapsed="0.000283"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.297283" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:04.297441" level="INFO">${encoded_value} = 127.0.0.1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.296425" elapsed="0.001059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.297640" elapsed="0.000246"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-05-01T00:59:04.295784" elapsed="0.002143"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.298490" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.298176" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.299248" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.299018" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.299325" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.299516" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.298704" elapsed="0.000844"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.299705" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.298042" elapsed="0.001927"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.300530" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.300215" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.301267" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.301056" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.301341" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.301511" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.300740" elapsed="0.000796"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.301685" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.300083" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.302501" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.302190" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.303267" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.303033" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.303344" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.303512" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.302713" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.303689" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.302058" elapsed="0.001892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.304511" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.304195" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.305243" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.305037" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.305318" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.305485" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.304723" elapsed="0.000788"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.305662" elapsed="0.000226"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.304063" elapsed="0.001865"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.295613" elapsed="0.010350"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.306006" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:04.306165" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.294433" elapsed="0.011794"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.294140" elapsed="0.012122"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.306438" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.306288" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.294122" elapsed="0.012412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.307341" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.306679" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.307418" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.290538" elapsed="0.017024"/>
</kw>
<msg time="2026-05-01T00:59:04.307616" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.278225" elapsed="0.029437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.320021" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.333772" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.348773" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.349043" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.349276" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.349781" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.349593" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.349572" elapsed="0.000317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.350084" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.350262" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.350431" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.349531" elapsed="0.000977"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.349369" elapsed="0.001174"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.350727" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.350881" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:04.351079" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.274035" elapsed="0.077082"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.353616" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.352992" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.366116" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.366189" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.1 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.366324" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.357875" elapsed="0.008486"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.353883" elapsed="0.012537"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.366717" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.366487" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.353843" elapsed="0.012998"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.371802" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.368350" elapsed="0.003515"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.368026" elapsed="0.003891"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.368000" elapsed="0.003955"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.375759" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.372362" elapsed="0.003466"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.372037" elapsed="0.003842"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.372013" elapsed="0.003904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.376754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.376170" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.377091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.376855" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.377655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.377336" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.377173" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.376837" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.378261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.377901" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.378606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.378357" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.379143" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.378852" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.378688" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.378340" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.379378" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:04.380265" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.379968" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.380445" elapsed="0.002420"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.367377" elapsed="0.015552"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:04.382977" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:04.385209" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.351589" elapsed="0.033648"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.385292" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.250284" elapsed="0.135133"/>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.249217" elapsed="0.136255"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.386332" level="INFO">&amp;{mapping} = { IP=127.0.0.2 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.385762" elapsed="0.000599"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.427327" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.426931" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.428168" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.427887" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.428342" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.427550" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.428937" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.428550" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.429265" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ibgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.429430" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.429124" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.429874" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.429632" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.430920" level="INFO">mapping: {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.430659" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.431396" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.431126" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.432160" level="INFO">${value} = 127.0.0.2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.431823" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.432934" level="INFO">${encoded} = 127.0.0.2</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.432712" elapsed="0.000306"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.433073" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:04.433239" level="INFO">${encoded_value} = 127.0.0.2</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.432377" elapsed="0.000887"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.433417" elapsed="0.000257"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-05-01T00:59:04.431680" elapsed="0.002035"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.434443" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.433963" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.435200" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.434993" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.435275" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.435428" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.434676" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.435622" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.433831" elapsed="0.002054"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.436451" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.436156" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.437200" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.436994" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.437274" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.437424" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.436680" elapsed="0.000768"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.437615" elapsed="0.000218"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.436021" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.438411" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.438117" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.439160" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.438954" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.439235" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.439384" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.438638" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.439573" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.437986" elapsed="0.001846"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.440403" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.440108" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.441151" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.440942" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.441226" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:04.441375" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.440629" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.441565" elapsed="0.000225"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.439945" elapsed="0.001886"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.431494" elapsed="0.010372"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.441909" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.442069" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.430320" elapsed="0.011809"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.429999" elapsed="0.012166"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.442342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.442192" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.429976" elapsed="0.012444"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.443228" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.442584" elapsed="0.000673"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.443306" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.426269" elapsed="0.017162"/>
</kw>
<msg time="2026-05-01T00:59:04.443504" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.413991" elapsed="0.029563"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.455811" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.468485" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.480425" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.480631" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.480806" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.481172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.481028" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.481014" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.481391" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.481574" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.481739" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.480984" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.480880" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.481962" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.482076" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:04.482206" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.409835" elapsed="0.072398"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.483346" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.483094" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.492438" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.492536" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.2 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.492670" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.485441" elapsed="0.007266"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.483476" elapsed="0.009292"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.493026" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.492807" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.483441" elapsed="0.009706"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.498162" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.494739" elapsed="0.003486"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.494397" elapsed="0.003878"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.494371" elapsed="0.003942"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.501664" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.498741" elapsed="0.002968"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.498394" elapsed="0.003349"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.498371" elapsed="0.003397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.502313" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.501937" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.502664" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.502410" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.503212" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.502912" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.502747" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.502392" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.503834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.503471" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.504160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.503930" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.504731" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.504418" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.504242" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.503913" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.504970" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:04.505815" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.505530" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.505996" elapsed="0.002381"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.493692" elapsed="0.014792"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:04.508533" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.510711" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.482518" elapsed="0.028221"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.510792" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.386614" elapsed="0.124302"/>
</kw>
<var name="${index}">2</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.385596" elapsed="0.125359"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.511822" level="INFO">&amp;{mapping} = { IP=127.0.0.3 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.511231" elapsed="0.000620"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.552680" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.552281" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.553442" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.553202" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.553629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.552871" elapsed="0.000782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.554194" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.553815" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.554532" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.554743" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.554380" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.555165" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.554925" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.556163" level="INFO">mapping: {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.555908" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.556642" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.556362" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.557347" level="INFO">${value} = 127.0.0.3</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.557051" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.558105" level="INFO">${encoded} = 127.0.0.3</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.557895" elapsed="0.000276"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.558225" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.558380" level="INFO">${encoded_value} = 127.0.0.3</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.557580" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.558575" elapsed="0.000233"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-05-01T00:59:04.556918" elapsed="0.001931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.559567" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.559097" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.560305" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.560097" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.560380" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.560549" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.559783" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.560743" elapsed="0.000220"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.558964" elapsed="0.002039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.561617" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.561300" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.562348" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.562141" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.562421" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:04.562590" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.561830" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.562763" elapsed="0.000219"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.561153" elapsed="0.001869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.563642" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.563265" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.564371" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.564165" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.564444" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:59:04.564615" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.563854" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.564823" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.563135" elapsed="0.001951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.565668" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.565330" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.566396" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.566189" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.566487" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.566639" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.565878" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.566810" elapsed="0.000217"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.565199" elapsed="0.001868"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.556744" elapsed="0.010357"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.567143" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:04.567299" level="INFO">${mapping_to_use} = {'IP': '127.0.0.3', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.555590" elapsed="0.011797"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.555278" elapsed="0.012145"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.567615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.567449" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.555259" elapsed="0.012433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.568476" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.567840" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.568556" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.551675" elapsed="0.017006"/>
</kw>
<msg time="2026-05-01T00:59:04.568735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.539487" elapsed="0.029419"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.581096" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.593101" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.605120" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.605316" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.605507" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.605877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.605729" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.605715" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.606119" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.606290" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.606468" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.605686" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.605582" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.606693" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.606803" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:04.606932" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.535320" elapsed="0.071639"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.608055" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.607804" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.616356" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.616406" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.3 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.616520" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.610172" elapsed="0.006374"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.608168" elapsed="0.008418"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.616764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.616612" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.608151" elapsed="0.008696"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.620213" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.617902" elapsed="0.002356"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.617681" elapsed="0.002613"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.617663" elapsed="0.002656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.623398" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.620613" elapsed="0.002872"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.620376" elapsed="0.003159"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.620360" elapsed="0.003211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.624326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.623805" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.624814" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.624484" elapsed="0.000547"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.625777" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.625332" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.625067" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.624437" elapsed="0.001459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.626670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.626115" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.627129" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.626806" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.627901" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.627484" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.627241" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.626782" elapsed="0.001235"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.628221" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:04.629443" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.629002" elapsed="0.000500"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.629721" elapsed="0.002433"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.617256" elapsed="0.014961"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:04.632264" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:04.634470" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.607218" elapsed="0.027282"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.634554" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.512087" elapsed="0.122592"/>
</kw>
<var name="${index}">3</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.511068" elapsed="0.123651"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.635578" level="INFO">&amp;{mapping} = { IP=127.0.0.4 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.634997" elapsed="0.000611"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.677227" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.676851" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.678048" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.677801" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.678243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.677448" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.678951" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.678474" elapsed="0.000514"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.679366" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/ebgp_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.679542" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.679197" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.679978" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.679727" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.680989" level="INFO">mapping: {'IP': '127.0.0.4', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.680732" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.681483" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.681191" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.682167" level="INFO">${value} = 127.0.0.4</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.681871" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.682923" level="INFO">${encoded} = 127.0.0.4</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.682710" elapsed="0.000294"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.683059" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:04.683218" level="INFO">${encoded_value} = 127.0.0.4</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.682379" elapsed="0.000864"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.683392" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-05-01T00:59:04.681737" elapsed="0.001943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.685723" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.683926" elapsed="0.001824"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.686480" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.686253" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.686558" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.686712" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.685939" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.686887" elapsed="0.000221"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.683793" elapsed="0.003355"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.687709" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.687393" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.688441" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.688234" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.688533" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.688687" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.687923" elapsed="0.000789"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.688860" elapsed="0.000219"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.687261" elapsed="0.001858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.689696" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.689364" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.690426" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.690217" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.690518" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.690670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.689908" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.690843" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.689233" elapsed="0.001870"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.691660" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.691348" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.692387" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.692181" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.692482" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.692637" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.691870" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.692811" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.691217" elapsed="0.001857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.681561" elapsed="0.011548"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.693153" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:04.693310" level="INFO">${mapping_to_use} = {'IP': '127.0.0.4', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.680393" elapsed="0.012981"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.680096" elapsed="0.013313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.693629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.693435" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.680076" elapsed="0.013630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.694491" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.693847" elapsed="0.000673"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.694569" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.676217" elapsed="0.018477"/>
</kw>
<msg time="2026-05-01T00:59:04.694748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.663387" elapsed="0.031408"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.708141" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.720594" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ebgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.732583" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.732800" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.732983" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.733393" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.733242" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.733224" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.733640" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.733829" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.733993" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.733183" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.733063" elapsed="0.001011"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.734221" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.734361" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:04.734534" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.659089" elapsed="0.075474"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.735738" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.735433" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.746024" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.746073" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.4 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.746177" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.737888" elapsed="0.008315"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.735855" elapsed="0.010388"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.746420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.746269" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.735837" elapsed="0.010689"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.751092" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.747859" elapsed="0.003293"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.747545" elapsed="0.003656"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.747519" elapsed="0.003718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.754800" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.751640" elapsed="0.003207"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.751314" elapsed="0.003567"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.751291" elapsed="0.003616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.755492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.755081" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.755823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.755589" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.756360" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.756064" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.755903" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.755572" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.756982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.756619" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.757307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.757077" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.757875" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.757562" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.757387" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.757060" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.758109" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:04.758972" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.758676" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.759151" elapsed="0.002410"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.746959" elapsed="0.014666"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:04.761671" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:04.763915" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.734831" elapsed="0.029112"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.763996" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.635838" elapsed="0.128283"/>
</kw>
<var name="${index}">4</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.634835" elapsed="0.129325"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.765035" level="INFO">&amp;{mapping} = { IP=127.0.0.5 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.764444" elapsed="0.000620"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.806423" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.806034" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.807216" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.806966" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.807390" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.806632" elapsed="0.000782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.807986" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.807596" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.808311" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.808507" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.808173" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.808931" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.808691" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.809935" level="INFO">mapping: {'IP': '127.0.0.5', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.809679" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.810425" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.810161" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.811131" level="INFO">${value} = 127.0.0.5</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.810835" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.811939" level="INFO">${encoded} = 127.0.0.5</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.811677" elapsed="0.000289"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.812016" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.812172" level="INFO">${encoded_value} = 127.0.0.5</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.811344" elapsed="0.000852"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.812349" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.5</var>
<status status="PASS" start="2026-05-01T00:59:04.810695" elapsed="0.001943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.813341" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.812884" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.814094" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.813886" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.814186" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.814339" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.813572" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.814529" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.812753" elapsed="0.002040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.815334" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.815039" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.816086" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.815877" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.816160" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.816311" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.815563" elapsed="0.000772"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.816500" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.814907" elapsed="0.001858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.817306" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.817012" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.818052" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.817845" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.818125" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.818306" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.817534" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.818494" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.816881" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.819298" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.819001" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.820047" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.819841" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.820122" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.820272" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.819526" elapsed="0.000771"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.820446" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.818870" elapsed="0.001854"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.810518" elapsed="0.010241"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.820801" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:04.820961" level="INFO">${mapping_to_use} = {'IP': '127.0.0.5', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.809340" elapsed="0.011682"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.809045" elapsed="0.012012"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.821233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.821083" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.809027" elapsed="0.012284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.822094" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.821469" elapsed="0.000654"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.822172" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.805410" elapsed="0.016904"/>
</kw>
<msg time="2026-05-01T00:59:04.822369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.793116" elapsed="0.029301"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.834752" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.846823" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.858865" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.859057" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.859232" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.859614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.859454" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.859437" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.859832" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.859998" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.860162" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.859408" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.859305" elapsed="0.000936"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.860384" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.860510" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:59:04.860637" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.788913" elapsed="0.071751"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.861758" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.861510" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.871427" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.871497" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.5 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.871588" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.863872" elapsed="0.007742"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.861872" elapsed="0.009782"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.871830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.871679" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.861854" elapsed="0.010058"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.875478" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.872910" elapsed="0.002630"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.872688" elapsed="0.002901"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.872670" elapsed="0.002954"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.879125" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.876005" elapsed="0.003183"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.875700" elapsed="0.003537"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.875678" elapsed="0.003594"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.880191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.879515" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.880690" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.880333" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.881443" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.881027" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.880803" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.880307" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.882316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.881811" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.882843" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.882472" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.883388" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.883094" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.882934" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.882426" elapsed="0.001064"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.883639" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:04.884472" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.884182" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.884654" elapsed="0.002374"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.872264" elapsed="0.014828"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:04.887138" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:04.889317" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.860926" elapsed="0.028418"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.889397" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.765297" elapsed="0.124241"/>
</kw>
<var name="${index}">5</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.764280" elapsed="0.125296"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.890417" level="INFO">&amp;{mapping} = { IP=127.0.0.6 | HOLDTIME=180 | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=127.0.0.${index}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.889853" elapsed="0.000593"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.931445" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:04.931076" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.932197" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:04.931979" elapsed="0.000282">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:04.932354" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:04.931652" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.932938" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:04.932556" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:04.933257" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/rr_client_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:04.933384" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:04.933124" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.933826" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors/neighbor=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.933581" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.934832" level="INFO">mapping: {'IP': '127.0.0.6', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.934571" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.935310" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.935054" elapsed="0.000282"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.935995" level="INFO">${value} = 127.0.0.6</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.935702" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.936792" level="INFO">${encoded} = 127.0.0.6</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.936581" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.936869" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:04.937022" level="INFO">${encoded_value} = 127.0.0.6</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.936204" elapsed="0.000843"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.937196" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.6</var>
<status status="PASS" start="2026-05-01T00:59:04.935570" elapsed="0.001905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.938177" level="INFO">${value} = 180</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.937724" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.938976" level="INFO">${encoded} = 180</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.938728" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.939051" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.939202" level="INFO">${encoded_value} = 180</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.938388" elapsed="0.000838"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.939375" elapsed="0.000240"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-05-01T00:59:04.937592" elapsed="0.002064"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.940207" level="INFO">${value} = true</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.939911" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.940955" level="INFO">${encoded} = true</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.940748" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.941029" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.941179" level="INFO">${encoded_value} = true</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.940418" elapsed="0.000785"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.941350" elapsed="0.000237"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-05-01T00:59:04.939772" elapsed="0.001856"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.942165" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.941871" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.942927" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.942702" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.943002" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.943152" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.942374" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.943322" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.941742" elapsed="0.001857"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.944136" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:04.943842" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:04.944879" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.944674" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:04.944953" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:04.945103" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:04.944345" elapsed="0.000782"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:04.945273" elapsed="0.000234"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:04.943712" elapsed="0.001836"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.935383" elapsed="0.010199"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:04.945623" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:04.945781" level="INFO">${mapping_to_use} = {'IP': '127.0.0.6', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:04.934228" elapsed="0.011616"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.933938" elapsed="0.011940"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.946050" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.945904" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.933920" elapsed="0.012206"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.946893" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:04.946266" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:04.947000" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:04.930427" elapsed="0.016699"/>
</kw>
<msg time="2026-05-01T00:59:04.947179" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:04.918188" elapsed="0.029038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.959404" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.971428" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rr_client_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.983490" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.983680" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.983854" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.984213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.984072" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:04.984058" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.984431" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.984617" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.984782" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:04.984029" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.983926" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.985004" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:04.985120" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:04.985245" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:04.914017" elapsed="0.071255"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:04.986537" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.986267" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:04.996886" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.996959" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=127.0.0.6 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:04.997081" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:04.988661" elapsed="0.008456"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.986650" elapsed="0.010522"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:04.997414" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:04.997207" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.986633" elapsed="0.010933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.002152" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:04.998936" elapsed="0.003276"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:04.998637" elapsed="0.003623"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:04.998612" elapsed="0.003683"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.005829" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.002695" elapsed="0.003197"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.002371" elapsed="0.003569"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.002349" elapsed="0.003625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.006729" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.006191" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.007185" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.006864" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.007973" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.007579" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.007337" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.006839" elapsed="0.001219"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.008586" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.008213" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.008908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.008681" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.009433" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.009143" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.008987" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.008663" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.009677" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:05.010603" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.010314" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.010779" elapsed="0.002377"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:04.998056" elapsed="0.015163"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:05.013266" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:05.015487" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:04.985550" elapsed="0.029965"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:05.015570" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/${peer_type}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:04.890784" elapsed="0.124911"/>
</kw>
<var name="${index}">6</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-05-01T00:59:04.889687" elapsed="0.126047"/>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="PASS" start="2026-05-01T00:59:04.249018" elapsed="0.766753"/>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-05-01T00:59:04.161131" elapsed="0.854759"/>
</test>
<test id="s1-s20-t8" name="Deconfigure_App_Peer" line="113">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:59:05.019114" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:59:05.018853" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.020376" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.020266" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.020248" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.025395" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.025289" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.025272" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.026475" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.026081" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.026955" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:05.026662" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:59:05.027025" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:05.027180" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:59:05.025707" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.032673" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.032566" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.032547" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.033929" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.033821" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.033804" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:05.034443" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.034142" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.034868" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:05.034646" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.063691" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:05.035383" elapsed="0.028408"/>
</kw>
<msg time="2026-05-01T00:59:05.063988" level="INFO">${status_write} = PASS</msg>
<msg time="2026-05-01T00:59:05.064035" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.035051" elapsed="0.029021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.088073" level="INFO">". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-05-01T00:59:05.064602" elapsed="0.023572"/>
</kw>
<msg time="2026-05-01T00:59:05.088331" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-05-01T00:59:05.088377" level="INFO">${message_wait} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.064241" elapsed="0.024172"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.088733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.088513" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.088492" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.089242" level="INFO"> ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "p "p "_ "P "e "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.088950" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.089606" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.089374" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.089356" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-05-01T00:59:05.089717" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:05.092198" elapsed="0.000140"/>
</kw>
<msg time="2026-05-01T00:59:05.092397" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.091129" elapsed="0.001424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.092829" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.093159" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:05.090516" elapsed="0.002828"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:59:05.089972" elapsed="0.003435"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-05-01T00:59:05.033518" elapsed="0.060004"/>
</kw>
<msg time="2026-05-01T00:59:05.093614" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:05.093658" level="INFO">${message} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.032892" elapsed="0.060802"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-05-01T00:59:05.093875" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:59:05.093770" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.093752" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.094354" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.094713" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.094783" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-05-01T00:59:05.032209" elapsed="0.062681"/>
</kw>
<msg time="2026-05-01T00:59:05.094981" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:05.095024" level="INFO">${output} =  ". "t "x "t ". "B "g "p "[C "P "o "l "i "c "i "e "s "[C "D "e "f "a "u "l "t ". "D "e "c "o "n "f "i "g "u "r "e "_ "A "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.027603" elapsed="0.067457"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.095415" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.095167" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.095149" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:05.027447" elapsed="0.068087"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:59:05.027257" elapsed="0.068306"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-01T00:59:05.024929" elapsed="0.070687"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-05-01T00:59:05.019981" elapsed="0.075688"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.019557" elapsed="0.076155"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-05-01T00:59:05.016781" elapsed="0.079014"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.096400" level="INFO">&amp;{mapping} = { IP=10.30.170.185 | BGP_RIB_OPENCONFIG=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${ODL_SYSTEM_IP}</arg>
<arg>BGP_RIB_OPENCONFIG=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.095956" elapsed="0.000472"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.137922" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.137544" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:05.138672" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:05.138441" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:05.138836" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:05.138112" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.139405" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.139023" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:05.139745" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:05.139875" level="INFO">${template} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-ext...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:05.139610" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.140314" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,$BGP_RIB_OPENCONFIG/bgp-openconfig-extensions:bgp/neighbors
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.140072" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.141299" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.141047" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.141777" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.141515" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.142441" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:05.142148" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:05.143198" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.142987" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:05.143273" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:05.143424" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:05.142671" elapsed="0.000777"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.143616" elapsed="0.000226"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:05.142016" elapsed="0.001897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.144505" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:05.144192" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:05.145380" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.145029" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:05.145471" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:05.145626" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:05.144719" elapsed="0.000931"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.145799" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:05.144058" elapsed="0.002000"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:05.141849" elapsed="0.004244"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:05.146136" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:05.146291" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:05.140731" elapsed="0.005585"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.140425" elapsed="0.005923"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.146536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.146373" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.140408" elapsed="0.006206"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.147311" level="INFO">${final_text} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.146755" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:05.147388" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:05.136916" elapsed="0.010613"/>
</kw>
<msg time="2026-05-01T00:59:05.147583" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.124594" elapsed="0.023035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.159650" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.171672" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.183633" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.183824" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.184035" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.184435" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.184292" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:05.184277" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.184670" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.184836" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.185000" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:05.184247" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.184109" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.185222" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.185298" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:05.185419" level="INFO">${uri} = rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensi...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:05.120279" elapsed="0.065166"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.186555" level="INFO">rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.186291" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:05.195763" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 path_url=/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:05.195829" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:05.195952" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:05.188643" elapsed="0.007344"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.186668" elapsed="0.009374"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.196313" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.196078" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.186650" elapsed="0.009779"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.202553" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.197814" elapsed="0.004802"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.197513" elapsed="0.005152"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.197487" elapsed="0.005214"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.206246" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.203088" elapsed="0.003223"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.202780" elapsed="0.003579"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.202757" elapsed="0.003637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.207164" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.206641" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.207650" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.207302" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.208553" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.208073" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.207841" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.207277" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.209266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.208900" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.209616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.209365" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.210152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.209857" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.209698" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.209347" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.210385" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:05.211189" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.210917" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.211370" elapsed="0.002259"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:05.196932" elapsed="0.016761"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:05.213740" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:05.215927" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:05.185723" elapsed="0.030231"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:05.216010" elapsed="0.000027"/>
</return>
<arg>${POLICIES_VAR}/app_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:05.096664" elapsed="0.119470"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.257031" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.256660" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:05.257778" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:05.257567" elapsed="0.000275">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:05.257934" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:05.257220" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.258515" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.258119" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:05.258837" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/app_peer_route/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:05.258964" level="INFO">${template} = rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:05.258700" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.259380" level="INFO">rests/data/bgp-rib:application-rib=$IP/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.259141" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.260403" level="INFO">mapping: {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.260149" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.260905" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.260636" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.261736" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:05.261278" elapsed="0.000485"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:05.262500" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.262269" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:05.262579" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:05.262733" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:05.261952" elapsed="0.000807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.262910" elapsed="0.000222"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:05.261145" elapsed="0.002029"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.263737" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:05.263421" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:05.264492" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.264265" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:05.264569" elapsed="0.000060"/>
</return>
<msg time="2026-05-01T00:59:05.264753" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:05.263951" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.264929" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-05-01T00:59:05.263288" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:05.260978" elapsed="0.004247"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:05.265268" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:05.265422" level="INFO">${mapping_to_use} = {'IP': '10.30.170.185', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:05.259832" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.259508" elapsed="0.005989"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.265671" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.265523" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.259490" elapsed="0.006257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.266436" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.265889" elapsed="0.000592"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:05.266531" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="PASS" start="2026-05-01T00:59:05.256013" elapsed="0.010644"/>
</kw>
<msg time="2026-05-01T00:59:05.266710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.243793" elapsed="0.022963"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.278775" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.290873" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.303045" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.303238" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.303413" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.303791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.303649" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:05.303635" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.304009" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.304175" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.304339" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:05.303606" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.303502" elapsed="0.000914"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.304576" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.304653" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:05.304772" level="INFO">${uri} = rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${location}</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:05.239624" elapsed="0.065209"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.305922" level="INFO">rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.305676" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:05.315040" level="INFO">DELETE Request : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ly34d4wqyigcx7k4wexgqkbz29.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:05.315086" level="INFO">DELETE Response : url=http://10.30.170.185:8181/rests/data/bgp-rib:application-rib=10.30.170.185/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:05.315175" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:05.308175" elapsed="0.007027"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.306035" elapsed="0.009208"/>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.315423" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.315270" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.306017" elapsed="0.009546"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.320347" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.317089" elapsed="0.003320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.316646" elapsed="0.003837"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.316621" elapsed="0.003900"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.324089" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.320925" elapsed="0.003230"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.320601" elapsed="0.003603"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.320578" elapsed="0.003660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.325034" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.324485" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.325520" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.325170" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.326175" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.325867" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.325635" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.325145" elapsed="0.001112"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.326792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.326417" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.327117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.326887" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.327664" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.327353" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.327196" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.326869" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.327897" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:05.328683" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:05.328396" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.328861" elapsed="0.002270"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:05.316047" elapsed="0.015146"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:05.331239" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:05.333470" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="PASS" start="2026-05-01T00:59:05.305092" elapsed="0.028406"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:05.333554" elapsed="0.000028"/>
</return>
<arg>${POLICIES_VAR}/app_peer_route</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-05-01T00:59:05.216388" elapsed="0.117290"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-05-01T00:59:05.016215" elapsed="0.317574"/>
</test>
<kw name="Stop_Suite" type="TEARDOWN">
<kw name="Virtual_Env_Delete" owner="SSHKeywords">
<kw name="Execute_Command_At_Cwd_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_At_Path_Should_Pass" owner="SSHKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.340108" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.339781" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.341602" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-05-01T00:59:05.385765" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:05.385922" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:59:05.385983" level="INFO">${stderr} = </msg>
<msg time="2026-05-01T00:59:05.386039" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:05.341400" elapsed="0.044671"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.387241" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-05-01T00:59:05.386876" elapsed="0.000427"/>
</kw>
<msg time="2026-05-01T00:59:05.387438" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-05-01T00:59:05.387530" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.386318" elapsed="0.001245"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.388373" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.387796" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.389913" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.389571" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.390538" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.390182" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.391130" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.390804" elapsed="0.000385"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:59:05.389020" elapsed="0.002245"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:05.388544" elapsed="0.002772"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.388516" elapsed="0.002835"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.391593" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.391429" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.391406" elapsed="0.000282"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:59:05.391883" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:59:05.391760" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.391739" elapsed="0.000260"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.392197" elapsed="0.000030"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:59:05.340833" elapsed="0.051527"/>
</kw>
<msg time="2026-05-01T00:59:05.392431" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.340295" elapsed="0.052242"/>
</kw>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>A keyword similar to Execute_Command_Should_Pass which performs "cd" to ${path} before executing the rm -rf /tmp/defaultvenv.
This is useful when rewriting bash scripts, as series of SSHLibrary.Execute_Command do not share current working directory.
TODO: Perhaps a Keyword which sets up environment variables would be useful as well.</doc>
<status status="PASS" start="2026-05-01T00:59:05.339162" elapsed="0.053486"/>
</kw>
<msg time="2026-05-01T00:59:05.392716" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_At_Path_Should_Pass</arg>
<arg>command=${command}</arg>
<arg>path=${SSHKeywords__current_remote_working_directory}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.335306" elapsed="0.057484"/>
</kw>
<arg>rm -rf ${SSHKeywords__current_venv_path}</arg>
<doc>Run Execute_Command_At_Path_Should_Pass with previously set CWD as path.</doc>
<status status="PASS" start="2026-05-01T00:59:05.334819" elapsed="0.058075"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-05-01T00:59:05.334593" elapsed="0.058371"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T00:59:05.393162" elapsed="0.000517"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:05.393996" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T00:59:05.393894" elapsed="0.000196"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-05-01T00:59:05.334319" elapsed="0.059842"/>
</kw>
<doc>Functional test for bgp routing policies

Copyright (c) 2018 AT&amp;T Intellectual Property. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

This suite uses 7 peers: app peer, 2x rr-client, 2x ebgp, 2x ibgp
Tests results on effective-rib-in dependant on their respective configurations.
Peers 1,2,4,5 are testing multiple ipv4 routes with additional arguments.
Peers 3,6 have ipv4 and ipv6 mpls-labeled routes.</doc>
<status status="FAIL" start="2026-05-01T00:58:16.572023" elapsed="48.822180"/>
</suite>
<suite id="s1-s21" name="Tcpmd5User" source="/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/tcpmd5user.robot">
<kw name="Set_It_Up" type="SETUP">
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.484825" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:59:05.480911" elapsed="0.003943"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-01T00:59:05.485042" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.484938" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.484918" elapsed="0.000230"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.485668" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:05.485301" elapsed="0.000431"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.486200" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-01T00:59:05.485889" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-01T00:59:05.486731" elapsed="0.000278"/>
</kw>
<msg time="2026-05-01T00:59:05.487104" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:05.487150" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.486383" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.487716" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.487333" elapsed="0.000410"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.488698" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:05.488419" elapsed="0.000306"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.489123" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:05.488870" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.489600" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.489297" elapsed="0.000330"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.492702" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.493405" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.493082" elapsed="0.000349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.493602" elapsed="0.000252"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.494635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.494325" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-05-01T00:59:05.494708" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:05.494867" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-05-01T00:59:05.494042" elapsed="0.000850"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:05.495473" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19401190&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:59:05.495038" elapsed="0.000563"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.495754" elapsed="0.000187"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-05-01T00:59:05.492127" elapsed="0.003874"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:05.491946" elapsed="0.004098"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-05-01T00:59:05.489679" elapsed="0.006396"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.496626" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:05.496228" elapsed="0.000441"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.497198" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.185'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:05.496821" elapsed="0.000419"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.497992" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:05.497391" elapsed="0.000645"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-01T00:59:05.487981" elapsed="0.010115"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-01T00:59:05.480573" elapsed="0.017579"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.498368" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.498254" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.498235" elapsed="0.000202"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.501475" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:05.501079" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.501972" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-01T00:59:05.501654" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-01T00:59:05.502043" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:05.502200" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-01T00:59:05.500765" elapsed="0.001459"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:05.503198" level="INFO">${member_ip} = 10.30.170.185</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.502936" elapsed="0.000288"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.504007" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:05.504106" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.503862" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.506728" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.506406" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.506387" elapsed="0.000540"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.507197" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:05.507317" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.507069" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.508405" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.185" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.507504" elapsed="0.000965"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.509251" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.508620" elapsed="0.000657"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.510728" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:59:05.510932" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:59:05.510168" elapsed="0.000814"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.511256" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.513317" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:59:05.834607" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:58:16 UTC 2026

  System load:  0.19               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:58:17 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:59:05.512927" elapsed="0.321833"/>
</kw>
<msg time="2026-05-01T00:59:05.834919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.512188" elapsed="0.322885"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:59:05.509501" elapsed="0.325790"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.835764" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-05-01T00:59:05.849232" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-05-01T00:59:05.849610" level="INFO">${stdout} = </msg>
<msg time="2026-05-01T00:59:05.849714" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:05.835510" elapsed="0.014258"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.850114" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.852052" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.850969" elapsed="0.001190"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.852657" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.852313" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.852271" elapsed="0.000549"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:59:05.853215" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-05-01T00:59:05.852936" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.852902" elapsed="0.000506"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.853518" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.858205" elapsed="0.001004"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.859530" elapsed="0.000588"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.860366" elapsed="0.000287"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:05.854187" elapsed="0.006580"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-05-01T00:59:05.505930" elapsed="0.354965"/>
</kw>
<msg time="2026-05-01T00:59:05.860966" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.505246" elapsed="0.355788"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:59:05.504778" elapsed="0.356362"/>
</kw>
<msg time="2026-05-01T00:59:05.861195" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.504276" elapsed="0.356981"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:05.865128" elapsed="0.000305"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.865607" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.865891" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:05.861688" elapsed="0.004349"/>
</kw>
<msg time="2026-05-01T00:59:05.866126" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-05-01T00:59:05.503432" elapsed="0.362719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.866618" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.866314" elapsed="0.000345"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:59:05.866702" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-05-01T00:59:05.502591" elapsed="0.364238"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:05.502403" elapsed="0.364462"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-05-01T00:59:05.502276" elapsed="0.364622"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-01T00:59:05.498668" elapsed="0.368338"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-01T00:59:05.867154" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-01T00:59:05.880808" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:05.880699" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.880681" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.881161" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:05.881263" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.881032" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.881707" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.881436" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:05.882131" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:05.881894" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:05.882904" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-05-01T00:59:05.882684" elapsed="0.000326">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-05-01T00:59:05.883115" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:59:05.883160" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.882320" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:05.883491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:05.883259" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:05.883240" elapsed="0.000352"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:05.884324" level="INFO">${ip_address} = 10.30.170.185</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.884060" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-05-01T00:59:05.884397" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:05.884565" level="INFO">${odl_ip} = 10.30.170.185</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-05-01T00:59:05.883798" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.884740" elapsed="0.000402"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.885407" level="INFO">index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:05.885525" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.185
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.885303" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.885701" elapsed="0.002345"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-05-01T00:59:05.888481" level="INFO">Logging into '10.30.170.185:8101' as 'karaf'.</msg>
<msg time="2026-05-01T00:59:06.036643" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-05-01T00:59:05.888206" elapsed="0.148621"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.042041" elapsed="0.000311"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:06.042526" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:06.042822" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:06.038698" elapsed="0.004273"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-01T00:59:06.037378" elapsed="0.005641"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-05-01T00:59:05.880404" elapsed="0.162669"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:59:05.868073" elapsed="0.175047"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:05.867715" elapsed="0.175458"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-05-01T00:59:05.867574" elapsed="0.175639"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-05-01T00:59:05.867417" elapsed="0.175828"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-01T00:59:05.480170" elapsed="0.563131"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:06.047383" level="INFO">Creating Session using : alias=default, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a18ba1ad0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:59:06.047013" elapsed="0.000505"/>
</kw>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="PASS" start="2026-05-01T00:59:06.046609" elapsed="0.000978"/>
</kw>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:06.052617" level="INFO">${odl_connection} = 6</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:06.052224" elapsed="0.000420"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:59:06.054561" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:59:06.054642" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:59:06.054084" elapsed="0.000582"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.054820" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:59:06.055990" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:59:06.414746" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:58:16 UTC 2026

  System load:  0.19               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:59:05 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:59:06.055675" elapsed="0.359256"/>
</kw>
<msg time="2026-05-01T00:59:06.415028" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.055305" elapsed="0.359827"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:59:06.053622" elapsed="0.361640"/>
</kw>
<msg time="2026-05-01T00:59:06.415318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.053150" elapsed="0.362219"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:59:06.052814" elapsed="0.362640"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:59:06.415532" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T00:59:06.415898" level="INFO">${odl} = 6</msg>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:59:06.051940" elapsed="0.363985"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-05-01T00:59:06.425229" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T00:59:06.449344" level="INFO">'/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-05-01T00:59:06.416179" elapsed="0.033340"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:06.449877" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-05-01T00:59:06.451021" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:06.450684" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:06.450632" elapsed="0.000539"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:06.460406" level="INFO">${tools_connection} = 7</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:06.459996" elapsed="0.000437"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:59:06.462178" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:59:06.462255" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:59:06.461890" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.462466" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:59:06.463641" level="INFO">Logging into '10.30.170.157:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:59:07.198248" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:59:06 UTC 2026

  System load:  0.01               Processes:             106
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.157
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:57:27 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:59:06.463307" elapsed="0.735115"/>
</kw>
<msg time="2026-05-01T00:59:07.198539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.462957" elapsed="0.735672"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:59:06.461438" elapsed="0.737313"/>
</kw>
<msg time="2026-05-01T00:59:07.198806" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:06.460990" elapsed="0.737863"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-05-01T00:59:06.460646" elapsed="0.738287"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-05-01T00:59:07.198989" elapsed="0.000045"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:59:06.459618" elapsed="0.739559"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="PASS" start="2026-05-01T00:59:06.047843" elapsed="1.151388"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.199650" level="INFO">index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:07.199765" level="INFO">${current_connection} = index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:07.199484" elapsed="0.000309"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.202569" level="INFO">${current_prompt} = &gt;</msg>
<var>${current_prompt}</var>
<arg>${current_connection.prompt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:07.199946" elapsed="0.002652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.203030" level="INFO">&gt;</msg>
<arg>${current_prompt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.202759" elapsed="0.000318"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.207303" level="INFO">${prompt} = &gt;</msg>
<arg>${prompt}</arg>
<arg>${current_prompt}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:07.203237" elapsed="0.004115"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:07.207834" level="INFO">Creating Session using : alias=session, url=http://10.30.170.185:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7b8a19f8f890&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>${CONFIG_SESSION}</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-01T00:59:07.207527" elapsed="0.000565"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.226029" level="INFO">${name_prefix} = pcep-pcc-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:07.225641" elapsed="0.000416"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.226624" level="INFO">${extension} = jar</msg>
<var>${extension}</var>
<arg>'${component}'=='odl-micro'</arg>
<arg>tar</arg>
<arg>jar</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.226222" elapsed="0.000429"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.227224" level="INFO">${name_suffix} = -executable.jar</msg>
<var>${name_suffix}</var>
<arg>"${suffix}" != ""</arg>
<arg>-${suffix}.${extension}</arg>
<arg>.${extension}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.226815" elapsed="0.000436"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.228558" elapsed="0.000323"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-05-01T00:59:07.229273" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${BUNDLE_URL}</arg>
<arg>/org/opendaylight</arg>
<doc>Returns contents of the ``string`` before the first occurrence of ``marker``.</doc>
<status status="PASS" start="2026-05-01T00:59:07.229054" elapsed="0.000246"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.229907" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>'${urlbase}' != '${BUNDLE_URL}'</arg>
<arg>${urlbase}</arg>
<arg>${fallback_url}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.229478" elapsed="0.000457"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.301066" elapsed="0.000508"/>
</kw>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'carpeople'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.300521" elapsed="0.001136"/>
</kw>
<msg time="2026-05-01T00:59:07.301711" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>magnesium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.239380" elapsed="0.062393"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>carpeople</arg>
<doc>Compare magnesium to vanadium and in case vanadium is at most magnesium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.239033" elapsed="0.062818"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.320309" elapsed="0.000521"/>
</kw>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'netconf'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.319891" elapsed="0.001031"/>
</kw>
<msg time="2026-05-01T00:59:07.320984" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>aluminium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.311283" elapsed="0.009761"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<doc>Compare aluminium to vanadium and in case vanadium is at most aluminium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.310935" elapsed="0.010187"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.339743" elapsed="0.000481"/>
</kw>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${upper_bound} to vanadium and in case vanadium is at most ${upper_bound},
run Collections.Remove_Values_From_List [['mdsal', 'odlparent', 'yangtools', 'carpeople', 'netconf', 'bgpcep'], 'bgpcep'] {} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.339274" elapsed="0.001026"/>
</kw>
<msg time="2026-05-01T00:59:07.340350" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Most</arg>
<arg>silicon</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.330705" elapsed="0.009703"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>bgpcep</arg>
<doc>Compare silicon to vanadium and in case vanadium is at most silicon,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-05-01T00:59:07.330304" elapsed="0.010201"/>
</kw>
<if>
<branch type="IF" condition="'${build_version}'=='${EMPTY}'">
<kw name="NexusKeywords__Detect_Version_To_Pull" owner="NexusKeywords">
<kw name="NexusKeywords__Get_Items_To_Look_At" owner="NexusKeywords">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<arg>Component not supported by NexusKeywords version detection: ${component}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:07.343533" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-01T00:59:07.344398" elapsed="0.000208"/>
</kw>
<msg time="2026-05-01T00:59:07.344653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Collections.Get_From_Dictionary</arg>
<arg>${COMPONENT_MAPPING}</arg>
<arg>${component}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.344052" elapsed="0.000659"/>
</kw>
<msg time="2026-05-01T00:59:07.344830" level="INFO">${itemlist} = pcep-impl</msg>
<var>${itemlist}</var>
<arg>${component}</arg>
<doc>Get a list of items that might contain the version number that we are looking for.</doc>
<status status="PASS" start="2026-05-01T00:59:07.343250" elapsed="0.001606"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.345147" level="INFO">index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-05-01T00:59:07.345251" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.157
alias=None
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-01T00:59:07.345014" elapsed="0.000265"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.350637" level="INFO">${odl_connection} = 8</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-01T00:59:07.350187" elapsed="0.000477"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.352293" level="INFO">Length is 0.</msg>
<msg time="2026-05-01T00:59:07.352372" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:59:07.352008" elapsed="0.000388"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.352562" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.354396" level="INFO">Logging into '10.30.170.185:22' as 'jenkins'.</msg>
<msg time="2026-05-01T00:59:07.669431" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri May  1 00:58:16 UTC 2026

  System load:  0.19               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.185
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

10 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri May  1 00:59:06 2026 from 10.30.170.142
[?2004h[jenkins@releng-26932-215-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-05-01T00:59:07.353429" elapsed="0.316171"/>
</kw>
<msg time="2026-05-01T00:59:07.669683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.353073" elapsed="0.316691"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-05-01T00:59:07.351578" elapsed="0.318299"/>
</kw>
<msg time="2026-05-01T00:59:07.669929" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.351167" elapsed="0.318810"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-05-01T00:59:07.350842" elapsed="0.319232"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-01T00:59:07.670143" elapsed="0.000046"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-05-01T00:59:07.349884" elapsed="0.320449"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.670889" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.2/system pcep-impl'.</msg>
<msg time="2026-05-01T00:59:07.714443" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:07.714815" level="INFO">${version} = 1.0.1
org/opendaylight/bgpcep</msg>
<msg time="2026-05-01T00:59:07.714950" level="INFO">${result} = 0</msg>
<var>${version}</var>
<var>${result}</var>
<arg>sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist}</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:07.670591" elapsed="0.044439"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-01T00:59:07.715521" elapsed="0.000682"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-01T00:59:07.724110" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T00:59:07.724437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.723038" elapsed="0.001511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.724771" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.724956" elapsed="0.000092"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-01T00:59:07.717112" elapsed="0.008006"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.725581" level="INFO">1.0.1
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.725289" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.725937" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:07.725716" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.725690" elapsed="0.000332"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:07.726426" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:59:07.726502" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${version}</arg>
<arg>max_split=1</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:07.726163" elapsed="0.000364"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-05-01T00:59:07.726584" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:07.726787" level="INFO">${version} = 1.0.1</msg>
<msg time="2026-05-01T00:59:07.726832" level="INFO">${location} = org/opendaylight/bgpcep</msg>
<var>${version}</var>
<var>${location}</var>
<arg>${component}</arg>
<doc>Determine the exact Nexus directory to be used as a source for a particular test tool
Figure out what version of the tool needs to be pulled out of the
Nexus by looking at the version directory of the subsystem from
which the tool is being pulled. This code is REALLY UGLY but there
is no way around it until the bug
https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed.
I also don't want to depend on maven-metadata-local.xml and other
bits and pieces of ODL distribution which are not required for ODL
to function properly.</doc>
<status status="PASS" start="2026-05-01T00:59:07.342878" elapsed="0.383978"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:07.340605" elapsed="0.386295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.727074" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:07.726927" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.340574" elapsed="0.386584"/>
</if>
<if>
<branch type="IF" condition="'SNAPSHOT' in '${version}'">
<kw name="Remove Values From List" owner="Collections">
<arg>${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>netconf</arg>
<arg>bgpcep</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.727481" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:07.727218" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.727201" elapsed="0.000375"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.728134" level="INFO">${is_staged} = "TRUE"</msg>
<var>${is_staged}</var>
<arg>"opendaylight.release" not in '${urlbase}' and "opendaylight.snapshot" not in '${urlbase}'</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.727724" elapsed="0.000439"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.728770" level="INFO">${is_mri_component} = "TRUE"</msg>
<var>${is_mri_component}</var>
<arg>'${component}' in ${RELEASE_INTEGRATED_COMPONENTS}</arg>
<arg>"TRUE"</arg>
<arg>"FALSE"</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.728328" elapsed="0.000471"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.729366" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-9786</msg>
<var>${urlbase}</var>
<arg>${is_mri_component} == "TRUE" and ${is_staged} == "FALSE"</arg>
<arg>${NEXUS_RELEASE_BASE_URL}</arg>
<arg>${urlbase}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.728964" elapsed="0.000430"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.729966" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:07.729567" elapsed="0.000428"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.732326" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml'.</msg>
<msg time="2026-05-01T00:59:07.826905" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:07.827355" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-05-01T00:59:07.827579" level="INFO">${stderr} =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0   ...</msg>
<msg time="2026-05-01T00:59:07.827723" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:07.732082" elapsed="0.095717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.830595" level="INFO">Length is 316.</msg>
<msg time="2026-05-01T00:59:07.830870" level="FAIL">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  15416      0 --:--:-- --:--:-- --:--:-- 15464' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:59:07.829664" elapsed="0.001417">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  15416      0 --:--:-- --:--:-- --:--:-- 15464' should be empty.</status>
</kw>
<msg time="2026-05-01T00:59:07.831415" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:59:07.831598" level="INFO">${result} = '  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0  ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:07.828495" elapsed="0.003322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.833535" level="INFO">${success} = True</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.832536" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.835193" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.834942" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.835655" level="INFO">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1098    0  1098    0     0  15416      0 --:--:-- --:--:-- --:--:-- 15464</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.835398" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.836077" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.835841" elapsed="0.000280"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:59:07.834405" elapsed="0.001773"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:07.833751" elapsed="0.002485"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.833705" elapsed="0.002564"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:59:07.836441" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:07.836331" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.836313" elapsed="0.000221"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-05-01T00:59:07.836687" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-05-01T00:59:07.836590" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.836574" elapsed="0.000221"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:07.836939" elapsed="0.000023"/>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-05-01T00:59:07.731331" elapsed="0.105733"/>
</kw>
<msg time="2026-05-01T00:59:07.837128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:07.730637" elapsed="0.106544"/>
</kw>
<msg time="2026-05-01T00:59:07.837337" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<var>${metadata}</var>
<arg>curl -L ${url}/maven-metadata.xml</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="PASS" start="2026-05-01T00:59:07.730214" elapsed="0.107153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.839868" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;

    &lt;link rel="icon" type="image/png" href="https://nexus.opendaylight.org/favicon.png"&gt;
    &lt;!--[if IE]&gt;
    &lt;link rel="SHORTCUT ICON" href="https://nexus.opendaylight.org/favicon.ico"/&gt;
    &lt;![endif]--&gt;

    &lt;link rel="stylesheet" href="https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1'.</msg>
<msg time="2026-05-01T00:59:07.878801" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:07.879142" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-05-01T00:59:07.879357" level="INFO">${stderr} = bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text...</msg>
<msg time="2026-05-01T00:59:07.879502" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>${command}</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:07.839678" elapsed="0.039883"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.881569" level="INFO">Length is 253.</msg>
<msg time="2026-05-01T00:59:07.881761" level="FAIL">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-05-01T00:59:07.880917" elapsed="0.000996">'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory' should be empty.</status>
</kw>
<msg time="2026-05-01T00:59:07.882148" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-05-01T00:59:07.882246" level="INFO">${result} = 'bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=tex...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:07.880006" elapsed="0.002296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.883698" level="INFO">${success} = False</msg>
<var>${success}</var>
<arg>(${rc} == 0) and (("${emptiness_status}" == "PASS") or not ${stderr_must_be_empty})</arg>
<arg>True</arg>
<arg>False</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.882694" elapsed="0.001070"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.885756" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-9786 (staging: closed)&amp;quot; [id=autorelease-9786]&lt;/title&gt;
    &lt;meta http-equiv=Content-Type content=text/html</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.885382" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.886363" level="INFO">bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.886032" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.886981" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.886651" elapsed="0.000390"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-05-01T00:59:07.884862" elapsed="0.002256"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:07.883958" elapsed="0.003212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.883908" elapsed="0.003298"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-05-01T00:59:07.887428" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:07.887284" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.887261" elapsed="0.000290"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-05-01T00:59:07.887747" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:07.887624" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.887603" elapsed="0.000233"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.888551" level="FAIL">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</msg>
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:07.888022" elapsed="0.000627">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="FAIL" start="2026-05-01T00:59:07.839124" elapsed="0.049716">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:59:07.888948" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Execute_Command_Passes</arg>
<arg>${command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:59:07.838599" elapsed="0.050433"/>
</kw>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>A wrapper for Execute_Command_Passes with return_success_only=False
Also, log_on_success defaults to True (but is customizable, unlike return_success_only)..</doc>
<status status="FAIL" start="2026-05-01T00:59:07.838172" elapsed="0.051009">Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonatype-content.css?2.14.20-02 type=text/css media=screen title=no: No such file or directory</status>
</kw>
<msg time="2026-05-01T00:59:07.889387" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:59:07.889474" level="INFO">${namepart} = Got rc: 0 or stderr was not empty: bash: line 8: ICON href=https://nexus.opendaylight.org/favicon.ico/&gt;
    &lt;![endif]--&gt;

    &lt;link rel=stylesheet href=https://nexus.opendaylight.org/static/css/Sonaty...</msg>
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:07.837543" elapsed="0.051970"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.890240" level="INFO">Length is 288.</msg>
<msg time="2026-05-01T00:59:07.890343" level="INFO">${length} = 288</msg>
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-01T00:59:07.889733" elapsed="0.000642"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.891167" level="INFO">${namepart} = 1.0.1</msg>
<var>${namepart}</var>
<arg>"${status}" != "PASS" or ${length} == 0</arg>
<arg>${version}</arg>
<arg>${namepart}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:07.890612" elapsed="0.000591"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.891922" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:07.891416" elapsed="0.000542"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.892569" level="INFO">pcep-pcc-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.892161" elapsed="0.000474"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.893180" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:07.892854" elapsed="0.000356"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.893569" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:59:07.952565" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-05-01T00:59:07.952955" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:59:07.953050" level="INFO">${result} = 8</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:07.893368" elapsed="0.059734"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:07.954205" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:07.953576" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-05-01T00:59:07.954729" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:07.954455" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:07.954402" elapsed="0.000466"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:07.955586" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${release_url}</var>
<arg>${url}</arg>
<arg>autorelease-[0-9]{4}</arg>
<arg>opendaylight.release</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:07.955140" elapsed="0.000499"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:07.956266" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.1/pcep-pcc-mock-1.0.1-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:59:08.028384" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:08.028674" level="INFO">${response} = </msg>
<msg time="2026-05-01T00:59:08.028740" level="INFO">${result} = 0</msg>
<var>${response}</var>
<var>${result}</var>
<arg>wget -q -N '${release_url}' 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:07.955947" elapsed="0.072828"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.029367" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.028941" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.028902" elapsed="0.000604"/>
</if>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:59:08.029560" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:59:08.029808" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${filename}</var>
<arg>${component}</arg>
<arg>${artifact}</arg>
<arg>${name_prefix}</arg>
<arg>${name_suffix}</arg>
<arg>${fallback_url}</arg>
<arg>${explicit_url}</arg>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
bgpcep is a name part of an artifact present in system/ of ODl installation with the same version as pcep-pcc-mock should have.
Must have https://nexus.opendaylight.org/content/repositories//autorelease-9786/org/opendaylight/integration/karaf/0.23.2/karaf-0.23.2.zip variable set to the URL from which the
tested ODL distribution was downloaded and this place must be
inside a repository created by a standard distribution
construction job. If this is detected to ne be the case, fallback URL is used.
If  is non-empty, Deploy_From_Utrl is called instead.
TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.</doc>
<status status="PASS" start="2026-05-01T00:59:07.227925" elapsed="0.801921"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-05-01T00:59:08.029943" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:08.030155" level="INFO">${name} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<var>${name}</var>
<arg>bgpcep</arg>
<arg>pcep-pcc-mock</arg>
<doc>Deploy a test tool.
The test tools have naming convention of the form
"&lt;repository_url&gt;/some/dir/somewhere/&lt;tool-name&gt;/&lt;tool-name&gt;-&lt;version-tag&gt;-${suffix}.jar"
where "&lt;tool-name&gt;" is the name of the tool and "&lt;version-tag&gt;" is
the version tag that is digged out of the maven metadata. This
keyword calculates ${name_prefix} and ${name_suffix} for
"Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
work of deploying the artifact.</doc>
<status status="PASS" start="2026-05-01T00:59:07.219885" elapsed="0.810305"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.036755" level="INFO">${filename} = pcep-pcc-mock-1.0.1-executable.jar</msg>
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:08.030536" elapsed="0.006287"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.041865" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:08.037497" elapsed="0.004423"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:59:08.037158" elapsed="0.004838"/>
</kw>
<doc>Create SSH session to Mininet machine, prepare HTTP client session to Controller.
Figure out latest pcc-mock version and download it from Nexus to Mininet.
Also, delete and create directories for json diff handling.</doc>
<status status="PASS" start="2026-05-01T00:59:05.479814" elapsed="2.562239"/>
</kw>
<test id="s1-s21-t1" name="Topology_Precondition" line="49">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.043312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.043089" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.043069" elapsed="0.000326"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:08.042894" elapsed="0.000548"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.083258" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.082864" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.084121" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.083806" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.084299" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.083476" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.084893" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.084506" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.085247" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:08.085437" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:08.085073" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.085873" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.085628" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.086887" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.086635" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.087562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:08.087081" elapsed="0.000507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.087927" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.088129" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.088293" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.087799" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.087647" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:08.088432" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:59:08.088623" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:08.086302" elapsed="0.002346"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.086000" elapsed="0.002681"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.088847" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.088708" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.085975" elapsed="0.003001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.089670" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.089116" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.089750" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:08.082245" elapsed="0.007659"/>
</kw>
<msg time="2026-05-01T00:59:08.089961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.081287" elapsed="0.008724"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.090549" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.091055" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.091593" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.091778" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.091943" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.092305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.092169" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.092154" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.092547" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.092710" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.092865" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.092123" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.092017" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.093086" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.093163" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:08.093320" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:08.076817" elapsed="0.016530"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.094697" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.094408" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.094863" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.094051" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.095204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.094963" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.095775" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.095478" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.095288" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.094944" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.098543" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.096003" elapsed="0.002569"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:08.098627" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:08.098791" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:08.093722" elapsed="0.005095"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.100074" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.099802" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.100238" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.099467" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:08.100496" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:08.100338" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.100318" elapsed="0.000269"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.100727" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.100891" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.100959" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:08.102953" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:08.099129" elapsed="0.003852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.104497" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.104159" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.104953" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.104702" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:08.115601" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:08.115754" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:59:08 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:08.116064" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:08.107210" elapsed="0.008887"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.105068" elapsed="0.011079"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.116354" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.116180" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.105049" elapsed="0.011397"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.120417" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.117715" elapsed="0.002771"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.117480" elapsed="0.003044"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.117441" elapsed="0.003110"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.123889" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.120832" elapsed="0.003129"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.120610" elapsed="0.003404"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.120592" elapsed="0.003463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.124939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.124307" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.125503" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.125091" elapsed="0.000508"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.126322" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.125873" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.125638" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.125063" elapsed="0.001414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.127252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.126706" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.127838" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.127399" elapsed="0.000526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.128661" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.128187" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.127965" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.127373" elapsed="0.001416"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.129005" elapsed="0.000591"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:08.130146" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.129831" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:08.130317" elapsed="0.002347"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:08.116952" elapsed="0.015779"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.132917" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.132804" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.132785" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.135873" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.133128" elapsed="0.002774"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:08.135955" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:08.136131" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:08.103295" elapsed="0.032864"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.136298" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:08.136483" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:08.054020" elapsed="0.082493"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.152948" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.152567" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.153897" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.153544" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.154075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.153141" elapsed="0.000958"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.154894" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.154255" elapsed="0.000667"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.155226" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:08.155403" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:08.155079" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.155848" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.155601" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:08.156417" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.155977" elapsed="0.000518"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.156959" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.156664" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.156524" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.155953" elapsed="0.001090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.157660" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.157183" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.157743" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:08.151956" elapsed="0.005926"/>
</kw>
<msg time="2026-05-01T00:59:08.157942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.151093" elapsed="0.006900"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.158541" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.159098" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.159657" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.159841" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.160016" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.160396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.160256" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.160242" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.160632" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.160794" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.160956" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.160210" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.160099" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.161179" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.161258" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:08.161380" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:08.148373" elapsed="0.013034"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.161668" elapsed="0.002283"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.165031" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.164717" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.165539" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.165211" elapsed="0.000358"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:08.165721" elapsed="0.000333"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:08.164278" elapsed="0.001841"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.164034" elapsed="0.002121"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.166325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.166181" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.164015" elapsed="0.002428"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:08.137802" elapsed="0.028711"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:08.136885" elapsed="0.029709"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.136603" elapsed="0.030043"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.136585" elapsed="0.030087"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.166709" elapsed="0.000030"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:08.047801" elapsed="0.119045"/>
</kw>
<arg>300s</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:59:08.043615" elapsed="0.123292"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:08.167508" elapsed="0.000247"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:08.167190" elapsed="0.000633"/>
</kw>
<doc>Compare current pcep-topology to empty one.
Timeout is long enough to see that pcep is ready, with no PCC connected.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:59:08.042123" elapsed="0.125740"/>
</test>
<test id="s1-s21-t2" name="Start_Secure_Pcc_Mock" line="61">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.169272" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.169056" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.169037" elapsed="0.000321"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:08.168862" elapsed="0.000545"/>
</kw>
<kw name="Start_Pcc_Mock_Tool_With_Password">
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.171282" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.171782" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.172245" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T00:59:08.173789" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T00:59:08.188577" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T00:59:08.188816" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jul 16  2025 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-05-01T00:59:08.188915" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T00:59:08.173605" elapsed="0.015363"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-05-01T00:59:08.189388" elapsed="0.000106"/>
</return>
<status status="PASS" start="2026-05-01T00:59:08.189146" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.189102" elapsed="0.000569"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.189752" elapsed="0.000034"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-05-01T00:59:08.173191" elapsed="0.016837"/>
</kw>
<msg time="2026-05-01T00:59:08.190136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.172719" elapsed="0.017524"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.190631" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.190924" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.190844" elapsed="0.000170"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.190808" elapsed="0.000254"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.191364" elapsed="0.000046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.191870" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.192155" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.192076" elapsed="0.000172"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.192039" elapsed="0.000257"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.192627" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.193014" elapsed="0.000047"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.193395" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.193767" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.193686" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.193643" elapsed="0.000265"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.194104" elapsed="0.000028"/>
</kw>
<msg time="2026-05-01T00:59:08.194271" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-05-01T00:59:08.170927" elapsed="0.023378"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.194995" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password topsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.l...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.194530" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.195598" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password topsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.195239" elapsed="0.000422"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-05-01T00:59:08.195720" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:08.195931" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password topsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.l...</msg>
<var>${command}</var>
<arg>-jar ${filename} --password ${password} --reconnect 1 --local-address ${TOOLS_SYSTEM_IP} --remote-address ${ODL_SYSTEM_IP} 2&gt;&amp;1 | tee pccmock.log</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-05-01T00:59:08.170053" elapsed="0.025917"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.196533" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password topsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.196176" elapsed="0.000422"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T00:59:08.230745" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password topsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:08.196794" elapsed="0.034013"/>
</kw>
<arg>password=topsecret</arg>
<doc>Starts pcc-mock with password argument.</doc>
<status status="PASS" start="2026-05-01T00:59:08.169670" elapsed="0.061198"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:08.231447" elapsed="0.000258"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:08.231142" elapsed="0.000627"/>
</kw>
<doc>Execute pcc-mock on Mininet with password set, fail if pcc-mock promptly exits. Keep pcc-mock running for next test cases.</doc>
<status status="PASS" start="2026-05-01T00:59:08.168198" elapsed="0.063610"/>
</test>
<test id="s1-s21-t3" name="Topology_Unauthorized_1" line="65">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.233161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.232950" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.232931" elapsed="0.000311"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:08.232760" elapsed="0.000526"/>
</kw>
<kw name="Verify_Keyword_Does_Not_Fail_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Confirm_Keyword_Fails_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.285220" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.284833" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.286045" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.285754" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.286215" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.285412" elapsed="0.000828"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.286795" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.286394" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.287121" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:08.287283" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:08.286979" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.287883" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.287475" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.288884" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.288629" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.289345" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:08.289078" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.289724" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.289951" elapsed="0.000027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.290124" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.289594" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.289424" elapsed="0.000788"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:08.290260" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:08.290429" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:08.288297" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.288005" elapsed="0.002499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.290668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.290528" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.287982" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.291316" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.290878" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.291392" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:08.284208" elapsed="0.007328"/>
</kw>
<msg time="2026-05-01T00:59:08.291590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.283370" elapsed="0.008271"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.292169" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.292685" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.293175" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.293354" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.293558" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.293919" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.293775" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.293761" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.294147" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.294306" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.294476" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.293732" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.293633" elapsed="0.000924"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.294695" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.294771" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:08.294889" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:08.279092" elapsed="0.015822"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.296128" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.295888" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.296287" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.295562" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.296637" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.296381" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.297214" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.296923" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.296750" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.296362" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.301206" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.297437" elapsed="0.003797"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:08.301288" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:08.301446" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:08.295230" elapsed="0.006258"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.302719" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.302476" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.302877" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.302128" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:08.303112" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:59:08.302974" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.302956" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.303337" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.303519" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.303589" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:08.305654" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:08.301791" elapsed="0.003890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.307098" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.306850" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.307551" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.307291" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:08.314754" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:08.314886" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:08.315037" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:08.309732" elapsed="0.005344"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.307663" elapsed="0.007477"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.315397" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.315178" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.307644" elapsed="0.007907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.320765" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.317030" elapsed="0.003804"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.316714" elapsed="0.004171"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.316687" elapsed="0.004237"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.324350" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.321325" elapsed="0.003072"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.321008" elapsed="0.003477"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.320983" elapsed="0.003533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.325078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.324682" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.325409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.325178" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.325968" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.325669" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.325511" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.325158" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.326606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.326225" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.326940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.326706" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.327495" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.327180" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.327024" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.326688" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.327726" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:08.328541" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.328232" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:08.328716" elapsed="0.002428"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:08.316067" elapsed="0.015142"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.331387" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.331281" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.331261" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.334262" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.331616" elapsed="0.002675"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:08.334399" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:08.334587" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:08.306020" elapsed="0.028594"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.334678" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:08.335030" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:08.256298" elapsed="0.078771"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.351606" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.351216" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.352344" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.352116" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:08.352568" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:08.351790" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.353134" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:08.352751" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:08.353468" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:08.353620" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:08.353316" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.354042" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:08.353796" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:08.354660" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.354189" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.355184" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:08.354889" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.354747" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.354139" elapsed="0.001130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.355861" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:08.355408" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.355941" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:08.350617" elapsed="0.005453"/>
</kw>
<msg time="2026-05-01T00:59:08.356123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.349812" elapsed="0.006363"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.356675" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.357174" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.357685" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.357900" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.358069" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.358451" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.358313" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:08.358298" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.358681" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.358843" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.359005" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:08.358267" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.358147" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.359227" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.359304" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:08.359423" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:08.347165" elapsed="0.012289"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.359636" elapsed="0.002197"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.362908" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.362618" elapsed="0.000319"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:08.363358" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.363086" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:08.363549" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:08.362146" elapsed="0.001789"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.361915" elapsed="0.002055"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:08.364135" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:08.363995" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.361896" elapsed="0.002314"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:08.336413" elapsed="0.027845"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:08.335615" elapsed="0.028716"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:08.335205" elapsed="0.029189"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.335170" elapsed="0.029268"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:08.364529" elapsed="0.000083"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:08.248193" elapsed="0.116632"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:08.237340" elapsed="0.127687"/>
</kw>
<msg time="2026-05-01T00:59:08.365120" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:08.365165" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:08.236958" elapsed="0.128230"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:08.365371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:08.365261" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:08.365243" elapsed="0.000195"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.365906" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.365598" elapsed="0.000334"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:08.366440" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.366078" elapsed="0.000447">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.236590" elapsed="0.130049">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.424424" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.424034" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.425235" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.424967" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:09.425404" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:09.424639" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.426019" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:09.425604" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.426343" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:09.426521" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:09.426201" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.426944" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.426697" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.427946" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.427691" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.428412" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:09.428143" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.428782" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.428981" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.429153" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:09.428653" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.428509" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:09.429288" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:09.429471" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:09.427357" elapsed="0.002142"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.427067" elapsed="0.002464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.429697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.429556" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.427044" elapsed="0.002732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.430502" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:09.430027" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:09.430582" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:09.423412" elapsed="0.007298"/>
</kw>
<msg time="2026-05-01T00:59:09.430766" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:09.422594" elapsed="0.008224"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.431310" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.431834" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.432334" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.432530" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.432697" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.433246" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.433106" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:09.433090" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.433478" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.433644" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.433804" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:09.433057" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.432770" elapsed="0.001141"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.434057" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.434137" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:09.434260" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:09.417345" elapsed="0.016942"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.435617" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.435335" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:09.435789" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:09.434992" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.436163" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.435895" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.436781" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.436423" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.436250" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.435875" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.439314" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:09.437018" elapsed="0.002324"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:09.439396" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:09.439610" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:09.434667" elapsed="0.004970"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.440867" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.440619" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:09.441025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:09.440268" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:09.441262" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:09.441123" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.441104" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.441511" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.441679" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.441747" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:09.443811" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:09.439944" elapsed="0.003901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.445290" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.445037" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.445752" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.445504" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:09.453559" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:09.453695" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:09.453791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:09.448378" elapsed="0.005438"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.445864" elapsed="0.007994"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.454112" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.453885" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.445844" elapsed="0.008407"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.458793" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.455410" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.455111" elapsed="0.003798"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.455085" elapsed="0.003860"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.462609" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.459321" elapsed="0.003354"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.459024" elapsed="0.003699"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.459000" elapsed="0.003757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.463347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:09.462964" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.463691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.463445" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.464226" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.463927" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.463775" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.463427" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.464843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:09.464476" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.465171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.464941" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.465720" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.465406" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.465254" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.464922" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:09.465945" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:09.466775" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:09.466483" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:09.466947" elapsed="0.002320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:09.454629" elapsed="0.014700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.469525" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:09.469401" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.469382" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:09.472534" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:09.469730" elapsed="0.002833"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:09.472615" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:09.472771" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:09.444214" elapsed="0.028583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:09.472859" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:09.473189" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:09.393123" elapsed="0.080102"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.489887" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.489515" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.490661" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.490415" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:09.490822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:09.490094" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.491383" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:09.491004" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:09.491717" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:09.491861" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:09.491582" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.492274" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:09.492035" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:09.492692" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.492385" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.493230" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:09.492911" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.492776" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.492366" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.493895" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:09.493447" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:09.493972" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:09.488904" elapsed="0.005223"/>
</kw>
<msg time="2026-05-01T00:59:09.494181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:09.488112" elapsed="0.006124"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.494740" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.495238" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.495782" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.495968" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.496139" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.496519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.496368" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:09.496350" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.496732" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.496890" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.497048" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:09.496317" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.496214" elapsed="0.000921"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.497273" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.497348" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:09.497480" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:09.485438" elapsed="0.012070"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:09.497675" elapsed="0.002374"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:09.501080" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:09.500783" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:09.501541" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:09.501252" elapsed="0.000316"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:09.501712" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:09.500363" elapsed="0.001768"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.500131" elapsed="0.002036"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:09.502333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:09.502192" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.500112" elapsed="0.002331"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:09.474620" elapsed="0.027891"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:09.473788" elapsed="0.028800"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:09.473390" elapsed="0.029263"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.473357" elapsed="0.029341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:09.502762" elapsed="0.000078"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:09.384240" elapsed="0.118805"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:09.369967" elapsed="0.133243"/>
</kw>
<msg time="2026-05-01T00:59:09.503302" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:09.503346" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:09.368808" elapsed="0.134561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:09.503576" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:09.503441" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:09.503423" elapsed="0.000221"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.504087" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:09.503778" elapsed="0.000335"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:09.504575" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.504257" elapsed="0.000379">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:09.367681" elapsed="0.137066">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.559858" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.559342" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.560814" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.560528" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:10.560990" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:10.560113" elapsed="0.000902"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.561620" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:10.561177" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.561949" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:10.562117" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:10.561803" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.562570" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.562292" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.563762" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.563443" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.564233" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:10.563960" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.564606" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.564890" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.565063" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:10.564477" elapsed="0.000646"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.564312" elapsed="0.000843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:10.565205" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:10.565425" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:10.563076" elapsed="0.002391"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.562724" elapsed="0.002780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.565679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.565533" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.562693" elapsed="0.003065"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.566345" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:10.565894" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:10.566423" elapsed="0.000047"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:10.558625" elapsed="0.007946"/>
</kw>
<msg time="2026-05-01T00:59:10.566626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:10.557763" elapsed="0.008916"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.567168" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.567705" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.568214" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.568392" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.568584" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.568939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.568804" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:10.568790" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.569148" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.569373" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.569553" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:10.568760" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.568659" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.569774" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.569853" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:10.569975" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:10.553090" elapsed="0.016911"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.571402" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.571165" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:10.571579" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:10.570827" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.571911" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.571675" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.572453" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.572161" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.571992" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.571657" elapsed="0.000893"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.574898" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:10.572691" elapsed="0.002234"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:10.574977" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:10.575135" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:10.570317" elapsed="0.004844"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.576359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.576122" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:10.576534" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:10.575794" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:10.576770" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:10.576633" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.576614" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.576996" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.577161" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.577228" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:10.579153" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:10.575476" elapsed="0.003703"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.580615" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.580348" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.581049" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.580806" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:10.588170" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:10.588393" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:10.588611" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:10.583234" elapsed="0.005426"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.581161" elapsed="0.007580"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.589046" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.588789" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.581142" elapsed="0.008007"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.594345" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.590291" elapsed="0.004127"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.589982" elapsed="0.004516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.589960" elapsed="0.004583"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.598689" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.594984" elapsed="0.003758"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.594635" elapsed="0.004148"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.594607" elapsed="0.004205"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.599422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:10.599004" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.599771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.599540" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.600309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.600013" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.599854" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.599521" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.600922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:10.600560" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.601242" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.601019" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.601808" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.601515" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.601324" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.601001" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:10.602030" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:10.602847" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:10.602548" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:10.603025" elapsed="0.002312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:10.589551" elapsed="0.015849"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.605681" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:10.605570" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.605549" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:10.608561" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:10.605891" elapsed="0.002699"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:10.608643" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:10.608802" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:10.579541" elapsed="0.029287"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:10.608891" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:10.609233" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:10.527788" elapsed="0.081482"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.625692" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.625298" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.626441" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.626199" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:10.626625" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:10.625876" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.627344" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:10.626807" elapsed="0.000565"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:10.627685" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:10.627862" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:10.627545" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.628288" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:10.628043" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:10.628710" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.628404" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.629218" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:10.628932" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.628795" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.628384" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.629903" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:10.629437" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:10.629994" elapsed="0.000038"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:10.624705" elapsed="0.005437"/>
</kw>
<msg time="2026-05-01T00:59:10.630243" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:10.623920" elapsed="0.006376"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.630798" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.631302" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.631812" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.631990" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.632155" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.632535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.632384" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:10.632370" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.632747" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.632906" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.633064" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:10.632339" elapsed="0.000778"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.632234" elapsed="0.000910"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.633281" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.633357" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:10.633488" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:10.621165" elapsed="0.012361"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:10.633738" elapsed="0.002193"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:10.636943" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:10.636659" elapsed="0.000312"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:10.637378" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:10.637114" elapsed="0.000292"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:10.637597" elapsed="0.000323"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:10.636243" elapsed="0.001751"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.636011" elapsed="0.002026"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:10.638219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:10.638068" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.635993" elapsed="0.002303"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:10.610630" elapsed="0.027713"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:10.609817" elapsed="0.028599"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:10.609401" elapsed="0.029094"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.609369" elapsed="0.029173"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:10.638608" elapsed="0.000080"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:10.519338" elapsed="0.119666"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:10.506510" elapsed="0.132662"/>
</kw>
<msg time="2026-05-01T00:59:10.639262" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:10.639309" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:10.506060" elapsed="0.133273"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:10.639543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:10.639405" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:10.639387" elapsed="0.000225"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.640053" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:10.639748" elapsed="0.000331"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:10.640536" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.640222" elapsed="0.000375">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:10.505551" elapsed="0.135156">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.696209" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.695823" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.697052" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.696787" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:11.697220" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:11.696446" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.697881" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:11.697490" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.698204" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:11.698359" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:11.698063" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.698794" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.698549" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.699797" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.699539" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.700271" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:11.699997" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.700666" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.700867" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.701035" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:11.700538" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.700350" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:11.701172" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:11.701339" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:11.699206" elapsed="0.002158"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.698916" elapsed="0.002480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.701580" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.701423" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.698894" elapsed="0.002764"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.702238" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:11.701794" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:11.702315" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:11.695187" elapsed="0.007255"/>
</kw>
<msg time="2026-05-01T00:59:11.702516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:11.694363" elapsed="0.008207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.703060" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.703764" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.704308" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.704536" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.704706" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.705064" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.704926" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:11.704911" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.705274" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.705436" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.705614" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:11.704881" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.704779" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.705832" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.705910" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:11.706028" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:11.690130" elapsed="0.015924"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.707277" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.707039" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:11.707433" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:11.706707" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.707790" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.707551" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.708329" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.708038" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.707871" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.707531" elapsed="0.000902"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.710770" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:11.708591" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:11.710849" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:11.711006" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:11.706371" elapsed="0.004660"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.712232" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.711994" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:11.712483" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:11.711665" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:11.712721" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:11.712584" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.712565" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.712947" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.713115" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.713182" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:11.715262" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:11.711329" elapsed="0.003961"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.716702" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.716437" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.717139" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.716894" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:11.724393" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:11.724616" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:11.724743" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:11.719300" elapsed="0.005471"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.717251" elapsed="0.007569"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.725037" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.724850" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.717232" elapsed="0.007898"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.728841" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.726240" elapsed="0.002649"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.726016" elapsed="0.002910"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.725997" elapsed="0.002955"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.733835" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.729317" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.729010" elapsed="0.004983"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.728990" elapsed="0.005057"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.735153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:11.734373" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.735827" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.735343" elapsed="0.000605"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.736989" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.736316" elapsed="0.000739"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.736000" elapsed="0.001141"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.735308" elapsed="0.001872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.737880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:11.737382" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.738302" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.738004" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.738965" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.738657" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.738494" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.737981" elapsed="0.001073"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:11.739207" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:11.740063" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:11.739751" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:11.740242" elapsed="0.003062"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:11.725567" elapsed="0.017830"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.743657" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:11.743515" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.743487" elapsed="0.000250"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:11.746776" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:11.743881" elapsed="0.002933"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:11.746883" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:59:11.747065" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:11.715614" elapsed="0.031479"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:11.747162" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:11.747573" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:11.667603" elapsed="0.080012"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.765104" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.764720" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.765948" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.765658" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:11.766139" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:11.765294" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.766755" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:11.766335" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:11.767095" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:11.767334" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:11.766948" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.767842" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:11.767587" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:11.768259" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.767962" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.768859" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:11.768508" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.768348" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.767941" elapsed="0.001007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.769556" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:11.769094" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:11.769638" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:11.764056" elapsed="0.005716"/>
</kw>
<msg time="2026-05-01T00:59:11.769827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:11.763213" elapsed="0.006668"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.770375" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.770902" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.771408" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.771606" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.771779" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.772162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.772020" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:11.772003" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.772380" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.772581" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.772801" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:11.771970" elapsed="0.000891"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.771860" elapsed="0.001031"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.773035" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.773115" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:11.773237" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:11.760439" elapsed="0.012825"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:11.773436" elapsed="0.002414"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:11.776956" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:11.776643" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:11.777418" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:11.777135" elapsed="0.000312"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:11.777616" elapsed="0.000334"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:11.776173" elapsed="0.001841"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.775935" elapsed="0.002115"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:11.778220" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:11.778076" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.775915" elapsed="0.002386"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:11.749061" elapsed="0.029292"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:11.748158" elapsed="0.030274"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:11.747756" elapsed="0.030761"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.747720" elapsed="0.030846"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:11.778633" elapsed="0.000082"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:11.659022" elapsed="0.119910"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:11.643506" elapsed="0.135604"/>
</kw>
<msg time="2026-05-01T00:59:11.779205" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:11.779251" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:11.642597" elapsed="0.136678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:11.779483" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:11.779349" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:11.779330" elapsed="0.000227"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.780010" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:11.779698" elapsed="0.000339"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:11.780506" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.780184" elapsed="0.000388">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:11.641662" elapsed="0.139060">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.837219" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.836821" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.838072" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.837780" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:12.838246" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:12.837425" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.838846" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:12.838433" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.839237" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:12.839399" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:12.839032" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.839850" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.839597" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.840867" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.840608" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.841335" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:12.841065" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.841706" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.841904" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.842074" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:12.841576" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.841414" elapsed="0.000753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:12.842214" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:12.842381" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:12.840273" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.839974" elapsed="0.002464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.842622" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.842479" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.839950" elapsed="0.002748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.843318" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:12.842834" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:12.843395" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:12.836196" elapsed="0.007341"/>
</kw>
<msg time="2026-05-01T00:59:12.843593" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:12.835341" elapsed="0.008303"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.844189" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.844710" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.845209" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.845387" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.845569" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.845928" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.845790" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:12.845776" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.846139" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.846299" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.846472" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:12.845746" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.845644" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.846693" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.846770" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:12.846890" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:12.831026" elapsed="0.015890"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.848469" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.848211" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:12.848630" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:12.847864" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.849001" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.848760" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.849559" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.849251" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.849083" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.848740" elapsed="0.000902"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.851989" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:12.849786" elapsed="0.002230"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:12.852068" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:12.852224" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:12.847322" elapsed="0.004927"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.853445" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.853207" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:12.853620" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:12.852877" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:12.853854" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:12.853716" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.853697" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.854078" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.854242" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.854307" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:12.856568" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:12.852562" elapsed="0.004068"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.859804" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.859206" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.860419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.860166" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:12.867538" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:12.867683" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:12.867808" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:12.862743" elapsed="0.005093"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.860549" elapsed="0.007331"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.868094" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.867907" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.860530" elapsed="0.007710"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.873398" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.869724" elapsed="0.003760"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.869392" elapsed="0.004144"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.869365" elapsed="0.004207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.877110" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.873957" elapsed="0.003245"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.873652" elapsed="0.003586"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.873628" elapsed="0.003636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.877872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:12.877432" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.878241" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.877999" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.878809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.878501" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.878327" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.877974" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.879451" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:12.879049" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.879797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.879568" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.880493" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.880031" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.879879" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.879548" elapsed="0.001030"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:12.880722" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:12.881543" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:12.881226" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:12.881715" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:12.868783" elapsed="0.015332"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.884297" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:12.884188" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.884169" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:12.887200" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:12.884523" elapsed="0.002752"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:12.887331" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:12.887518" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:12.857308" elapsed="0.030236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:12.887608" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:12.887960" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:12.807791" elapsed="0.080207"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.904954" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.904565" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.905865" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.905593" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:12.906042" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:12.905238" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.906653" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:12.906230" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:12.906989" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:12.907380" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:12.906842" elapsed="0.000568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.907835" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:12.907585" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:12.908256" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.907958" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.908798" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:12.908502" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.908344" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.907934" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.909474" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:12.909024" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:12.909557" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:12.903897" elapsed="0.005796"/>
</kw>
<msg time="2026-05-01T00:59:12.909748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:12.902968" elapsed="0.006832"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.910326" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.910852" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.911375" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.911605" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.911824" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.912210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.912070" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:12.912055" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.912423" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.912605" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.912764" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:12.912024" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.911915" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.912985" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.913072" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:59:12.913213" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:12.900207" elapsed="0.013034"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:12.913444" elapsed="0.002354"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:12.916833" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:12.916528" elapsed="0.000333"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:12.917279" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:12.917006" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:12.917469" elapsed="0.000329"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:12.916110" elapsed="0.001749"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.915879" elapsed="0.002012"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:12.918056" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:12.917916" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.915860" elapsed="0.002273"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:12.889341" elapsed="0.028839"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:12.888537" elapsed="0.029716"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:12.888131" elapsed="0.030227"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.888098" elapsed="0.030312"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:12.918502" elapsed="0.000081"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:12.799611" elapsed="0.119184"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:12.783804" elapsed="0.135157"/>
</kw>
<msg time="2026-05-01T00:59:12.919053" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:12.919099" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:12.782776" elapsed="0.136369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:12.919394" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:12.919227" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:12.919208" elapsed="0.000292"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.919995" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:12.919655" elapsed="0.000374"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:12.920512" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.920183" elapsed="0.000393">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:12.781793" elapsed="0.138899">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.975843" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:13.975426" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:13.976704" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:13.976398" elapsed="0.000383">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:13.976879" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:13.976056" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.977491" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:13.977079" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:13.977860" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:13.978080" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:13.977714" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.978532" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:13.978265" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.979564" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:13.979287" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.980033" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:13.979761" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.980391" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.980619" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.980788" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:13.980260" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:13.980114" elapsed="0.000765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:13.980928" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:13.981180" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:13.978964" elapsed="0.002242"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:13.978658" elapsed="0.002581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.981409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:13.981266" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:13.978634" elapsed="0.002887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.982218" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:13.981721" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:13.982328" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:13.974797" elapsed="0.007718"/>
</kw>
<msg time="2026-05-01T00:59:13.982582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:13.973873" elapsed="0.008773"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.983165" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.983944" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.984447" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.984652" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.984821" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.985195" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:13.985055" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:13.985038" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.985406" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.985624" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.985789" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:13.985004" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:13.984896" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.986010" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:13.986145" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:59:13.986302" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:13.969448" elapsed="0.016892"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:13.987727" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:13.987433" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:13.987899" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:13.987082" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.988241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:13.987998" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.988809" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:13.988513" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:13.988323" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:13.987979" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.991372" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:13.989035" elapsed="0.002365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:13.991470" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:13.991633" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:13.986747" elapsed="0.004911"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:13.993074" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:13.992780" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:13.993236" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:13.992353" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:13.993491" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:59:13.993335" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:13.993315" elapsed="0.000302"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.993761" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:13.993929" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:13.993996" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:13.996202" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:13.991967" elapsed="0.004270"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.997791" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:13.997483" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:13.998233" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:13.997987" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:14.006793" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:14.007047" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:14.007195" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:14.001034" elapsed="0.006200"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:13.998346" elapsed="0.008954"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.007585" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.007342" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:13.998327" elapsed="0.009392"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.012791" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:14.009213" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.008893" elapsed="0.004019"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.008865" elapsed="0.004086"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.016722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:14.013358" elapsed="0.003431"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.013037" elapsed="0.003804"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.013011" elapsed="0.003868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.017764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:14.017129" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.018282" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.017908" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.019099" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:14.018660" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.018407" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.017880" elapsed="0.001342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.019970" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:14.019441" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.020429" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.020109" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.021236" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:14.020802" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.020569" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.020082" elapsed="0.001283"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:14.021607" elapsed="0.000537"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:14.022850" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:14.022380" elapsed="0.000512"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:14.023115" elapsed="0.005472"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:14.008255" elapsed="0.020433"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:14.028956" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:14.028797" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.028767" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:14.033139" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:14.029281" elapsed="0.003901"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:14.033258" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:59:14.033520" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:13.996573" elapsed="0.037053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:14.033895" elapsed="0.000080"/>
</return>
<msg time="2026-05-01T00:59:14.034749" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:13.945674" elapsed="0.089188"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.056566" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:14.056131" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:14.057411" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:14.057138" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:14.057612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:14.056795" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.058291" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:14.057856" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:14.058641" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:14.058829" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:14.058494" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.059336" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:14.059055" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:14.059807" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.059497" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.060335" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:14.060038" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.059898" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.059472" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.061070" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:14.060601" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:14.061160" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:14.055515" elapsed="0.005785"/>
</kw>
<msg time="2026-05-01T00:59:14.061356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:14.054594" elapsed="0.006816"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.062025" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.062560" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.063305" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.063509" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.063694" elapsed="0.000029"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.064091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.063950" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:14.063934" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.064312" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.064495" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.064660" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:14.063902" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:14.063789" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.064918" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:14.064998" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:14.065120" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:14.051752" elapsed="0.013395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:14.065315" elapsed="0.002367"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:14.068816" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:14.068489" elapsed="0.000357"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:14.069289" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:14.068994" elapsed="0.000390"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:14.069561" elapsed="0.000380"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:14.068047" elapsed="0.001959"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.067778" elapsed="0.002263"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:14.070211" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:14.070068" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.067753" elapsed="0.002543"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:14.038155" elapsed="0.032206"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:14.036130" elapsed="0.034310"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:14.035187" elapsed="0.035346"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.035108" elapsed="0.035477"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:14.070654" elapsed="0.000083"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:13.937005" elapsed="0.133956"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:13.923121" elapsed="0.148012"/>
</kw>
<msg time="2026-05-01T00:59:14.071224" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:14.071270" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:13.922438" elapsed="0.148857"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:14.071525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:14.071373" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:14.071351" elapsed="0.000244"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.072048" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:14.071734" elapsed="0.000341"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:14.072560" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:14.072222" elapsed="0.000403">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:13.921627" elapsed="0.151129">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.142356" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.141959" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.143176" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.142906" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:15.143344" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:15.142574" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.143953" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:15.143543" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.144287" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:15.144450" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:15.144140" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.144892" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.144644" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.145982" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.145725" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.146465" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:15.146181" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.146822" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.147026" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.147195" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:15.146692" elapsed="0.000561"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.146547" elapsed="0.000738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:15.147332" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:15.147519" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:15.145387" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.145087" elapsed="0.002492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.147789" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.147605" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.145063" elapsed="0.002810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.148472" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:15.148010" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:15.148549" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:15.141333" elapsed="0.007344"/>
</kw>
<msg time="2026-05-01T00:59:15.148731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:15.140492" elapsed="0.008291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.149270" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.149786" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.150488" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.150672" elapsed="0.000085"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.150909" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.151265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.151129" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:15.151114" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.151492" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.151656" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.151851" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:15.151084" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.150982" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.152074" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.152151" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:15.152270" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:15.136157" elapsed="0.016138"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.153539" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.153283" elapsed="0.000321">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:15.153696" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:15.152948" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.154031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.153793" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.154600" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.154288" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.154112" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.153774" elapsed="0.000908"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.157086" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:15.154825" elapsed="0.002287"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:15.157165" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:15.157322" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:15.152630" elapsed="0.004716"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.158562" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.158309" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:15.158719" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:15.157980" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:15.158953" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:15.158815" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.158796" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.159177" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.159382" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.159464" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:15.161395" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:15.157665" elapsed="0.003757"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.162820" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.162570" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.163254" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.163014" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:15.170918" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:15.171052" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:15.171149" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:15.165642" elapsed="0.005533"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.163367" elapsed="0.007852"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.171394" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.171246" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.163348" elapsed="0.008151"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.176401" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.172777" elapsed="0.003715"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.172432" elapsed="0.004115"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.172404" elapsed="0.004216"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.180439" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.177026" elapsed="0.003475"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.176706" elapsed="0.003832"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.176680" elapsed="0.003883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.181125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:15.180722" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.181466" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.181223" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.182006" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.181706" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.181552" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.181205" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.182619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:15.182239" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.182942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.182716" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.183490" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.183180" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.183024" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.182698" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:15.183716" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:15.184622" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:15.184300" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:15.184798" elapsed="0.002326"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:15.171911" elapsed="0.015276"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.187365" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:15.187258" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.187239" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:15.190308" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:15.187594" elapsed="0.002780"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:15.190430" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:59:15.190611" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:15.161748" elapsed="0.028890"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:15.190701" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:15.191050" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:15.104863" elapsed="0.086225"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.208091" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.207484" elapsed="0.000675"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.208956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.208717" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:15.209121" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:15.208342" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.209701" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:15.209302" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:15.210018" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:15.210167" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:15.209882" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.210605" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:15.210343" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:15.211008" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.210719" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.211537" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:15.211232" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.211093" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.210699" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.212276" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:15.211812" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:15.212355" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:15.206866" elapsed="0.005635"/>
</kw>
<msg time="2026-05-01T00:59:15.212557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:15.206059" elapsed="0.006551"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.213097" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.213618" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.214117" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.214427" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.214610" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.214974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.214839" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:15.214824" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.215185" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.215344" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.215517" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:15.214794" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.214688" elapsed="0.000910"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.215735" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.215812" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:15.215945" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:15.203347" elapsed="0.012658"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:15.216179" elapsed="0.002383"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:15.219593" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:15.219284" elapsed="0.000338"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:15.220130" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:15.219769" elapsed="0.000390"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:15.220309" elapsed="0.000348"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:15.218879" elapsed="0.001840"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.218645" elapsed="0.002108"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:15.220921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:15.220779" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.218626" elapsed="0.002372"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:15.192492" elapsed="0.028555"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:15.191627" elapsed="0.029495"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:15.191222" elapsed="0.029968"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.191187" elapsed="0.030048"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:15.221299" elapsed="0.000079"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:15.092372" elapsed="0.129245"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:15.074893" elapsed="0.146893"/>
</kw>
<msg time="2026-05-01T00:59:15.221879" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:15.221924" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:15.074234" elapsed="0.147713"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:15.222132" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:15.222021" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:15.222003" elapsed="0.000197"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.222777" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:15.222443" elapsed="0.000360"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:15.223246" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.222947" elapsed="0.000358">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:15.073551" elapsed="0.149870">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.281335" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.280936" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.282380" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.282091" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:16.282584" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:16.281749" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.283159" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:16.282769" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.283622" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:16.283787" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:16.283475" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.284214" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.283963" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.285255" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.284992" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.285769" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:16.285467" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.286134" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.286336" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.286520" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:16.286004" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.285853" elapsed="0.000761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:16.286663" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:16.286839" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:16.284672" elapsed="0.002193"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.284342" elapsed="0.002555"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.287065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.286924" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.284316" elapsed="0.002825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.287749" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:16.287278" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:16.287825" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:16.280300" elapsed="0.007652"/>
</kw>
<msg time="2026-05-01T00:59:16.288008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:16.279309" elapsed="0.008752"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.288571" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.289123" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.289634" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.289828" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.289995" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.290360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.290222" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:16.290207" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.290591" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.290753" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.290911" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:16.290173" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.290069" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.291127" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.291203" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:16.291325" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:16.274717" elapsed="0.016633"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.292836" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.292575" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:16.293020" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:16.292210" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.293362" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.293119" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.293989" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.293662" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.293443" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.293099" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.296481" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:16.294220" elapsed="0.002289"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:16.296609" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:16.296775" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:16.291687" elapsed="0.005113"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.298135" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.297877" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:16.298296" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:16.297421" elapsed="0.000900"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:16.298548" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:16.298393" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.298374" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.298774" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.298939" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.299006" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:16.300908" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:16.297102" elapsed="0.003833"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.302437" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.302158" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.302899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.302656" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:16.310185" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:16.310340" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:16.310475" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:16.305167" elapsed="0.005338"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.303016" elapsed="0.007539"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.310768" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.310587" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.302994" elapsed="0.007862"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.315078" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.311978" elapsed="0.003174"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.311753" elapsed="0.003452"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.311732" elapsed="0.003511"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.319218" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.315679" elapsed="0.003609"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.315329" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.315303" elapsed="0.004077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.320268" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:16.319666" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.320790" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.320418" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.321614" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.321147" elapsed="0.000641"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.320915" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.320389" elapsed="0.001491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.322558" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:16.322112" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.322886" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.322657" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.323423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.323125" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.322968" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.322638" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:16.323685" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:16.324529" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:16.324198" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:16.324708" elapsed="0.002439"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:16.311272" elapsed="0.015946"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.327409" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:16.327294" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.327274" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:16.330414" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:16.327644" elapsed="0.002800"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:16.330513" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:16.330689" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:16.301254" elapsed="0.029462"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:16.330782" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:16.331146" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:16.251416" elapsed="0.079768"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.347822" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.347428" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.348616" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.348337" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:16.348790" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:16.348012" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.349574" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:16.348973" elapsed="0.000630"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:16.349987" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:16.350149" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:16.349842" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.350589" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:16.350325" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:16.350998" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.350707" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.351529" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:16.351222" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.351084" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.350685" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.352185" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:16.351751" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:16.352263" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:16.346826" elapsed="0.005568"/>
</kw>
<msg time="2026-05-01T00:59:16.352448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:16.345981" elapsed="0.006535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.352997" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.353509" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.354034" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.354216" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.354385" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.354813" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.354673" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:16.354658" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.355025" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.355186" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.355345" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:16.354627" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.354513" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.355584" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.355662" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:16.355780" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:16.343298" elapsed="0.012510"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:16.355974" elapsed="0.002226"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:16.359222" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:16.358926" elapsed="0.000324"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:16.359689" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:16.359395" elapsed="0.000321"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:16.359861" elapsed="0.000323"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:16.358527" elapsed="0.001716"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.358282" elapsed="0.001996"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:16.360443" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:16.360303" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.358262" elapsed="0.002274"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:16.332589" elapsed="0.027996"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:16.331740" elapsed="0.028918"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:16.331316" elapsed="0.029409"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.331283" elapsed="0.029490"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:16.360838" elapsed="0.000078"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:16.242715" elapsed="0.118411"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:16.226557" elapsed="0.134736"/>
</kw>
<msg time="2026-05-01T00:59:16.361383" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:16.361429" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:16.225527" elapsed="0.135943"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:16.361691" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:16.361579" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:16.361560" elapsed="0.000199"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.362231" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:16.361924" elapsed="0.000333"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:16.362717" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.362402" elapsed="0.000376">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:16.224428" elapsed="0.138463">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.417921" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.417523" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.418747" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.418471" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:17.418924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:17.418126" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.419545" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:17.419106" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.419872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:17.420036" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:17.419728" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.420617" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.420211" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.421628" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.421353" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.422091" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:17.421824" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.422443" elapsed="0.000038"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.422659" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.422826" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:17.422315" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.422171" elapsed="0.000742"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:17.422961" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:17.423129" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:17.421041" elapsed="0.002112"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.420742" elapsed="0.002442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.423348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.423210" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.420717" elapsed="0.002723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.424037" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:17.423592" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:17.424165" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:17.416902" elapsed="0.007393"/>
</kw>
<msg time="2026-05-01T00:59:17.424349" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:17.416060" elapsed="0.008340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.426422" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.426950" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.427497" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.427681" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.427847" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.428212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.428074" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:17.428058" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.428428" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.428607" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.428767" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:17.428027" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.427923" elapsed="0.000925"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.428987" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.429065" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:17.429188" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:17.411838" elapsed="0.017376"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.430503" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.430237" elapsed="0.000335">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:17.430666" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:17.429901" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.431003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.430763" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.431574" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.431251" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.431086" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.430744" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.434004" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:17.431802" elapsed="0.002229"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:17.434083" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:17.434239" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:17.429580" elapsed="0.004683"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.435509" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.435230" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:17.435684" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:17.434897" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:17.435923" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:17.435784" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.435765" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.436151" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.436316" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.436385" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:17.438471" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:17.434579" elapsed="0.003921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.439890" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.439641" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.440332" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.440083" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:17.447699" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:17.447835" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:17.447943" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:17.442528" elapsed="0.005441"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.440444" elapsed="0.007568"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.448185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.448038" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.440425" elapsed="0.007888"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.451765" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.449336" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.449119" elapsed="0.002730"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.449101" elapsed="0.002774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.455393" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.452149" elapsed="0.003347"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.451932" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.451914" elapsed="0.003669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.456342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:17.455804" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.456823" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.456502" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.457602" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.457155" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.456940" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.456474" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.458442" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:17.457933" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.458919" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.458601" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.459733" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.459256" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.459036" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.458575" elapsed="0.001277"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:17.460052" elapsed="0.000415"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:17.460919" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:17.460626" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:17.461092" elapsed="0.002326"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:17.448691" elapsed="0.014818"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.463690" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:17.463582" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.463563" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:17.466555" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:17.463897" elapsed="0.002688"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:17.466640" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:17.466801" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:17.438807" elapsed="0.028021"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:17.466892" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:17.467238" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:17.388735" elapsed="0.078541"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.484370" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.483981" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.485164" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.484906" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:17.485336" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:17.484580" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.485922" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:17.485536" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:17.486246" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:17.486404" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:17.486105" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.486856" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:17.486606" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:17.487268" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.486976" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.487817" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:17.487524" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.487354" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.486954" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.488487" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:17.488039" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:17.488569" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:17.483335" elapsed="0.005368"/>
</kw>
<msg time="2026-05-01T00:59:17.488757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:17.482495" elapsed="0.006315"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.489306" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.489829" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.490393" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.490591" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.490758" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.491137" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.490999" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:17.490984" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.491350" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.491549" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.491713" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:17.490952" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.490839" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.491934" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.492011" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:17.492128" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:17.479787" elapsed="0.012368"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:17.492323" elapsed="0.002443"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:17.495999" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:17.495691" elapsed="0.000336"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:17.496464" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:17.496175" elapsed="0.000319"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:17.496691" elapsed="0.000363"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:17.495241" elapsed="0.001876"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.494848" elapsed="0.002304"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:17.497322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:17.497178" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.494829" elapsed="0.002607"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:17.468699" elapsed="0.028810"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:17.467878" elapsed="0.029709"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:17.467448" elapsed="0.030215"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.467414" elapsed="0.030300"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:17.497782" elapsed="0.000102"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:17.380336" elapsed="0.117768"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:17.365845" elapsed="0.132428"/>
</kw>
<msg time="2026-05-01T00:59:17.498365" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:17.498409" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:17.364912" elapsed="0.133520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:17.498643" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:17.498531" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:17.498511" elapsed="0.000199"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.499180" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:17.498847" elapsed="0.000359"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:17.499719" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.499353" elapsed="0.000430">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:17.363943" elapsed="0.135955">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.556464" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.556006" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.557347" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.557058" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.557537" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.556675" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.558113" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.557722" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.558494" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.558666" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.558332" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.559089" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.558842" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.560216" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.559953" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.560708" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.560413" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.561110" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.561420" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.561612" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.560947" elapsed="0.000725"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.560790" elapsed="0.000915"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:18.561754" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:59:18.561936" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:18.559605" elapsed="0.002358"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.559220" elapsed="0.002776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.562169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.562025" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.559192" elapsed="0.003056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.562899" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.562390" elapsed="0.000537"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.562978" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.555352" elapsed="0.007757"/>
</kw>
<msg time="2026-05-01T00:59:18.563169" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.554393" elapsed="0.008838"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.563781" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.564286" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.564803" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.564986" elapsed="0.000062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.565200" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.565599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.565442" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.565426" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.565813" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.566043" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.566205" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.565393" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.565285" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.566427" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.566526" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:59:18.566664" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.549916" elapsed="0.016775"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.568308" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.568015" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.568498" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.567633" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.568860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.568602" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.569433" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.569131" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.568942" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.568582" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.571937" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.569680" elapsed="0.002286"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:18.572025" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:18.572198" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:18.567020" elapsed="0.005205"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.573621" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.573322" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.573791" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.572927" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:18.574131" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:59:18.573944" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.573914" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.574422" elapsed="0.000027"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.574653" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.574735" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:18.577111" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:18.572579" elapsed="0.004560"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.579004" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.578712" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.579464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.579205" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:18.586985" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:18.587125" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:18.587275" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:18.581875" elapsed="0.005432"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.579588" elapsed="0.007767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.587565" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.587385" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.579565" elapsed="0.008090"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.592568" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.588774" elapsed="0.003866"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.588538" elapsed="0.004154"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.588518" elapsed="0.004212"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.596641" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.593162" elapsed="0.003546"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.592813" elapsed="0.003948"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.592787" elapsed="0.004011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.597747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.597191" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.598101" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.597856" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.598661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.598342" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.598186" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.597837" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.599264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.598895" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.599600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.599361" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.600126" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.599834" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.599683" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.599343" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.600357" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:18.601189" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.600879" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.601361" elapsed="0.002462"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:18.588056" elapsed="0.015832"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.604150" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:18.604038" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.604017" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.607041" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.604361" elapsed="0.002708"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:18.607122" elapsed="0.000044"/>
</return>
<msg time="2026-05-01T00:59:18.607300" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:18.577726" elapsed="0.029600"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.607390" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:18.607770" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:18.526476" elapsed="0.081333"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.625028" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.624644" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.625845" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.625581" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.626015" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.625235" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.626605" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.626198" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.626925" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.627297" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.626786" elapsed="0.000539"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.627745" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.627492" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:18.628164" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.627867" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.628705" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.628394" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.628250" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.627845" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.629417" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.628931" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.629520" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.624012" elapsed="0.005647"/>
</kw>
<msg time="2026-05-01T00:59:18.629773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.622849" elapsed="0.006978"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.630317" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.630838" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.631340" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.631534" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.631703" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.632073" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.631936" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.631920" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.632287" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.632448" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.632623" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.631889" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.631783" elapsed="0.000922"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.632844" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.632920" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.633038" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.620065" elapsed="0.013000"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.633287" elapsed="0.002214"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.636537" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.636217" elapsed="0.000348"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.637012" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.636709" elapsed="0.000332"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:18.637224" elapsed="0.000342"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:18.635815" elapsed="0.001812"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.635583" elapsed="0.002078"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.637827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.637686" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.635564" elapsed="0.002340"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:18.609167" elapsed="0.028785"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:18.608324" elapsed="0.029702"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.607945" elapsed="0.030158"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.607911" elapsed="0.030246"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.638223" elapsed="0.000081"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:18.517775" elapsed="0.120768"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:18.502751" elapsed="0.135961"/>
</kw>
<msg time="2026-05-01T00:59:18.638803" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:18.638848" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:18.501855" elapsed="0.137016"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.639055" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:18.638943" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.638925" elapsed="0.000197"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.639580" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.639257" elapsed="0.000349"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.640044" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.639749" elapsed="0.000356">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.500877" elapsed="0.139339">None</status>
</kw>
<msg time="2026-05-01T00:59:18.640307" level="FAIL">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.236000" elapsed="10.404412">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:59:18.640481" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.235640" elapsed="10.404891"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some Keywords need several tries to finally fail, this keyword passes if and only if the failure ultimately happens.</doc>
<status status="FAIL" start="2026-05-01T00:59:08.235299" elapsed="10.405332">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:59:18.640741" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:59:18.640784" level="INFO">${output} = Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:08.234709" elapsed="10.406099"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:59:18.640991" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T00:59:18.640882" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.640863" elapsed="0.000261"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.641270" elapsed="0.000022"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.641432" elapsed="0.000035"/>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T00:59:08.234311" elapsed="10.407257"/>
</kw>
<msg time="2026-05-01T00:59:18.641618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:08.233868" elapsed="10.407797"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some positive checks report false success for a short time. This keyword verifies no failure does happen within timeout period.
This implementation needs more complicated logic than, Verify_Keyword_Never_Passes_Within_Timeout,
so use that keyword in case you have a negative check handy.</doc>
<status status="PASS" start="2026-05-01T00:59:08.233495" elapsed="10.408248"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:18.642312" elapsed="0.000468"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:18.642014" elapsed="0.000834"/>
</kw>
<doc>Try to catch a glimpse of pcc-mock in pcep-topology. Pass if no change from Precondition is detected over 10 seconds.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:59:08.232099" elapsed="10.410790"/>
</test>
<test id="s1-s21-t4" name="Set_Wrong_Password" line="70">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.644360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.644150" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.644133" elapsed="0.000309"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:18.643959" elapsed="0.000555"/>
</kw>
<kw name="Replace_Password_On_Pcep_Node">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.645480" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | PASSWD=changeme }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>PASSWD=${password}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.644966" elapsed="0.000544"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.666691" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.666303" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.667468" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.667194" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.667628" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.666873" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.668193" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.667811" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.668528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.668683" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.668375" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.669098" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.668857" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.670115" level="INFO">mapping: {'IP': '10.30.170.157', 'PASSWD': 'changeme'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.669862" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.670745" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.670310" elapsed="0.000462"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.671480" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.671125" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:18.672447" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.672002" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:18.672549" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:18.672708" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:18.671691" elapsed="0.001042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.672881" elapsed="0.000242"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:18.670997" elapsed="0.002181"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.673737" level="INFO">${value} = changeme</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.673421" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:18.674701" level="INFO">${encoded} = changeme</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.674250" elapsed="0.000478"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:18.674778" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:18.674931" level="INFO">${encoded_value} = changeme</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:18.673942" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.675099" elapsed="0.000222"/>
</kw>
<var name="${key}">PASSWD</var>
<var name="${value}">changeme</var>
<status status="PASS" start="2026-05-01T00:59:18.673294" elapsed="0.002067"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:18.670824" elapsed="0.004573"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:18.675440" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:59:18.675615" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'changeme'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:18.669547" elapsed="0.006093"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.669246" elapsed="0.006427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.675839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.675698" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.669227" elapsed="0.006688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.676628" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.676051" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.676704" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.665709" elapsed="0.011122"/>
</kw>
<msg time="2026-05-01T00:59:18.676884" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.664917" elapsed="0.012015"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.677440" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.677979" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.678528" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.678709" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.678873" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.679224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.679088" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.679073" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.679438" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.679616" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.679775" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.679044" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.678945" elapsed="0.000909"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.679991" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.680067" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.680183" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.660697" elapsed="0.019512"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.694808" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.694417" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.695535" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.695312" elapsed="0.000286">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.695691" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.694988" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.696245" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.695870" elapsed="0.000402"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.696574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.696704" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.696424" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.697120" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.696880" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:18.697585" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.697288" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.698095" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'changeme'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.697804" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.697668" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.697269" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.698883" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;changem...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.698319" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.698963" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.693824" elapsed="0.005264"/>
</kw>
<msg time="2026-05-01T00:59:18.699142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.693016" elapsed="0.006174"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.699688" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.700185" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.700695" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.700872" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.701036" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.701424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.701288" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.701272" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.701651" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.701807" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.701962" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.701238" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.701110" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.702210" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.702286" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.702405" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;changem...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.690390" elapsed="0.012044"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.703746" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.703418" elapsed="0.000392">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.703903" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.703085" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.704233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.703999" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.704985" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.704689" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.704514" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.703981" elapsed="0.001088"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.707422" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.705237" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:18.707516" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:18.707672" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:18.702773" elapsed="0.004923"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.709046" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.708802" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.709516" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;changeme&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.709260" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.709946" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.709706" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.710366" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.710129" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:18.711199" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:59:18.711010" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:59:18.711557" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:59:18.711369" elapsed="0.000214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.711724" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.712315" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.712071" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:59:18.712401" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:18.712574" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:59:18.710616" elapsed="0.002018"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:18.727669" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '242', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;changeme&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-05-01T00:59:18.727754" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node01wa4zqh2fkawd1hp4tf4uaepnl31.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 30-Apr-2026 00:59:18 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:18.727897" level="INFO">${response} = &lt;Response [201]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:18.714833" elapsed="0.013100"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.712708" elapsed="0.015292"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.728273" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.728041" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.712690" elapsed="0.015706"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.737667" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.729841" elapsed="0.007926"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.729532" elapsed="0.008314"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.729503" elapsed="0.008401"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.740719" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.738387" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.738031" elapsed="0.002768"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.737992" elapsed="0.002832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.741399" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.740993" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.741809" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.741514" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.742448" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.742099" elapsed="0.000402"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.741911" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.741494" elapsed="0.001077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.743092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.742728" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.743414" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.743190" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.743960" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.743665" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.743512" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.743172" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.744184" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:18.744997" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.744703" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.745169" elapsed="0.002366"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:18.728939" elapsed="0.018664"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:18.747839" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T00:59:18.747726" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.747652" elapsed="0.000285"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.748078" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.748146" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.750416" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:18.708017" elapsed="0.042425"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.750523" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:18.750678" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:18.649998" elapsed="0.100704"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.751032" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.750799" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.750782" elapsed="0.000341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.751157" elapsed="0.000025"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}pcep_topology_node</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:59:18.645760" elapsed="0.105520"/>
</kw>
<arg>password=changeme</arg>
<doc>Send restconf PUT to replace the config module specifying PCEP password element.</doc>
<status status="PASS" start="2026-05-01T00:59:18.644664" elapsed="0.106676"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:18.751909" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:18.751613" elapsed="0.000599"/>
</kw>
<doc>Configure password in pcep dispatcher for client with Mininet IP address.
This password does not match what pcc-mock uses.</doc>
<status status="PASS" start="2026-05-01T00:59:18.643283" elapsed="0.108968"/>
</test>
<test id="s1-s21-t5" name="Topology_Unauthorized_2" line="75">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.753640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.753409" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.753392" elapsed="0.000329"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:18.753187" elapsed="0.000581"/>
</kw>
<kw name="Verify_Keyword_Does_Not_Fail_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Confirm_Keyword_Fails_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.805606" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.805193" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.806390" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.806118" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.806576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.805792" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.807144" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.806757" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.807543" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.807706" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.807326" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.808129" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.807883" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.809120" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.808866" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.809629" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.809316" elapsed="0.000340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.809983" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.810182" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.810349" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.809855" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.809710" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:18.810498" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:18.810664" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:18.808552" elapsed="0.002138"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.808245" elapsed="0.002477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.810888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.810748" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.808225" elapsed="0.002740"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.811708" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.811100" elapsed="0.000637"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.811787" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.804587" elapsed="0.007328"/>
</kw>
<msg time="2026-05-01T00:59:18.811969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.803778" elapsed="0.008242"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.812529" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.813139" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.813693" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.813915" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.814086" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.814442" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.814306" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.814291" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.814671" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.814833" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.814992" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.814262" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.814161" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.815210" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.815288" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:18.815406" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.799521" elapsed="0.015910"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.816662" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.816408" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.816818" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.816079" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.817150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.816914" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.817733" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.817427" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.817232" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.816895" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.820142" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.817956" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:18.820220" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:18.820375" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:18.815764" elapsed="0.004636"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.821634" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.821368" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.821790" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.821025" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:18.822023" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:18.821887" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.821867" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.822282" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.822448" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.822532" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.824612" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:18.820711" elapsed="0.003928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.826042" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.825792" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.826491" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.826233" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:18.833240" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:18.833411" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:18.833528" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:18.828653" elapsed="0.004902"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.826604" elapsed="0.006995"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.833772" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.833625" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.826585" elapsed="0.007274"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.838654" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.835108" elapsed="0.003613"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.834811" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.834784" elapsed="0.004022"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.842413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.839186" elapsed="0.003287"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.838885" elapsed="0.003623"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.838861" elapsed="0.003672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.843071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.842688" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.843396" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.843170" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.843953" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.843653" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.843495" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.843151" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.844560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.844185" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.844881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.844658" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.845423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.845112" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.844961" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.844639" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.845668" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:18.846525" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.846209" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:18.846699" elapsed="0.002435"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:18.834210" elapsed="0.014987"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.849409" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:18.849268" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.849248" elapsed="0.000250"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.852274" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.849639" elapsed="0.002663"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:18.852355" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:18.852529" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:18.824942" elapsed="0.027615"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.852620" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:18.852965" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:18.776843" elapsed="0.076160"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.869327" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.868959" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.870091" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.869859" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:18.870250" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:18.869537" elapsed="0.000737"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.870824" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:18.870428" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:18.871139" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:18.871279" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:18.871003" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.871710" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:18.871468" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:18.872102" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.871822" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.872629" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:18.872326" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.872186" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.871803" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.873314" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:18.872888" elapsed="0.000455"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.873391" elapsed="0.000072"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:18.868347" elapsed="0.005218"/>
</kw>
<msg time="2026-05-01T00:59:18.873619" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.867583" elapsed="0.006087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.874154" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.874853" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.875362" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.875555" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.875724" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.876090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.875954" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:18.875939" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.876303" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.876476" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.876636" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:18.875908" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.875801" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.876905" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.876984" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:18.877137" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:18.864937" elapsed="0.012228"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.877337" elapsed="0.002330"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.880681" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.880383" elapsed="0.000326"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:18.881125" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.880854" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:18.881300" elapsed="0.000367"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:18.879980" elapsed="0.001746"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.879749" elapsed="0.002011"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:18.881926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:18.881786" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.879730" elapsed="0.002273"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:18.854346" elapsed="0.027704"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:18.853553" elapsed="0.028572"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:18.853134" elapsed="0.029051"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.853101" elapsed="0.029127"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:18.882291" elapsed="0.000080"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:18.768619" elapsed="0.113987"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:18.757667" elapsed="0.125105"/>
</kw>
<msg time="2026-05-01T00:59:18.882862" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:18.882906" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:18.757102" elapsed="0.125827"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:18.883109" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:18.883001" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:18.882982" elapsed="0.000193"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.883628" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.883309" elapsed="0.000345"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:18.884090" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.883797" elapsed="0.000352">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.756780" elapsed="0.127478">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.939365" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:19.938968" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:19.940273" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:19.939999" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:19.940466" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:19.939659" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.941050" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:19.940654" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:19.941382" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:19.941559" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:19.941234" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.941989" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.941738" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.943092" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.942816" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.943582" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:19.943292" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.943937" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.944138" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.944304" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:19.943808" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:19.943661" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:19.944441" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:59:19.944632" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:19.942413" elapsed="0.002245"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.942113" elapsed="0.002577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.944854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.944715" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.942088" elapsed="0.002843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.945529" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:19.945067" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:19.945606" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:19.938315" elapsed="0.007415"/>
</kw>
<msg time="2026-05-01T00:59:19.945785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:19.937487" elapsed="0.008349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.946322" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.946938" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.947646" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.947831" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.947999" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.948360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.948222" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:19.948208" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.948589" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.948748" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.948907" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:19.948178" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:19.948074" elapsed="0.000912"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.949123" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:19.949200" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:19.949320" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:19.933163" elapsed="0.016182"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:19.950599" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:19.950330" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:19.950793" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:19.949997" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.951132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.950891" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.951694" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:19.951382" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.951213" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.950872" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.954110" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:19.951920" elapsed="0.002217"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:19.954226" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:19.954390" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:19.949677" elapsed="0.004739"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:19.955652" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:19.955396" elapsed="0.000320">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:19.955810" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:19.955066" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:19.956045" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:19.955908" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.955889" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.956267" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.956436" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:19.956520" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:19.958409" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:19.954734" elapsed="0.003702"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.959858" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.959608" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.960287" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.960047" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:19.967415" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:19.967572" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:19.967669" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:19.962620" elapsed="0.005075"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.960398" elapsed="0.007340"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.967911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.967765" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.960379" elapsed="0.007619"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.971445" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.969054" elapsed="0.002454"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.968838" elapsed="0.002705"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.968818" elapsed="0.002751"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.974143" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:19.971840" elapsed="0.002348"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.971625" elapsed="0.002598"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.971608" elapsed="0.002640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.974834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:19.974403" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.975164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.974935" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.975721" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:19.975402" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.975247" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.974916" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.976361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:19.975995" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:19.976862" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:19.976637" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:19.977389" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:19.977093" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.976943" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.976618" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:19.977637" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:19.978443" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:19.978140" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:19.978635" elapsed="0.002336"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:19.968347" elapsed="0.012688"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:19.981213" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:19.981106" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.981086" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:19.984118" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:19.981426" elapsed="0.002721"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:19.984199" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:19.984358" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:19.958759" elapsed="0.025625"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:19.984447" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:59:19.984830" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:19.910290" elapsed="0.074579"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.001434" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:20.001064" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:20.002183" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:20.001957" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:20.002345" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:20.001633" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.002937" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:20.002541" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:20.003293" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:20.003443" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:20.003154" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.003881" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:20.003637" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:20.004278" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:20.003995" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.004808" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:20.004517" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:20.004362" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:20.003975" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.005472" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:20.005029" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:20.005552" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:20.000449" elapsed="0.005230"/>
</kw>
<msg time="2026-05-01T00:59:20.005733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:19.999677" elapsed="0.006108"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.006267" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.006786" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.007310" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.007515" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.007682" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.008076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:20.007940" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:20.007925" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.008287" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.008466" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.008640" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:20.007895" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:20.007789" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.008859" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:20.008935" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:20.009051" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:19.997019" elapsed="0.012059"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:20.009245" elapsed="0.002688"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:20.013014" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:20.012718" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:20.013472" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:20.013186" elapsed="0.000315"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:20.013649" elapsed="0.000332"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:20.012288" elapsed="0.001753"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:20.012031" elapsed="0.002045"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:20.014264" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:20.014101" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:20.012010" elapsed="0.002331"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:19.986196" elapsed="0.028195"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:19.985377" elapsed="0.029103"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:19.985004" elapsed="0.029539"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:19.984971" elapsed="0.029615"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:20.014650" elapsed="0.000079"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:19.902107" elapsed="0.112862"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:19.887386" elapsed="0.127749"/>
</kw>
<msg time="2026-05-01T00:59:20.015224" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:20.015269" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:19.886348" elapsed="0.128944"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:20.015531" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:20.015399" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:20.015379" elapsed="0.000220"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.016043" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:20.015736" elapsed="0.000334"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:20.016540" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:20.016213" elapsed="0.000389">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:19.885310" elapsed="0.131402">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.073154" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.072760" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.073974" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.073696" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:21.074144" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:21.073353" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.074732" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:21.074327" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.075072" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:21.075231" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:21.074912" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.075682" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.075414" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.076697" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.076427" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.077161" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:21.076894" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.077524" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.077725" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.077893" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:21.077381" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.077240" elapsed="0.000742"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:21.078028" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:21.078195" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:21.076110" elapsed="0.002111"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.075804" elapsed="0.002449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.078417" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.078278" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.075781" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.079102" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:21.078648" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:21.079240" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:21.071970" elapsed="0.007405"/>
</kw>
<msg time="2026-05-01T00:59:21.079430" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:21.071106" elapsed="0.008396"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.079995" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.080524" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.081024" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.081202" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.081368" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.081749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.081604" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:21.081589" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.081961" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.082123" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.082281" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:21.081559" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.081442" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.082513" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.082591" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:21.082716" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:21.066843" elapsed="0.015899"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.085630" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.085369" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:21.085790" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:21.085026" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.086128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.085889" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.086696" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.086385" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.086211" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.085870" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.089117" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:21.086935" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:21.089197" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:21.089353" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:21.083123" elapsed="0.006255"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.090606" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.090349" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:21.090777" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:21.090014" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:21.091019" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:21.090876" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.090857" elapsed="0.000250"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.091246" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.091410" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.091494" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:21.093413" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:21.089694" elapsed="0.003746"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.094886" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.094627" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.095323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.095079" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:21.102113" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:21.102245" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:21.102352" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:21.097509" elapsed="0.004870"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.095436" elapsed="0.006986"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.102630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.102448" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.095418" elapsed="0.007339"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.106388" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.103776" elapsed="0.002671"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.103562" elapsed="0.002933"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.103543" elapsed="0.002978"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.109868" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.106808" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.106579" elapsed="0.003405"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.106562" elapsed="0.003457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.110811" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:21.110237" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.111281" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.110960" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.112057" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.111636" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.111398" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.110933" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.112914" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:21.112387" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.113372" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.113052" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.114142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.113729" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.113512" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.113025" elapsed="0.001255"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:21.114506" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:21.115634" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:21.115208" elapsed="0.000463"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:21.115876" elapsed="0.003070"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:21.103112" elapsed="0.015897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.119189" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:21.119082" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.119063" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:21.122067" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:21.119401" elapsed="0.002695"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:21.122152" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:21.122315" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:21.093769" elapsed="0.028575"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:21.122409" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:21.122772" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:21.043502" elapsed="0.079308"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.139359" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.138983" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.140106" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.139886" elapsed="0.000285">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:21.140265" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:21.139560" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.140853" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:21.140467" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:21.141170" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:21.141306" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:21.141034" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.141927" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:21.141496" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:21.142328" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.142046" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.142860" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:21.142568" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.142412" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.142026" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.143531" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:21.143080" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:21.143611" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:21.138362" elapsed="0.005376"/>
</kw>
<msg time="2026-05-01T00:59:21.143792" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:21.137568" elapsed="0.006276"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.144330" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.144848" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.145390" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.145594" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.145767" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.146133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.145995" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:21.145981" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.146347" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.146523" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.146684" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:21.145950" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.145845" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.146902" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.146978" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:21.147095" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:21.134928" elapsed="0.012193"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:21.147287" elapsed="0.002208"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:21.150641" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:21.150326" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:21.151086" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:21.150817" elapsed="0.000296"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:21.151257" elapsed="0.000337"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:21.149808" elapsed="0.001846"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.149577" elapsed="0.002111"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:21.151852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:21.151714" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.149558" elapsed="0.002403"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:21.124186" elapsed="0.027827"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:21.123354" elapsed="0.028734"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:21.122981" elapsed="0.029168"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.122948" elapsed="0.029246"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:21.152259" elapsed="0.000078"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:21.035337" elapsed="0.117231"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:21.019544" elapsed="0.133189"/>
</kw>
<msg time="2026-05-01T00:59:21.152823" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:21.152867" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:21.018633" elapsed="0.134257"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:21.153071" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:21.152962" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:21.152944" elapsed="0.000194"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.153626" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:21.153273" elapsed="0.000379"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:21.154105" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.153808" elapsed="0.000356">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:21.017699" elapsed="0.136581">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.207446" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.207055" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.208280" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.207988" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:22.208472" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:22.207663" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.209044" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:22.208656" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.209367" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:22.209546" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:22.209225" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.209968" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.209723" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.210972" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.210716" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.211439" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:22.211168" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.211804" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.212070" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.212262" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:22.211677" elapsed="0.000644"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.211533" elapsed="0.000819"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:22.212399" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:22.212593" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:22.210383" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.210091" elapsed="0.002559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.212815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.212675" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.210067" elapsed="0.002825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.213492" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:22.213027" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:22.213570" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:22.206440" elapsed="0.007257"/>
</kw>
<msg time="2026-05-01T00:59:22.213752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:22.205616" elapsed="0.008187"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.214295" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.214814" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.215526" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.215711" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.215881" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.216258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.216119" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:22.216104" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.216490" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.216693" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.216855" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:22.216073" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.215957" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.217076" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.217155" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:22.217276" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:22.201354" elapsed="0.015948"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.218556" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.218296" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:22.218714" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:22.217965" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.219046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.218810" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.219601" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.219294" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.219126" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.218791" elapsed="0.000893"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.222018" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:22.219824" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:22.222095" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:22.222250" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:22.217645" elapsed="0.004630"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.223474" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.223221" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:22.223630" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:22.222897" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:22.223859" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:22.223725" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.223706" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.224105" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.224267" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.224332" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:22.226233" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:22.222584" elapsed="0.003675"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.227692" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.227430" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.228131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.227890" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:22.235204" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:22.235338" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:22.235438" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:22.230439" elapsed="0.005045"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.228242" elapsed="0.007287"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.235712" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.235555" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.228223" elapsed="0.007576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.239175" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.236799" elapsed="0.002424"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.236586" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.236567" elapsed="0.002716"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.241885" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.239565" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.239339" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.239322" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.242541" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:22.242143" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.242868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.242640" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.243398" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.243103" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.242951" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.242622" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.244071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:22.243675" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.244389" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.244167" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.245152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.244743" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.244530" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.244149" elapsed="0.001119"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:22.245494" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:22.246629" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:22.246191" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:22.246870" elapsed="0.003238"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:22.236150" elapsed="0.014046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.250514" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:22.250342" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.250314" elapsed="0.000300"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:22.254513" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:22.250807" elapsed="0.003748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:22.254629" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:59:22.254857" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:22.226621" elapsed="0.028273"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:22.254984" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:22.255516" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:22.178400" elapsed="0.077176"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.272962" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.272582" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.273733" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.273489" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:22.273896" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:22.273147" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.274500" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:22.274080" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:22.274827" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:22.274972" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:22.274686" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.275418" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:22.275173" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:22.275841" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.275554" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.276356" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:22.276065" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.275926" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.275535" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.277024" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:22.276598" elapsed="0.000455"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:22.277102" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:22.271794" elapsed="0.005435"/>
</kw>
<msg time="2026-05-01T00:59:22.277322" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:22.270738" elapsed="0.006638"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.277880" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.278419" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.278968" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.279150" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.279328" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.279726" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.279579" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:22.279564" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.279942" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.280135" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.280320" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:22.279532" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.279407" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.280624" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.280712" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:22.280845" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:22.268038" elapsed="0.012834"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:22.281078" elapsed="0.002521"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:22.284776" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:22.284406" elapsed="0.000405"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:22.285271" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:22.284992" elapsed="0.000307"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:22.285449" elapsed="0.000346"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:22.283936" elapsed="0.001919"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.283692" elapsed="0.002197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:22.286056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:22.285916" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.283670" elapsed="0.002462"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:22.257261" elapsed="0.028921"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:22.256284" elapsed="0.029980"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:22.255761" elapsed="0.030570"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.255713" elapsed="0.030664"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:22.286444" elapsed="0.000103"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:22.170092" elapsed="0.116668"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:22.156341" elapsed="0.130650"/>
</kw>
<msg time="2026-05-01T00:59:22.287087" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:22.287133" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:22.155775" elapsed="0.131381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:22.287341" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:22.287229" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:22.287210" elapsed="0.000197"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.287872" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:22.287567" elapsed="0.000331"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:22.288334" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.288041" elapsed="0.000354">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:22.155089" elapsed="0.133433">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.344378" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.343989" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.345192" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.344929" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:23.345363" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:23.344602" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.346015" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:23.345629" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.346340" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:23.346503" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:23.346198" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.346928" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.346681" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.347925" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.347672" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.348389" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:23.348122" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.348770" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.348968" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.349136" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:23.348643" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.348500" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:23.349269" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:23.349436" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:23.347339" elapsed="0.002138"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.347050" elapsed="0.002460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.349677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.349536" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.347027" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.350375" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:23.349933" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:23.350467" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:23.343367" elapsed="0.007229"/>
</kw>
<msg time="2026-05-01T00:59:23.350651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:23.342557" elapsed="0.008147"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.351189" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.351705" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.352240" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.352447" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.352642" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.353005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.352868" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:23.352852" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.353219" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.353380" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.353555" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:23.352823" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.352720" elapsed="0.000917"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.353776" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.353853" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:23.353973" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:23.338240" elapsed="0.015759"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.355414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.355174" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:23.355593" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:23.354834" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.355926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.355689" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.356497" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.356174" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.356007" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.355670" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.358894" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:23.356729" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:23.358973" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:23.359129" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:23.354315" elapsed="0.004839"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.360514" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.360252" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:23.360718" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:23.359913" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:23.360960" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:23.360821" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.360796" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.361185" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.361350" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.361417" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:23.363322" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:23.359466" elapsed="0.003882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.364765" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.364515" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.365192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.364954" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:23.372310" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:23.372472" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:23.372570" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:23.367436" elapsed="0.005160"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.365301" elapsed="0.007345"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.372820" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.372672" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.365282" elapsed="0.007624"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.376660" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.373978" elapsed="0.002752"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.373704" elapsed="0.003079"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.373686" elapsed="0.003135"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.380748" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.377223" elapsed="0.003593"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.376903" elapsed="0.003964"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.376878" elapsed="0.004026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.381758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:23.381147" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.382242" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.381904" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.383057" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.382617" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.382364" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.381876" elapsed="0.001304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.383981" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:23.383401" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.384525" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.384128" elapsed="0.000557"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.385397" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.384959" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.384724" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.384100" elapsed="0.001443"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:23.385757" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:23.386965" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:23.386526" elapsed="0.000478"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:23.387225" elapsed="0.002774"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:23.373261" elapsed="0.016806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.390253" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:23.390142" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.390121" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:23.393188" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:23.390480" elapsed="0.002738"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:23.393274" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:23.393444" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:23.363668" elapsed="0.029819"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:23.393553" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:23.393918" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:23.315530" elapsed="0.078427"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.410656" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.410248" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.411555" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.411234" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:23.411733" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:23.410875" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.412531" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:23.411933" elapsed="0.000626"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:23.412857" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:23.413023" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:23.412717" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.413519" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:23.413255" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:23.413928" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.413643" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.414443" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:23.414151" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.414012" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.413624" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.415118" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:23.414683" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:23.415197" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:23.409655" elapsed="0.005670"/>
</kw>
<msg time="2026-05-01T00:59:23.415391" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:23.408848" elapsed="0.006631"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.415973" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.416492" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.416993" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.417172" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.417339" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.417719" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.417582" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:23.417567" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.417937" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.418095" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.418288" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:23.417536" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.417416" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.418524" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.418603" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:23.418720" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:23.406211" elapsed="0.012536"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:23.418914" elapsed="0.002247"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:23.422217" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:23.421930" elapsed="0.000315"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:23.422676" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:23.422389" elapsed="0.000315"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:23.422847" elapsed="0.000324"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:23.421530" elapsed="0.001721"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.421268" elapsed="0.002018"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:23.423472" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:23.423311" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.421238" elapsed="0.002315"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:23.395337" elapsed="0.028262"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:23.394518" elapsed="0.029153"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:23.394091" elapsed="0.029648"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.394058" elapsed="0.029726"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:23.423848" elapsed="0.000077"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:23.307485" elapsed="0.116650"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:23.291356" elapsed="0.132945"/>
</kw>
<msg time="2026-05-01T00:59:23.424390" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:23.424435" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:23.290421" elapsed="0.134056"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:23.424668" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:23.424551" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:23.424533" elapsed="0.000201"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.425172" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:23.424869" elapsed="0.000329"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:23.425657" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.425339" elapsed="0.000377">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:23.289500" elapsed="0.136327">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.484046" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.483644" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.484861" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.484596" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:24.485030" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:24.484246" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.485623" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:24.485215" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.485949" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:24.486111" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:24.485806" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.486559" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.486289" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.487607" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.487300" elapsed="0.000353"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.488079" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:24.487809" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.488430" elapsed="0.000036"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.488646" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.488813" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:24.488301" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.488160" elapsed="0.000742"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:24.488948" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:24.489116" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:24.486979" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.486684" elapsed="0.002490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.489341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.489200" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.486661" elapsed="0.002757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.490026" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:24.489574" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:24.490103" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:24.482994" elapsed="0.007236"/>
</kw>
<msg time="2026-05-01T00:59:24.490286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:24.482101" elapsed="0.008236"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.490937" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.491668" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.492172" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.492353" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.492536" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.493048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.492912" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:24.492898" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.493264" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.493425" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.493602" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:24.492869" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.492613" elapsed="0.001069"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.493819" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.493897" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:24.494017" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:24.477852" elapsed="0.016191"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.495280" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.495027" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:24.495436" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:24.494692" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.495835" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.495592" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.496386" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.496088" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.495917" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.495572" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.498849" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:24.496634" elapsed="0.002243"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:24.498930" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:24.499088" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:24.494360" elapsed="0.004753"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.500347" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.500107" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:24.500521" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:24.499776" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:24.500758" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:24.500620" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.500601" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.500984" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.501148" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.501215" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:24.503299" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:24.499436" elapsed="0.003890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.504738" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.504484" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.505177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.504932" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:24.512250" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:24.512387" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:24.512538" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:24.507405" elapsed="0.005164"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.505289" elapsed="0.007324"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.512788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.512639" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.505270" elapsed="0.007604"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.516397" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.513989" elapsed="0.002456"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.513774" elapsed="0.002722"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.513755" elapsed="0.002767"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.519128" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.516795" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.516579" elapsed="0.002671"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.516562" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.519843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:24.519435" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.520175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.519944" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.520777" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.520444" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.520258" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.519925" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.521394" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:24.521017" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.521844" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.521523" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.522645" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.522167" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.521957" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.521494" elapsed="0.001274"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:24.523008" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:24.524162" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:24.523751" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:24.524408" elapsed="0.003346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:24.513291" elapsed="0.014554"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.528097" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:24.527946" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.527919" elapsed="0.000276"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:24.531959" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:24.528390" elapsed="0.003597"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:24.532042" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:24.532207" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:24.503660" elapsed="0.028574"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:24.532324" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:24.532745" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:24.454829" elapsed="0.077956"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.549802" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.549406" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.550692" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.550405" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:24.550861" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:24.550065" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.551430" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:24.551043" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:24.551769" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:24.551958" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:24.551631" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.552384" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:24.552137" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:24.552822" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.552524" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.553341" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:24.553047" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.552909" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.552500" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.554018" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:24.553579" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:24.554098" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:24.548767" elapsed="0.005464"/>
</kw>
<msg time="2026-05-01T00:59:24.554285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:24.547797" elapsed="0.006541"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.554879" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.555385" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.555921" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.556208" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.556381" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.556788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.556649" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:24.556633" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.557051" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.557227" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.557388" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:24.556601" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.556486" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.557628" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.557707" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:24.557830" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:24.545058" elapsed="0.012799"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:24.558027" elapsed="0.002436"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:24.561524" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:24.561203" elapsed="0.000349"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:24.561979" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:24.561703" elapsed="0.000304"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:24.562155" elapsed="0.000381"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:24.560792" elapsed="0.001810"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.560550" elapsed="0.002087"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:24.562807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:24.562664" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.560529" elapsed="0.002358"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:24.534138" elapsed="0.028800"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:24.533305" elapsed="0.029713"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:24.532922" elapsed="0.030202"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.532887" elapsed="0.030288"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:24.563244" elapsed="0.000082"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:24.445856" elapsed="0.117721"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:24.428942" elapsed="0.134806"/>
</kw>
<msg time="2026-05-01T00:59:24.563842" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:24.563888" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:24.427917" elapsed="0.135995"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:24.564099" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:24.563988" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:24.563969" elapsed="0.000200"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.564641" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:24.564306" elapsed="0.000361"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:24.565121" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.564814" elapsed="0.000372">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:24.426919" elapsed="0.138381">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.621654" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.621243" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.622435" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.622172" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:25.622620" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:25.621849" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.623192" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:25.622802" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.623529" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:25.623688" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:25.623373" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.624109" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.623863" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.625141" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.624886" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.625622" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:25.625337" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.625968" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.626166" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.626333" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:25.625842" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.625702" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:25.626482" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:25.626705" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:25.624537" elapsed="0.002193"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.624230" elapsed="0.002533"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.626931" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.626788" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.624208" elapsed="0.002802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.627608" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:25.627145" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:25.627686" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:25.620621" elapsed="0.007191"/>
</kw>
<msg time="2026-05-01T00:59:25.627866" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:25.619812" elapsed="0.008106"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.628406" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.628941" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.629441" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.629636" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.629802" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.630190" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.630022" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:25.630007" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.630413" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.630591" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.630750" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:25.629977" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.629876" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.630967" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.631086" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:25.631209" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:25.615481" elapsed="0.015755"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.632720" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.632434" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:25.632882" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:25.632090" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.633220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.632979" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.633779" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.633487" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.633302" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.632960" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.636328" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:25.634005" elapsed="0.002350"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:25.636406" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:25.636602" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:25.631574" elapsed="0.005053"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.637825" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.637588" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:25.637979" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:25.637241" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:25.638209" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:25.638075" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.638056" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.638430" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.638637" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.638703" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:25.640619" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:25.636927" elapsed="0.003722"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.642030" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.641784" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.642472" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.642219" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:25.649588" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:25.649759" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:25.649874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:25.644682" elapsed="0.005219"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.642585" elapsed="0.007359"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.650117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.649970" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.642566" elapsed="0.007638"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.653790" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.651217" elapsed="0.002621"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.651005" elapsed="0.002869"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.650986" elapsed="0.002913"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.656562" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.654172" elapsed="0.002458"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.653956" elapsed="0.002723"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.653939" elapsed="0.002776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.657484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:25.656931" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.657952" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.657630" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.658729" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.658283" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.658068" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.657605" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.659591" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:25.659060" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.660042" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.659728" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.660820" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.660382" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.660156" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.659703" elapsed="0.001235"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:25.661137" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:25.662260" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:25.661858" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:25.662523" elapsed="0.003379"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:25.650579" elapsed="0.015412"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.666239" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:25.666090" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.666063" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:25.669784" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:25.666556" elapsed="0.003257"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:25.669866" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:25.670026" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:25.640962" elapsed="0.029124"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:25.670153" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:25.670519" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:25.592647" elapsed="0.077916"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.687321" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.686824" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.688176" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.687900" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:25.688362" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:25.687556" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.689017" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:25.688589" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:25.689382" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:25.689751" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:25.689225" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.690180" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:25.689931" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:25.690605" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.690298" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.691132" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:25.690835" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.690694" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.690276" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.691836" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:25.691355" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:25.691923" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:25.686156" elapsed="0.005900"/>
</kw>
<msg time="2026-05-01T00:59:25.692110" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:25.685323" elapsed="0.006839"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.692717" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.693226" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.693758" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.693939" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.694109" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.694489" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.694338" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:25.694323" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.694744" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.694908" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.695066" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:25.694292" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.694188" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.695284" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.695361" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:25.695495" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:25.682589" elapsed="0.012935"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:25.695698" elapsed="0.002220"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:25.698952" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:25.698655" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:25.699399" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:25.699125" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:25.699624" elapsed="0.000352"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:25.698233" elapsed="0.001804"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.698001" elapsed="0.002070"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:25.700237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:25.700096" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.697982" elapsed="0.002332"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:25.671893" elapsed="0.028467"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:25.671074" elapsed="0.029360"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:25.670698" elapsed="0.029818"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.670664" elapsed="0.029900"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:25.700632" elapsed="0.000080"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:25.584411" elapsed="0.116513"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:25.568055" elapsed="0.133039"/>
</kw>
<msg time="2026-05-01T00:59:25.701186" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:25.701233" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:25.567140" elapsed="0.134117"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:25.701442" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:25.701330" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:25.701312" elapsed="0.000225"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.701991" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:25.701677" elapsed="0.000341"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:25.702484" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.702163" elapsed="0.000386">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:25.566211" elapsed="0.136450">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.758187" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.757799" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.758985" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.758726" elapsed="0.000331">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:26.759152" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:26.758382" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.759744" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:26.759335" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.760092" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:26.760256" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:26.759926" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.760703" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.760433" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.761765" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.761508" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.762230" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:26.761961" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.762596" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.762800" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.762968" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:26.762448" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.762307" elapsed="0.000750"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:26.763107" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:59:26.763283" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:26.761175" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.760883" elapsed="0.002457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.763520" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.763365" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.760860" elapsed="0.002738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.764201" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:26.763733" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:26.764277" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:26.757181" elapsed="0.007235"/>
</kw>
<msg time="2026-05-01T00:59:26.764485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:26.756357" elapsed="0.008181"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.765021" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.765714" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.766222" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.766415" elapsed="0.000130"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.766706" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.767067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.766931" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:26.766916" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.767278" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.767438" elapsed="0.000039"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.767619" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:26.766886" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.766783" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.767846" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.767942" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:26.768063" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:26.752141" elapsed="0.015949"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.769372" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.769135" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:26.769545" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:26.768807" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.769877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.769641" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.770414" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.770127" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.769957" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.769623" elapsed="0.000890"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.772836" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:26.770653" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:26.772914" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:26.773069" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:26.768468" elapsed="0.004625"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.774281" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.774046" elapsed="0.000297">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:26.774436" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:26.773721" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:26.774683" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T00:59:26.774548" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.774529" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.774904" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.775110" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.775178" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:26.777227" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:26.773392" elapsed="0.003861"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.778641" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.778373" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.779066" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.778828" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:26.787157" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:26.787291" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:26.787385" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:26.781242" elapsed="0.006169"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.779175" elapsed="0.008300"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.787665" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.787504" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.779157" elapsed="0.008595"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.791131" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.788756" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.788544" elapsed="0.002668"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.788526" elapsed="0.002710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.794423" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.791517" elapsed="0.002990"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.791291" elapsed="0.003266"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.791274" elapsed="0.003321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.795338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:26.794809" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.795894" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.795496" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.796679" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.796230" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.796014" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.795469" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.797527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:26.797005" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.797974" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.797663" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.798737" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.798299" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.798088" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.797638" elapsed="0.001219"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:26.799052" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:26.800335" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:26.799925" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:26.800600" elapsed="0.004677"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:26.788111" elapsed="0.017231"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.805539" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:26.805413" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.805394" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:26.808390" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:26.805747" elapsed="0.002671"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:26.808487" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:26.808648" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:26.777574" elapsed="0.031101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:26.808739" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:26.809074" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:26.729366" elapsed="0.079745"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.825527" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.825137" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.826263" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.826039" elapsed="0.000291">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:26.826423" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:26.825716" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.827011" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:26.826620" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:26.827360" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:26.827531" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:26.827190" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.828078" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:26.827714" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:26.828487" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.828190" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.829005" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:26.828717" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.828572" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.828172" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.829706" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:26.829263" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:26.829784" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:26.824537" elapsed="0.005373"/>
</kw>
<msg time="2026-05-01T00:59:26.829963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:26.823741" elapsed="0.006273"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.830516" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.831021" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.831736" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.831918" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.832084" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.832445" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.832309" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:26.832294" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.832675" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.832837" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.832997" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:26.832264" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.832160" elapsed="0.000917"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.833214" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.833291" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:26.833408" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:26.821085" elapsed="0.012395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:26.833655" elapsed="0.002205"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:26.836871" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:26.836589" elapsed="0.000310"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:26.837312" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:26.837044" elapsed="0.000295"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:26.837499" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:26.836172" elapsed="0.001713"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.835941" elapsed="0.001978"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:26.838083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:26.837944" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.835922" elapsed="0.002237"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:26.810442" elapsed="0.027764"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:26.809641" elapsed="0.028640"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:26.809242" elapsed="0.029099"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.809208" elapsed="0.029177"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:26.838449" elapsed="0.000101"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:26.721051" elapsed="0.117710"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:26.705658" elapsed="0.133265"/>
</kw>
<msg time="2026-05-01T00:59:26.839012" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:26.839055" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:26.704590" elapsed="0.134488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:26.839286" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:26.839175" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:26.839157" elapsed="0.000196"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.839816" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:26.839511" elapsed="0.000331"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:26.840280" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.839986" elapsed="0.000353">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:26.703629" elapsed="0.136818">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.898406" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.898006" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.899443" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.899133" elapsed="0.000430">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:27.899688" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:27.898786" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.900354" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:27.899933" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.900709" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:27.900919" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:27.900560" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.901359" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.901105" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.902382" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.902124" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.902869" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:27.902597" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.903253" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.903499" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.903686" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:27.903098" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.902950" elapsed="0.000826"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:27.903825" elapsed="0.000056"/>
</return>
<msg time="2026-05-01T00:59:27.904031" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:27.901803" elapsed="0.002254"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.901504" elapsed="0.002585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.904295" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.904116" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.901477" elapsed="0.002909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.905040" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:27.904547" elapsed="0.000521"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:27.905117" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:27.897333" elapsed="0.007913"/>
</kw>
<msg time="2026-05-01T00:59:27.905302" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:27.896442" elapsed="0.008913"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.905912" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.906514" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.907206" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.907391" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.907576" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.907940" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.907804" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:27.907789" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.908153" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.908314" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.908489" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:27.907758" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.907655" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.908712" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.908789" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:27.908924" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:27.891976" elapsed="0.016975"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.910210" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.909967" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:27.910382" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:27.909630" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.910742" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.910497" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.911346" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.911042" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.910833" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.910477" elapsed="0.000954"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.913883" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:27.911597" elapsed="0.002329"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:27.914023" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:27.914192" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:27.909289" elapsed="0.004929"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.915447" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.915202" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:27.915627" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:27.914865" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:27.915869" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:27.915728" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.915709" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.916095" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.916260" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.916327" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:27.918313" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:27.914541" elapsed="0.003798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.919766" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.919511" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.920201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.919957" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:27.927355" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:27.927516" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:27.927614" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:27.922611" elapsed="0.005030"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.920313" elapsed="0.007395"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.927963" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.927747" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.920295" elapsed="0.007796"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.933318" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.929653" elapsed="0.003737"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.929306" elapsed="0.004137"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.929278" elapsed="0.004227"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.937543" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.933923" elapsed="0.003688"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.933592" elapsed="0.004055"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.933566" elapsed="0.004107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.938232" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:27.937835" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.938582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.938332" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.939121" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.938820" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.938666" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.938313" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.939779" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:27.939395" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.940101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.939876" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.940676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.940336" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.940183" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.939858" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:27.940904" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:27.941728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:27.941408" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:27.941903" elapsed="0.002317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:27.928658" elapsed="0.015627"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.944480" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:27.944357" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.944338" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:27.947511" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:27.944703" elapsed="0.002838"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:27.947595" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:27.947755" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:27.918684" elapsed="0.029098"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:27.947845" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:27.948184" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:27.868357" elapsed="0.079865"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.965421" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.965051" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.966170" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.965941" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:27.966331" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:27.965619" elapsed="0.000737"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.966909" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:27.966528" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:27.967268" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:27.967410" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:27.967129" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.967850" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:27.967603" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:27.968251" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.967965" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.968817" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:27.968522" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.968360" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.967945" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.969484" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:27.969040" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:27.969565" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:27.964430" elapsed="0.005263"/>
</kw>
<msg time="2026-05-01T00:59:27.969747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:27.963630" elapsed="0.006169"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.970291" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.970809" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.971306" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.971496" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.971663" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.972062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.971925" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:27.971910" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.972284" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.972464" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.972627" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:27.971880" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.971773" elapsed="0.000935"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.972845" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.972922" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:27.973038" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:27.960999" elapsed="0.012065"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:27.973230" elapsed="0.002357"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:27.976631" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:27.976323" elapsed="0.000336"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:27.977076" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:27.976805" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:27.977249" elapsed="0.000344"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:27.975902" elapsed="0.001751"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.975671" elapsed="0.002016"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:27.977852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:27.977712" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.975651" elapsed="0.002277"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:27.949598" elapsed="0.028380"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:27.948781" elapsed="0.029270"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:27.948355" elapsed="0.029757"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.948322" elapsed="0.029835"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:27.978222" elapsed="0.000079"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:27.860064" elapsed="0.118471"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:27.843216" elapsed="0.135486"/>
</kw>
<msg time="2026-05-01T00:59:27.978791" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:27.978909" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:27.842305" elapsed="0.136629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:27.979156" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:27.979044" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:27.979024" elapsed="0.000200"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.979692" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:27.979362" elapsed="0.000356"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:27.980161" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.979863" elapsed="0.000374">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:27.841327" elapsed="0.139022">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.035649" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.035140" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.036565" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.036233" elapsed="0.000416">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.036762" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.035889" elapsed="0.000908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.037401" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.036999" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.037753" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.037943" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.037605" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.038376" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.038123" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.039491" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.039198" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.039982" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.039703" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.040373" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.040596" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.040767" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.040242" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.040086" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:29.040908" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:29.041088" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:29.038850" elapsed="0.002272"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.038525" elapsed="0.002641"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.041342" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.041196" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.038498" elapsed="0.002922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.042044" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.041577" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.042186" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.034492" elapsed="0.007849"/>
</kw>
<msg time="2026-05-01T00:59:29.042412" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.033344" elapsed="0.009149"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.043020" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.043618" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.044266" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.044503" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.044696" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.045066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.044928" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.044914" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.045279" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.045440" elapsed="0.000040"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.045639" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.044884" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.044778" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.045871" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.045952" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:29.046078" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.028968" elapsed="0.017136"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.047742" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.047468" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.047909" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.047085" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.048305" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.048012" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.048910" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.048584" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.048391" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.047990" elapsed="0.001007"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.051475" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.049144" elapsed="0.002364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:29.051562" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:29.051725" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:29.046551" elapsed="0.005200"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.053062" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.052818" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.053240" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.052396" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:29.053495" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T00:59:29.053338" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.053319" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.053738" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.053908" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.053975" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:29.056646" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:29.052072" elapsed="0.004610"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.058289" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.058036" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.058763" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.058497" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:29.065880" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:29.066016" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:29.066125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:29.061017" elapsed="0.005146"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.058876" elapsed="0.007333"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.066387" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.066237" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.058856" elapsed="0.007689"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.070295" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.067651" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.067407" elapsed="0.002973"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.067382" elapsed="0.003023"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.073848" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.070722" elapsed="0.003208"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.070485" elapsed="0.003508"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.070445" elapsed="0.003591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.074959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.074312" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.075477" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.075103" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.076359" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.075854" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.075596" elapsed="0.000876"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.075077" elapsed="0.001443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.077324" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.076757" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.077830" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.077503" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.078635" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.078162" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.077946" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.077474" elapsed="0.001280"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.078956" elapsed="0.000601"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:29.080208" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.079788" elapsed="0.000467"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.080533" elapsed="0.003398"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:29.066917" elapsed="0.017081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.084187" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:29.084071" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.084051" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.087427" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.084424" elapsed="0.003049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:29.087529" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:29.087708" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:29.057101" elapsed="0.030633"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.087802" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:29.088208" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:29.006078" elapsed="0.082170"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.105647" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.105220" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.106448" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.106165" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.106639" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.105838" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.107396" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.106823" elapsed="0.000601"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.107782" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.107960" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.107616" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.108385" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.108139" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:29.108844" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.108528" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.109396" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.109071" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.108929" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.108506" elapsed="0.000992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.110187" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.109645" elapsed="0.000581"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.110291" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.104579" elapsed="0.005900"/>
</kw>
<msg time="2026-05-01T00:59:29.110551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.103753" elapsed="0.006853"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.111135" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.111763" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.112511" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.112768" elapsed="0.000031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.113007" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.113535" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.113324" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.113304" elapsed="0.000341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.113837" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.114064" elapsed="0.000032"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.114292" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.113261" elapsed="0.001106"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.113118" elapsed="0.001285"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.114615" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.114719" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T00:59:29.114877" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.100986" elapsed="0.013960"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.115188" elapsed="0.002990"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.119326" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.119003" elapsed="0.000352"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.119851" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.119546" elapsed="0.000335"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T00:59:29.120032" elapsed="0.000365"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T00:59:29.118542" elapsed="0.001936"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.118264" elapsed="0.002252"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.120726" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.120555" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.118245" elapsed="0.002787"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T00:59:29.089801" elapsed="0.031299"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T00:59:29.088907" elapsed="0.032291"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.088440" elapsed="0.032840"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.088403" elapsed="0.032933"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.121408" elapsed="0.000122"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T00:59:28.997238" elapsed="0.124538"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T00:59:28.983180" elapsed="0.138784"/>
</kw>
<msg time="2026-05-01T00:59:29.122061" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T00:59:29.122108" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:28.982229" elapsed="0.139903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.122334" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:29.122209" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.122190" elapsed="0.000217"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.122957" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.122592" elapsed="0.000392"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.123486" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.123134" elapsed="0.000425">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T00:59:28.981229" elapsed="0.142445">None</status>
</kw>
<msg time="2026-05-01T00:59:29.123779" level="FAIL">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.756199" elapsed="10.367701">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:59:29.123960" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.755845" elapsed="10.368165"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some Keywords need several tries to finally fail, this keyword passes if and only if the failure ultimately happens.</doc>
<status status="FAIL" start="2026-05-01T00:59:18.755526" elapsed="10.368586">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T00:59:29.124236" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T00:59:29.124281" level="INFO">${output} = Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T00:59:18.755114" elapsed="10.369192"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T00:59:29.124522" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T00:59:29.124382" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.124362" elapsed="0.000246"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.124759" elapsed="0.000024"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.124947" elapsed="0.000029"/>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T00:59:18.754733" elapsed="10.370362"/>
</kw>
<msg time="2026-05-01T00:59:29.125147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:18.754280" elapsed="10.370916"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some positive checks report false success for a short time. This keyword verifies no failure does happen within timeout period.
This implementation needs more complicated logic than, Verify_Keyword_Never_Passes_Within_Timeout,
so use that keyword in case you have a negative check handy.</doc>
<status status="PASS" start="2026-05-01T00:59:18.753959" elapsed="10.371318"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:29.126185" elapsed="0.000303"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:29.125578" elapsed="0.000985"/>
</kw>
<doc>The same logic as Topology_Unauthorized_1 as incorrect password was provided to ODL.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:59:18.752592" elapsed="10.374013"/>
</test>
<test id="s1-s21-t6" name="Set_Correct_Password" line="80">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.128199" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.127956" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.127937" elapsed="0.000348"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:29.127759" elapsed="0.000575"/>
</kw>
<kw name="Replace_Password_On_Pcep_Node">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.129359" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | PASSWD=topsecret }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>PASSWD=${password}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.128878" elapsed="0.000517"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.152480" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.152074" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.153323" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.153049" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.153521" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.152690" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.154117" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.153708" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.154476" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.154655" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.154305" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.155135" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.154880" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.156204" level="INFO">mapping: {'IP': '10.30.170.157', 'PASSWD': 'topsecret'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.155933" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.158343" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.156415" elapsed="0.001957"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.159088" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.158779" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.160140" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.159665" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.160221" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:29.160414" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.159324" elapsed="0.001117"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.160622" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:29.158644" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.161510" level="INFO">${value} = topsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.161159" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.162527" level="INFO">${encoded} = topsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.162042" elapsed="0.000556"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.162653" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:29.162813" level="INFO">${encoded_value} = topsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.161726" elapsed="0.001164"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.163042" elapsed="0.000246"/>
</kw>
<var name="${key}">PASSWD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-05-01T00:59:29.161032" elapsed="0.002302"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:29.158430" elapsed="0.004940"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:29.163414" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:29.163612" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'topsecret'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:29.155589" elapsed="0.008057"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.155276" elapsed="0.008405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.163855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.163708" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.155253" elapsed="0.008681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.164676" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.164070" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.164775" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.151294" elapsed="0.013613"/>
</kw>
<msg time="2026-05-01T00:59:29.164962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.150381" elapsed="0.014631"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.165547" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.166104" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.166647" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.166831" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.167027" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.167393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.167255" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.167241" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.167665" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.167872" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.168063" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.167209" elapsed="0.000914"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.167105" elapsed="0.001046"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.168292" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.168371" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:29.168534" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.146023" elapsed="0.022538"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.186791" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.186261" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.187634" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.187332" elapsed="0.000384">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.187816" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.186999" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.188407" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.188003" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.188791" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.188970" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.188615" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.189423" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.189169" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:29.189927" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.189594" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.190500" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'topsecret'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.190159" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.190018" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.189566" elapsed="0.001022"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.191360" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;topsecr...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.190735" elapsed="0.000657"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.191446" elapsed="0.000055"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.185608" elapsed="0.006002"/>
</kw>
<msg time="2026-05-01T00:59:29.191743" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.184495" elapsed="0.007301"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.192326" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.192878" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.193426" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.193628" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.193799" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.194194" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.194036" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.194021" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.194431" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.194625" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.194797" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.193990" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.193880" elapsed="0.001000"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.195022" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.195098" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:29.195240" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;topsecr...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.180990" elapsed="0.014283"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.196671" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.196304" elapsed="0.000447">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.196898" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.195951" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.197264" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.196999" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.198110" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.197565" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.197356" elapsed="0.000838"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.196980" elapsed="0.001243"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.200838" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.198472" elapsed="0.002399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:29.200943" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:29.201111" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:29.195624" elapsed="0.005513"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.202785" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.202525" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.203236" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.202995" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.203689" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.203429" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.204139" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.203885" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T00:59:29.205035" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T00:59:29.204812" elapsed="0.000251"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T00:59:29.205470" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T00:59:29.205244" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.205665" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.206316" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.206033" elapsed="0.000328"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T00:59:29.206404" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:29.206585" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T00:59:29.204381" elapsed="0.002230"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:29.219064" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01wa4zqh2fkawd1hp4tf4uaepnl31.node0', 'Content-Length': '243', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;topsecret&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-05-01T00:59:29.219142" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:29.219300" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:29.208875" elapsed="0.010463"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.206683" elapsed="0.012720"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.219694" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.219444" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.206665" elapsed="0.013151"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.224677" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.221297" elapsed="0.003459"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.221032" elapsed="0.003774"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.221012" elapsed="0.003832"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.228873" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.225233" elapsed="0.003723"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.224924" elapsed="0.004095"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.224900" elapsed="0.004165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.229954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.229359" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.230437" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.230112" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.231213" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.230798" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.230575" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.230082" elapsed="0.001248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.232076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.231561" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.232546" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.232211" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.233283" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.232873" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.232661" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.232186" elapsed="0.001214"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.233625" elapsed="0.000549"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:29.234797" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.234400" elapsed="0.000424"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.234973" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:29.220333" elapsed="0.017271"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T00:59:29.237786" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-05-01T00:59:29.237672" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.237654" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.238045" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.238116" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:29.240438" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:29.201498" elapsed="0.038983"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.240549" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:29.240720" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:29.134162" elapsed="0.106591"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.241164" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.240860" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.240843" elapsed="0.000444"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.241401" elapsed="0.000039"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}pcep_topology_node</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T00:59:29.129674" elapsed="0.111921"/>
</kw>
<arg>password=topsecret</arg>
<doc>Send restconf PUT to replace the config module specifying PCEP password element.</doc>
<status status="PASS" start="2026-05-01T00:59:29.128525" elapsed="0.113147"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:29.242477" elapsed="0.000274"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:29.242032" elapsed="0.000785"/>
</kw>
<doc>Configure password in pcep dispatcher for client with Mininet IP address.
This password finally matches what pcc-mock uses.</doc>
<status status="PASS" start="2026-05-01T00:59:29.127010" elapsed="0.116011"/>
</test>
<test id="s1-s21-t7" name="Topology_Intercondition" line="85">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.244425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.244211" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.244193" elapsed="0.000331"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:29.244016" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.245370" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | CODE=cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE= | NAME=pcc_10.30.170.157_tunnel_1 | IP_ODL=10.30.170.185 | ERRORS= }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>CODE=${pcc_name_code}</arg>
<arg>NAME=${pcc_name}</arg>
<arg>IP_ODL=${ODL_SYSTEM_IP}</arg>
<arg>ERRORS=${ERROR_ARGS}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.244751" elapsed="0.000649"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.284749" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.284339" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.285573" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.285273" elapsed="0.000395">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.285766" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.284945" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.286340" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.285951" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.286684" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.286860" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.286536" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.287283" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.287038" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.288310" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.288052" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.288790" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.288520" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.289671" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.289192" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.290676" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.290284" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.290760" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:59:29.290928" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.289936" elapsed="0.001072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.291159" elapsed="0.000317"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:29.289061" elapsed="0.002459"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.292092" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.291765" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.293013" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.292658" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.293090" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:29.293243" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.292299" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.293411" elapsed="0.000335"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:29.291639" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.294577" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.294047" elapsed="0.000557"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.295486" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.295118" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.295563" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:29.295716" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.294786" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.295882" elapsed="0.000276"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:29.293921" elapsed="0.002279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.296798" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.296439" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.297728" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.297334" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.297806" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:29.297961" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.297002" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.298128" elapsed="0.000276"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:29.296314" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.299022" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.298704" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:29.299936" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.299575" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:29.300014" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:29.300166" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:29.299225" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.300332" elapsed="0.000312"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:29.298578" elapsed="0.002108"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:29.288875" elapsed="0.011845"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:29.300763" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:29.300924" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:29.287733" elapsed="0.013217"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.287408" elapsed="0.013573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.301152" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.301008" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.287383" elapsed="0.013891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.301993" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.301415" elapsed="0.000606"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.302071" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.283736" elapsed="0.018463"/>
</kw>
<msg time="2026-05-01T00:59:29.302254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.282878" elapsed="0.019427"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.302827" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.303326" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.303840" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.304018" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.304183" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.304612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.304406" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.304391" elapsed="0.000302"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.304825" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.304982" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.305137" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.304360" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.304258" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.305350" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.305426" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:29.305642" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.278517" elapsed="0.027157"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.306991" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.306710" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.307160" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.306350" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.307735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.307484" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.308286" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.307989" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.307817" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.307236" elapsed="0.001133"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.310898" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.308585" elapsed="0.002340"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:29.310978" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:29.311134" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:29.306028" elapsed="0.005131"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.312416" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.312124" elapsed="0.000369"/>
</kw>
<msg time="2026-05-01T00:59:29.312580" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.311797" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.312810" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:29.312674" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.312656" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.313181" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.313343" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.313014" elapsed="0.000354"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:29.313812" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.313572" elapsed="0.000267"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:29.313885" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:29.314041" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:29.311476" elapsed="0.002590"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.315441" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.315194" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.315882" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.315644" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:29.322823" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:29.323001" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:29.323140" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:29.318130" elapsed="0.005048"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.316027" elapsed="0.007212"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.323514" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.323278" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.315973" elapsed="0.007669"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.328885" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.325106" elapsed="0.003849"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.324807" elapsed="0.004199"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.324782" elapsed="0.004262"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.333027" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.329514" elapsed="0.003581"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.329126" elapsed="0.004022"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.329102" elapsed="0.004085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.333989" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.333502" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.334317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.334088" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.334871" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.334569" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.334397" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.334070" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.335483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.335105" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.335806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.335581" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.336327" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.336035" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.335886" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.335563" elapsed="0.000846"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.336576" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:29.337427" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.337084" elapsed="0.000389"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:29.337642" elapsed="0.002377"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:29.324189" elapsed="0.015900"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.340276" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:29.340163" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.340144" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.343464" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.340506" elapsed="0.003065"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:29.343627" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:29.343802" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:29.314375" elapsed="0.029453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.343895" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:29.344048" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:29.254253" elapsed="0.089822"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.360698" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.360296" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.361677" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.361258" elapsed="0.000502">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:29.361859" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:29.360892" elapsed="0.000992"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.362683" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:29.362046" elapsed="0.000665"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:29.363008" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:29.363191" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:29.362865" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.363637" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:29.363368" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:29.364148" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.363842" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.364702" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:29.364374" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:29.364234" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:29.363820" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.366025" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:29.364924" elapsed="0.001131"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:29.366109" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:29.359694" elapsed="0.006556"/>
</kw>
<msg time="2026-05-01T00:59:29.366336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.358789" elapsed="0.007597"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.366913" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.367418" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.367930" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.368108" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.368272" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.368664" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.368526" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:29.368511" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.368874" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.369030" elapsed="0.000060"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.369262" elapsed="0.000072"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:29.368478" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.368352" elapsed="0.001058"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.369577" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.369667" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:29.369886" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:29.355973" elapsed="0.013940"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:29.370084" elapsed="0.002334"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.374514" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.373231" elapsed="0.001315"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:29.375011" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:29.374694" elapsed="0.000344"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:29.375542" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:29.375951" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
-     "network-topology-pcep:path-computation-client": {
-      "ip-address": "10.30.170.157",
-      "reported-lsp": [
-       {
-        "name": "pcc_10.30.170.157_tunnel_1",
-        "path": [
-         {
-          "ero": {
-           "ignore": false,
-           "processing-rule": false,
-           "subobject": [
-            {
-             "ip-prefix": {
-              "ip-prefix": "1.1.1.1/32"
-             },
-             "loose": false
-            }
-           ]
-          },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
-           "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
-           "plsp-id": 1,
-           "processing-rule": false,
-           "remove": false,
-           "sync": true,
-           "tlvs": {
-            "lsp-identifiers": {
-             "ipv4": {
-              "ipv4-extended-tunnel-id": "10.30.170.157",
-              "ipv4-tunnel-endpoint-address": "1.1.1.1",
-              "ipv4-tunnel-sender-address": "10.30.170.157"
-             },
-             "lsp-id": 1,
-             "tunnel-id": 1
-            },
-            "symbolic-path-name": {
-             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
-            }
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.375186" elapsed="0.000914">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.372764" elapsed="0.003516">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:29.372516" elapsed="0.003858">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:29.376580" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:29.376414" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:29.372497" elapsed="0.004165">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.345305" elapsed="0.031507">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.344418" elapsed="0.032591">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:29.344160" elapsed="0.032974">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:29.344143" elapsed="0.033065">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:29.377275" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.249911" elapsed="0.127519">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.423503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.423079" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.424367" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.424062" elapsed="0.000411">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:30.424598" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:30.423708" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.425340" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:30.424842" elapsed="0.000536"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.425753" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:30.425963" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:30.425567" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.426500" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.426199" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.427628" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.427333" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.428129" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.427851" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.428925" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.428543" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:30.429960" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.429531" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:30.430044" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:59:30.430212" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:30.429142" elapsed="0.001096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.430470" elapsed="0.000305"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:30.428393" elapsed="0.002426"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.431694" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.431090" elapsed="0.000631"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:30.432726" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.432326" elapsed="0.000428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:30.432808" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:30.432970" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:30.431916" elapsed="0.001079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.433144" elapsed="0.000286"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:30.430959" elapsed="0.002528"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.434097" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.433765" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:30.435019" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.434660" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:30.435095" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:30.435247" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:30.434301" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.435415" elapsed="0.000295"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:30.433603" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.436314" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.435993" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:30.437342" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.436957" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:30.437423" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:59:30.437600" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:30.436551" elapsed="0.001092"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.437792" elapsed="0.000289"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:30.435866" elapsed="0.002257"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.438745" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.438369" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:30.439711" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.439306" elapsed="0.000433"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:30.439792" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:30.439954" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:30.438959" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.440128" elapsed="0.000285"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:30.438240" elapsed="0.002232"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:30.428208" elapsed="0.012302"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:30.440556" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:30.440739" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:30.426991" elapsed="0.013777"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.426654" elapsed="0.014148"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.440983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.440832" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.426628" elapsed="0.014499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.441894" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:30.441271" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:30.441974" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:30.422406" elapsed="0.019699"/>
</kw>
<msg time="2026-05-01T00:59:30.442162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:30.421395" elapsed="0.020821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.442859" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.443410" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.443975" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.444175" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.444360" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.444787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.444630" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:30.444614" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.445005" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.445165" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.445347" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:30.444578" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.444440" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.445640" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.445723" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:30.445851" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:30.416507" elapsed="0.029371"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.447646" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.447326" elapsed="0.000399">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:30.447821" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:30.446964" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.448195" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.447919" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.448817" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.448449" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.448279" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.447900" elapsed="0.001006"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.451340" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:30.449051" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:30.451420" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:59:30.451593" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:30.446611" elapsed="0.005007"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.452774" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:30.452579" elapsed="0.000248"/>
</kw>
<msg time="2026-05-01T00:59:30.452910" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:30.452235" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.453140" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:30.453004" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.452986" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.453588" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:30.453776" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:30.453339" elapsed="0.000473"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:30.454344" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.454019" elapsed="0.000361"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:30.454445" elapsed="0.000062"/>
</return>
<msg time="2026-05-01T00:59:30.454686" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:30.451921" elapsed="0.002802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.456639" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.456274" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.457402" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.457001" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:30.467553" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:30.468643" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:30.468777" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:30.460796" elapsed="0.008008"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.457629" elapsed="0.011219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.469029" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.468877" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.457602" elapsed="0.011513"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.475821" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.470293" elapsed="0.005653"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.470071" elapsed="0.005950"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.470052" elapsed="0.006030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.480764" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.476659" elapsed="0.004193"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.476210" elapsed="0.004707"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.476171" elapsed="0.004794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.482082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:30.481288" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.482636" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.482238" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.483425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.482985" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.482765" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.482209" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.484375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:30.483844" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.484895" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.484542" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.485738" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.485232" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.485016" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.484514" elapsed="0.001329"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:30.486002" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:30.486935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:30.486613" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:30.487118" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:30.469577" elapsed="0.020194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.490025" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:30.489871" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.489846" elapsed="0.000285"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:30.494678" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.490334" elapsed="0.004390"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:30.494801" elapsed="0.000049"/>
</return>
<msg time="2026-05-01T00:59:30.495028" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:30.455145" elapsed="0.039920"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:30.495153" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:30.495355" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:30.392803" elapsed="0.102588"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.520777" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.520358" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.521974" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.521537" elapsed="0.000518">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:30.522152" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:30.521177" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.522753" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:30.522334" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:30.523083" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:30.523259" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:30.522933" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.523968" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:30.523442" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:30.524523" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.524206" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.525069" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:30.524750" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:30.524613" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:30.524180" elapsed="0.000977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.526408" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:30.525295" elapsed="0.001144"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:30.526511" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:30.519756" elapsed="0.006896"/>
</kw>
<msg time="2026-05-01T00:59:30.526737" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:30.518846" elapsed="0.007943"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.527276" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.527799" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.528292" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.528483" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.528649" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.529047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.528887" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:30.528873" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.529263" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.529420" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.529594" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:30.528842" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.528732" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.529848" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.529925" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:30.530137" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:30.515392" elapsed="0.014772"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:30.530330" elapsed="0.002273"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:30.534583" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.533337" elapsed="0.001276"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:30.535568" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:30.534759" elapsed="0.000838"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:30.536079" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:30.536638" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.535746" elapsed="0.000982">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.532918" elapsed="0.003991">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:30.532685" elapsed="0.004334">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:30.537201" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:30.537058" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:30.532667" elapsed="0.004613">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.496813" elapsed="0.040654">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.495875" elapsed="0.041769">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:30.495527" elapsed="0.042222">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:30.495501" elapsed="0.042290">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:30.537842" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:30.385882" elapsed="0.152106">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.580900" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.580513" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.581760" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.581507" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:31.581930" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:31.581099" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.582515" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:31.582112" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.582861" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:31.583020" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:31.582717" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.583436" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.583193" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.584448" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.584183" elapsed="0.000328"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.584932" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.584663" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.585691" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.585319" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:31.586626" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.586235" elapsed="0.000432"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:31.586721" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:31.586881" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:31.585899" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.587052" elapsed="0.000293"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:31.585191" elapsed="0.002196"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.588135" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.587649" elapsed="0.000513"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:31.589061" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.588704" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:31.589138" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:31.589292" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:31.588343" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.589478" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:31.587522" elapsed="0.002278"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.590370" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.590049" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:31.591303" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.590946" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:31.591380" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:31.591564" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:31.590589" elapsed="0.001001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.591733" elapsed="0.000273"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:31.589922" elapsed="0.002158"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.592671" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.592323" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:31.593580" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.593211" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:31.593658" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:31.593813" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:31.592879" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.593983" elapsed="0.000276"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:31.592196" elapsed="0.002105"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.594912" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.594558" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:31.595841" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.595482" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:31.595923" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:31.596076" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:31.595121" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.596244" elapsed="0.000298"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:31.594417" elapsed="0.002167"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:31.585011" elapsed="0.011607"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:31.596662" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:31.596822" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:31.583867" elapsed="0.012981"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.583574" elapsed="0.013307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.597047" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.596907" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.583552" elapsed="0.013577"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.597752" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:31.597262" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:31.597827" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:31.579900" elapsed="0.018051"/>
</kw>
<msg time="2026-05-01T00:59:31.598006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:31.579034" elapsed="0.019020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.598557" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.599083" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.599694" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.599874" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.600041" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.600404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.600268" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:31.600253" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.600634" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.600794" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.600953" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:31.600224" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.600115" elapsed="0.000917"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.601169" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.601244" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:31.601360" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:31.574801" elapsed="0.026586"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.602858" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.602607" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:31.603016" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:31.602251" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.603348" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.603113" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.603948" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.603658" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.603429" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.603094" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.606345" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:31.604176" elapsed="0.002196"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:31.606425" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:59:31.606623" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:31.601934" elapsed="0.004721"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.607858" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:31.607665" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T00:59:31.607996" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:31.607317" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.608228" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:31.608093" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.608074" elapsed="0.000222"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.608614" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:31.608749" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:31.608433" elapsed="0.000342"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:31.609154" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.608923" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:31.609229" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:31.609385" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:31.606999" elapsed="0.002412"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.610800" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.610553" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.611228" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.610989" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:31.618598" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:31.618773" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:31.618876" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:31.613384" elapsed="0.005518"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.611337" elapsed="0.007607"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.619113" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.618970" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.611319" elapsed="0.007879"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.622815" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.620180" elapsed="0.002725"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.619971" elapsed="0.002970"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.619953" elapsed="0.003014"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.625571" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.623239" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.623023" elapsed="0.002628"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.623007" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.626221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:31.625835" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.626630" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.626319" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.627405" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.626961" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.626731" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.626301" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.628278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:31.627761" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.628857" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.628414" elapsed="0.000524"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.629617" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.629182" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.628972" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.628389" elapsed="0.001344"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:31.629932" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:31.631071" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:31.630681" elapsed="0.000426"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:31.631309" elapsed="0.003334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:31.619554" elapsed="0.015177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.634976" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:31.634828" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.634803" elapsed="0.000268"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:31.639566" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.635261" elapsed="0.004335"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:31.639649" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:31.639808" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:31.609729" elapsed="0.030106"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:31.639897" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:31.640046" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:31.552409" elapsed="0.087663"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.656519" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.656134" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.657303" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.657022" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:31.657486" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:31.656703" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.658210" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:31.657670" elapsed="0.000567"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:31.658564" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:31.658712" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:31.658411" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.659135" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:31.658892" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:31.659618" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.659318" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.660134" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:31.659841" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:31.659703" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:31.659300" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.661374" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:31.660357" elapsed="0.001047"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:31.661470" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:31.655533" elapsed="0.006067"/>
</kw>
<msg time="2026-05-01T00:59:31.661685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:31.654614" elapsed="0.007120"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.662279" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.662816" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.663308" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.663498" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.663664" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.664026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.663892" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:31.663878" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.664235" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.664391" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.664563" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:31.663849" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.663747" elapsed="0.000930"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.664816" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.664893" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:31.665105" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:31.651752" elapsed="0.013380"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:31.665298" elapsed="0.002245"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:31.669422" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.668250" elapsed="0.001217"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:31.670416" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:31.669616" elapsed="0.000829"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:31.670930" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:31.671485" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.670608" elapsed="0.000968">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.667855" elapsed="0.003891">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:31.667625" elapsed="0.004214">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:31.672016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:31.671877" elapsed="0.000194"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:31.667607" elapsed="0.004488">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.641187" elapsed="0.031079">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.640385" elapsed="0.032052">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:31.640155" elapsed="0.032402">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:31.640138" elapsed="0.032457">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:31.672647" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:31.547912" elapsed="0.124880">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.715476" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.715067" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.716353" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.716078" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:32.716546" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:32.715679" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.717151" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:32.716755" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.717508" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:32.717753" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:32.717333" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.718180" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.717931" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.719200" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.718935" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.719690" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.719400" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.720436" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.720080" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:32.721411" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.721042" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:32.721510" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:32.721675" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:32.720688" elapsed="0.001012"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.721852" elapsed="0.000293"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:32.719951" elapsed="0.002235"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.722933" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.722428" elapsed="0.000532"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:32.723870" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.723501" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:32.723947" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:32.724102" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:32.723143" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.724271" elapsed="0.000295"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:32.722303" elapsed="0.002305"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.725199" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.724874" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:32.726136" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.725770" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:32.726214" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:32.726367" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:32.725404" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.726552" elapsed="0.000283"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:32.724739" elapsed="0.002173"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.727495" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.727154" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:32.728391" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.728035" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:32.728484" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:32.728667" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:32.727702" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.728863" elapsed="0.000322"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:32.727030" elapsed="0.002199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.729838" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.729508" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:32.730784" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.730405" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:32.730866" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:32.731019" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:32.730044" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.731187" elapsed="0.000300"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:32.729347" elapsed="0.002181"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:32.719769" elapsed="0.011796"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:32.731612" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:32.731771" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:32.718617" elapsed="0.013181"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.718304" elapsed="0.013526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.731996" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.731856" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.718280" elapsed="0.013791"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.732730" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:32.732204" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:32.732808" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:32.714449" elapsed="0.018488"/>
</kw>
<msg time="2026-05-01T00:59:32.732992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:32.713594" elapsed="0.019446"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.733594" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.734106" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.734663" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.734842" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.735007" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.735360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.735226" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:32.735211" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.735592" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.735758" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.735916" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:32.735182" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.735080" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.736132" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.736206" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:32.736328" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:32.709314" elapsed="0.027040"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.737850" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.737602" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:32.738007" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:32.737227" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.738338" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.738101" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.738895" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.738603" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.738417" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.738083" elapsed="0.000894"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.741351" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:32.739117" elapsed="0.002262"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:32.741430" elapsed="0.000066"/>
</return>
<msg time="2026-05-01T00:59:32.741625" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:32.736908" elapsed="0.004742"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.742859" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:32.742665" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T00:59:32.742995" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:32.742313" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.743226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:32.743089" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.743071" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.743625" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:32.743819" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:32.743430" elapsed="0.000416"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:32.744229" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.743998" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:32.744303" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:32.744479" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:32.741996" elapsed="0.002510"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.745904" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.745657" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.746331" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.746092" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:32.753490" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:32.753658" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:32.753760" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:32.748517" elapsed="0.005270"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.746439" elapsed="0.007395"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.754005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.753860" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.746421" elapsed="0.007668"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.757818" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.755090" elapsed="0.002816"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.754872" elapsed="0.003076"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.754855" elapsed="0.003119"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.760592" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.758251" elapsed="0.002392"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.758032" elapsed="0.002646"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.758015" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.761420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:32.760884" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.761904" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.761579" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.762667" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.762229" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.762017" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.761553" elapsed="0.001232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.763523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:32.762998" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.763975" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.763659" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.764747" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.764301" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.764090" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.763634" elapsed="0.001230"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:32.765064" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:32.766173" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:32.765787" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:32.766413" elapsed="0.003320"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:32.754430" elapsed="0.015392"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.770069" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:32.769920" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.769894" elapsed="0.000272"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:32.774278" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.770358" elapsed="0.003951"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:32.774362" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:32.774545" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:32.744839" elapsed="0.029734"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:32.774637" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:32.774799" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:32.687104" elapsed="0.087721"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.791048" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.790679" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.791838" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.791564" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:32.791997" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:32.791230" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.792602" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:32.792176" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:32.792921" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:32.793070" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:32.792785" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.793506" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:32.793244" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:32.793975" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.793692" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.794516" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:32.794202" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:32.794065" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:32.793673" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.795777" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:32.794734" elapsed="0.001073"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:32.795857" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:32.790059" elapsed="0.005924"/>
</kw>
<msg time="2026-05-01T00:59:32.796066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:32.789268" elapsed="0.006846"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.796643" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.797149" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.797664" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.797848" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.798010" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.798387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.798248" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:32.798234" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.798621" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.798780" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.798934" elapsed="0.000048"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:32.798204" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.798097" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.799181" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.799257" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:32.799481" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:32.786406" elapsed="0.013103"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:32.799677" elapsed="0.003443"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:32.805053" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.803853" elapsed="0.001231"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:32.806037" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:32.805231" elapsed="0.000836"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:32.806557" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:32.807087" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.806214" elapsed="0.000962">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.803434" elapsed="0.003911">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:32.803203" elapsed="0.004236">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:32.807640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:32.807497" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:32.803184" elapsed="0.004535">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.775954" elapsed="0.031937">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.775142" elapsed="0.032918">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:32.774909" elapsed="0.033255">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:32.774891" elapsed="0.033311">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:32.808280" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:32.682298" elapsed="0.126133">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.851660" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.851236" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.852518" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.852251" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:33.852688" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:33.851858" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.904351" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:33.852869" elapsed="0.051529"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.904805" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:33.904989" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:33.904630" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.905471" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.905165" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.906554" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.906277" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.907029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.906757" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.907811" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.907434" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:33.908835" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.908420" elapsed="0.000443"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:33.908918" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:33.909103" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:33.908045" elapsed="0.001086"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.909289" elapsed="0.000333"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:33.907306" elapsed="0.002361"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.910249" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.909920" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:33.911174" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.910812" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:33.911280" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:33.911435" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:33.910472" elapsed="0.001007"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.911625" elapsed="0.000281"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:33.909786" elapsed="0.002161"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.912532" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.912187" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:33.913431" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.913073" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:33.913534" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:33.913693" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:33.912738" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.913863" elapsed="0.000310"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:33.912061" elapsed="0.002219"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.914912" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.914573" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:33.916056" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.915659" elapsed="0.000425"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:33.916134" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:33.916289" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:33.915119" elapsed="0.001196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.916477" elapsed="0.000280"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:33.914401" elapsed="0.002398"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.917369" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.917042" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:33.918307" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.917950" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:33.918384" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:33.918555" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:33.917615" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.918725" elapsed="0.000282"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:33.916916" elapsed="0.002132"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:33.907107" elapsed="0.011974"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:33.919126" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:33.919300" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:33.905945" elapsed="0.013381"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.905603" elapsed="0.013756"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.919547" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.919386" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.905579" elapsed="0.014046"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.920241" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:33.919761" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:33.920317" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:33.850518" elapsed="0.069927"/>
</kw>
<msg time="2026-05-01T00:59:33.920518" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:33.849655" elapsed="0.070918"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.921071" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.921643" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.922183" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.922358" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.922539" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.922896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.922761" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:33.922746" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.923108" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.923308" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.923483" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:33.922715" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.922614" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.923701" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.923777" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:33.923912" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:33.845442" elapsed="0.078501"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.925176" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.924921" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:33.925342" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:33.924590" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.925737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.925438" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.926278" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.925985" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.925819" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.925420" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.928940" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:33.926519" elapsed="0.002449"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:33.929021" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:33.929179" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:33.924261" elapsed="0.004944"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.930418" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:33.930223" elapsed="0.000263"/>
</kw>
<msg time="2026-05-01T00:59:33.930572" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:33.929896" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.930802" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:33.930667" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.930649" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.931196" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:33.931347" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:33.931007" elapsed="0.000367"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:33.931784" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.931547" elapsed="0.000266"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:33.931867" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:33.932028" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:33.929571" elapsed="0.002483"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.933437" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.933184" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.933901" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.933650" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:33.941105" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:33.941275" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:33.941390" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:33.936108" elapsed="0.005309"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.934014" elapsed="0.007464"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.941650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.941506" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.933995" elapsed="0.007740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.945174" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.942722" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.942509" elapsed="0.002790"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.942491" elapsed="0.002833"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.948025" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.945615" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.945380" elapsed="0.002757"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.945364" elapsed="0.002807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.948945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:33.948389" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.949400" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.949082" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.950205" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.949751" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.949538" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.949057" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.951083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:33.950558" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.951552" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.951219" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.952284" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.951876" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.951666" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.951195" elapsed="0.001205"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:33.952619" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:33.953728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:33.953318" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:33.954011" elapsed="0.003576"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:33.942079" elapsed="0.015599"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.957924" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:33.957776" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.957751" elapsed="0.000269"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:33.961880" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.958214" elapsed="0.003696"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:33.961963" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:33.962120" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:33.932357" elapsed="0.029790"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:33.962211" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:33.962362" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:33.823234" elapsed="0.139154"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.978662" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.978277" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.979487" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.979180" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:33.979651" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:33.978843" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.980212" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:33.979832" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:33.980544" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:33.980691" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:33.980392" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.981176" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:33.980867" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:33.981657" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.981356" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.982177" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:33.981881" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:33.981742" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:33.981337" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.983620" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:33.982403" elapsed="0.001247"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:33.983701" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:33.977680" elapsed="0.006150"/>
</kw>
<msg time="2026-05-01T00:59:33.983915" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:33.976899" elapsed="0.007064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.984474" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.984984" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.985500" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.985681" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.985849" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.986210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.986074" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:33.986060" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.986423" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.986599" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.986759" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:33.986030" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.985926" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.987035" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.987115" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:33.987328" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:33.974213" elapsed="0.013142"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:33.987539" elapsed="0.002239"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:33.991689" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.990505" elapsed="0.001214"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:33.992664" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:33.991866" elapsed="0.000827"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:33.993169" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:33.993726" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.992841" elapsed="0.000974">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.990091" elapsed="0.003896">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:33.989859" elapsed="0.004222">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:33.994261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:33.994119" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:33.989841" elapsed="0.004499">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.963690" elapsed="0.030837">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.962719" elapsed="0.031980">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:33.962487" elapsed="0.032314">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:33.962469" elapsed="0.032369">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:33.994918" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:33.817708" elapsed="0.177357">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.037395" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.037008" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.038303" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.038049" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:35.038490" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:35.037611" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.039098" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:35.038677" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.039422" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:35.039612" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:35.039280" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.040033" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.039789" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.041044" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.040786" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.041526" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.041242" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.042267" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.041914" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:35.043242" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.042859" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:35.043323" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:35.043505" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:35.042497" elapsed="0.001034"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.043676" elapsed="0.000300"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:35.041788" elapsed="0.002230"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.044869" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.044257" elapsed="0.000640"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:35.045793" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.045412" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:35.045870" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:35.046028" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:35.045076" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.046196" elapsed="0.000297"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:35.044133" elapsed="0.002402"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.047112" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.046789" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:35.048021" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.047664" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:35.048099" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:35.048253" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:35.047315" elapsed="0.000963"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.048420" elapsed="0.000293"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:35.046650" elapsed="0.002139"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.049355" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.049031" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:35.050264" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.049908" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:35.050342" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:35.050533" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:35.049576" elapsed="0.000983"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.050703" elapsed="0.000316"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:35.048906" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.051644" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.051302" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:35.052557" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.052185" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:35.052635" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:35.052787" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:35.051852" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.052956" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:35.051177" elapsed="0.002098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:35.041607" elapsed="0.011702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:35.053353" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:35.053527" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:35.040468" elapsed="0.013086"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.040157" elapsed="0.013429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.053755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.053613" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.040133" elapsed="0.013699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.054432" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:35.053967" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:35.054547" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:35.036382" elapsed="0.018290"/>
</kw>
<msg time="2026-05-01T00:59:35.054744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:35.035495" elapsed="0.019297"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.055279" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.055802" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.056342" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.056534" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.056704" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.057060" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.056924" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:35.056910" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.057270" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.057430" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.057607" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:35.056880" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.056778" elapsed="0.000909"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.057824" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.057900" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:35.058018" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:35.031161" elapsed="0.026883"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.059608" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.059340" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:35.059765" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:35.059009" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.060097" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.059861" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.060651" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.060342" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.060178" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.059843" elapsed="0.000891"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.063111" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:35.060876" elapsed="0.002262"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:35.063191" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:35.063346" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:35.058646" elapsed="0.004726"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.064591" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:35.064377" elapsed="0.000267"/>
</kw>
<msg time="2026-05-01T00:59:35.064729" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:35.064050" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.064959" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:35.064825" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.064806" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.065326" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:35.065478" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:35.065163" elapsed="0.000342"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:35.065882" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.065653" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:35.065956" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:35.066113" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:35.063734" elapsed="0.002405"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.067527" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.067267" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.067956" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.067717" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:35.075253" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:35.075632" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:35.075863" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:35.070133" elapsed="0.005787"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.068064" elapsed="0.007950"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.076395" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.076072" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.068047" elapsed="0.008568"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.084225" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.078848" elapsed="0.005512"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.078321" elapsed="0.006092"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.078282" elapsed="0.006189"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.088392" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.084884" elapsed="0.003601"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.084560" elapsed="0.003979"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.084535" elapsed="0.004042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.089378" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:35.088814" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.089888" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.089547" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.090715" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.090233" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.090008" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.089520" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.091630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:35.091069" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.092106" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.091773" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.092912" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.092476" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.092226" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.091747" elapsed="0.001288"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:35.093244" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:35.094416" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:35.094008" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:35.094729" elapsed="0.002369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:35.077361" elapsed="0.019801"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.097339" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:35.097232" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.097214" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:35.100851" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.097567" elapsed="0.003314"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:35.100934" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:35.101099" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:35.066438" elapsed="0.034687"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:35.101189" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:35.101340" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:35.008840" elapsed="0.092526"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.117794" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.117401" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.118663" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.118305" elapsed="0.000436">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:35.118837" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:35.117981" elapsed="0.000880"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.119606" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:35.119019" elapsed="0.000616"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:35.119933" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:35.120098" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:35.119793" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.120539" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:35.120274" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:35.121026" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.120729" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.121571" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:35.121253" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:35.121112" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:35.120709" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.122865" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:35.121797" elapsed="0.001098"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:35.122946" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:35.116798" elapsed="0.006282"/>
</kw>
<msg time="2026-05-01T00:59:35.123166" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:35.115970" elapsed="0.007246"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.123728" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.124228" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.124736" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.124920" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.125083" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.125474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.125322" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:35.125308" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.125686" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.125843" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.126000" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:35.125276" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.125167" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.126260" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.126337" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:35.126582" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:35.113222" elapsed="0.013388"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:35.126781" elapsed="0.002261"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:35.131099" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.129844" elapsed="0.001285"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:35.132086" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:35.131277" elapsed="0.000838"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:35.132622" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:35.133173" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.132265" elapsed="0.001006">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.129408" elapsed="0.004039">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:35.129123" elapsed="0.004434">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:35.133739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:35.133597" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:35.129105" elapsed="0.004712">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.102538" elapsed="0.031453">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.101709" elapsed="0.032455">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:35.101464" elapsed="0.032804">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:35.101433" elapsed="0.032873">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:35.134357" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:35.004392" elapsed="0.130153">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.184095" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.183698" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.184984" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.184725" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:36.185163" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:36.184298" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.185759" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:36.185350" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.186091" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:36.186252" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:36.185943" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.186693" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.186428" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.187760" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.187493" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.188245" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.187969" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.189020" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.188662" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:36.189980" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.189599" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:36.190062" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:36.190232" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:36.189231" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.190405" elapsed="0.000316"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:36.188532" elapsed="0.002271"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.191591" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.191048" elapsed="0.000570"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:36.192519" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.192142" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:36.192596" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:36.192750" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:36.191799" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.192919" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:36.190923" elapsed="0.002318"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.193824" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.193495" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:36.194741" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.194366" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:36.194833" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:36.194993" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:36.194033" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.195161" elapsed="0.000279"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:36.193355" elapsed="0.002203"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.196144" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.195809" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:36.197240" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.196751" elapsed="0.000529"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:36.197357" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:59:36.197620" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:36.196357" elapsed="0.001300"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.197872" elapsed="0.000417"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:36.195681" elapsed="0.002675"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.199368" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.198873" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:36.200723" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.200206" elapsed="0.000559"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:36.200836" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:59:36.201056" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:36.199702" elapsed="0.001389"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.201291" elapsed="0.000414"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:36.198640" elapsed="0.003122"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:36.188330" elapsed="0.013479"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:36.201873" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:59:36.202101" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:36.187151" elapsed="0.014985"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.186838" elapsed="0.015344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.202423" elapsed="0.000122"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.202222" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.186812" elapsed="0.015817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.203674" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:36.202932" elapsed="0.000782"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:36.203784" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:36.183017" elapsed="0.020962"/>
</kw>
<msg time="2026-05-01T00:59:36.204076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:36.181916" elapsed="0.022228"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.204827" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.205326" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.205901" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.206087" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.206257" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.206692" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.206551" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:36.206533" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.206952" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.207126" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.207283" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:36.206445" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.206335" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.207516" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.207594" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:36.207733" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:36.177215" elapsed="0.030545"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.210801" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.210499" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:36.210979" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:36.210095" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.211329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.211075" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.211910" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.211596" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.211411" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.211056" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.214412" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:36.212146" elapsed="0.002315"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:36.214516" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:36.214714" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:36.209752" elapsed="0.004999"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.216510" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:36.216217" elapsed="0.000368"/>
</kw>
<msg time="2026-05-01T00:59:36.216701" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:36.215729" elapsed="0.001005"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.217078" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:36.216847" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.216821" elapsed="0.000370"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.217661" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:36.217880" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:36.217397" elapsed="0.000519"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:36.218498" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.218137" elapsed="0.000401"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:36.218615" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:59:36.218962" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:36.215253" elapsed="0.003745"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.220799" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.220532" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.221240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.220999" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:36.229069" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:36.230829" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:36.231029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:36.223491" elapsed="0.007586"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.221349" elapsed="0.009811"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.231405" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.231198" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.221331" elapsed="0.010262"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.236915" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.233080" elapsed="0.003921"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.232737" elapsed="0.004314"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.232704" elapsed="0.004384"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.240364" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.237501" elapsed="0.002924"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.237176" elapsed="0.003299"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.237152" elapsed="0.003350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.241082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:36.240674" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.241418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.241190" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.241969" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.241671" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.241516" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.241171" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.242691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:36.242208" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.243043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.242800" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.243601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.243284" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.243125" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.242781" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:36.243829" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:36.244654" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:36.244332" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:36.244838" elapsed="0.002408"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:36.232097" elapsed="0.015214"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.247507" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:36.247382" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.247363" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:36.251309" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.247717" elapsed="0.003623"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:36.251430" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T00:59:36.251621" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:36.219444" elapsed="0.032206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:36.251717" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:36.251875" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:36.150212" elapsed="0.101691"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.269796" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.269392" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.270701" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.270323" elapsed="0.000455">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:36.270875" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:36.269989" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.271478" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:36.271060" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:36.271807" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:36.271971" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:36.271663" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.272659" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:36.272153" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:36.273182" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.272872" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.273770" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:36.273412" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:36.273271" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:36.272850" elapsed="0.001006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.275065" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:36.273998" elapsed="0.001097"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:36.275148" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:36.268781" elapsed="0.006502"/>
</kw>
<msg time="2026-05-01T00:59:36.275369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:36.267828" elapsed="0.007591"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.275941" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.276449" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.277061" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.277249" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.277418" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.277814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.277674" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:36.277660" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.278028" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.278189" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.278348" elapsed="0.000062"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:36.277629" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.277518" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.278652" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.278731" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:36.278945" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:36.264841" elapsed="0.014131"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:36.279145" elapsed="0.002273"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:36.283600" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.282195" elapsed="0.001443"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:36.285004" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:36.283805" elapsed="0.001230"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:36.285544" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:36.286144" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.285186" elapsed="0.001047">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.281757" elapsed="0.004654">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:36.281518" elapsed="0.005030">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:36.286736" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:36.286591" elapsed="0.000203"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:36.281498" elapsed="0.005319">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.253085" elapsed="0.033911">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.252233" elapsed="0.034940">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:36.251990" elapsed="0.035289">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:36.251972" elapsed="0.035347">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:36.287372" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:36.143127" elapsed="0.144415">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.334242" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.333851" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.335043" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.334781" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:37.335217" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:37.334440" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.335831" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:37.335425" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.336158" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:37.336330" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:37.336014" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.336767" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.336521" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.337781" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.337522" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.338248" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.337980" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.339017" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.338659" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:37.339978" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.339610" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:37.340059" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:37.340225" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:37.339225" elapsed="0.001026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.340398" elapsed="0.000316"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:37.338529" elapsed="0.002225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.341500" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.340997" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:37.342395" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.342042" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:37.342486" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:37.342642" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:37.341708" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.342811" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:37.340872" elapsed="0.002261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.343723" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.343383" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:37.344696" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.344318" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:37.344773" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:37.344928" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:37.343927" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.345097" elapsed="0.000274"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:37.343247" elapsed="0.002166"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.345991" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.345670" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:37.346898" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.346539" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:37.346974" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:37.347126" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:37.346193" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.347306" elapsed="0.000295"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:37.345544" elapsed="0.002099"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.348203" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.347882" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:37.349263" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.348846" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:37.349355" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:37.349557" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:37.348406" elapsed="0.001180"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.349755" elapsed="0.000315"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:37.347758" elapsed="0.002361"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:37.338328" elapsed="0.011829"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:37.350208" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:37.350400" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:37.337192" elapsed="0.013239"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.336892" elapsed="0.013592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.350692" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.350518" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.336868" elapsed="0.013908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.351549" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:37.350937" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:37.351637" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:37.333230" elapsed="0.018546"/>
</kw>
<msg time="2026-05-01T00:59:37.351836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:37.332364" elapsed="0.019526"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.352579" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.353380" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.353987" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.354204" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.354413" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.354863" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.354687" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:37.354671" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.355120" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.355326" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.355525" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:37.354638" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.354514" elapsed="0.001099"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.355770" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.355866" elapsed="0.000023"/>
</return>
<msg time="2026-05-01T00:59:37.356003" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:37.328128" elapsed="0.027907"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.357769" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.357516" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:37.357937" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:37.357135" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.358301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.358054" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.358859" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.358567" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.358381" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.358031" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.361321" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:37.359083" elapsed="0.002264"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:37.361445" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T00:59:37.361622" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:37.356757" elapsed="0.004891"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.362807" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:37.362613" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T00:59:37.362942" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:37.362265" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.363172" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:37.363036" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.363018" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.363588" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:37.363819" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:37.363405" elapsed="0.000442"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:37.364232" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.363998" elapsed="0.000260"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:37.364305" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:37.364480" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:37.361951" elapsed="0.002557"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.365878" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.365633" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.366304" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.366066" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:37.645805" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:37.646219" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:37.646529" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:37.368502" elapsed="0.278089"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.366412" elapsed="0.280276"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.647097" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.646750" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.366394" elapsed="0.280971"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.654062" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.649700" elapsed="0.004453"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.649190" elapsed="0.005014"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.649149" elapsed="0.005091"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.657951" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.654713" elapsed="0.003304"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.654320" elapsed="0.003747"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.654296" elapsed="0.003808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.658920" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:37.658335" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.659380" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.659061" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.660163" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.659736" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.659519" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.659035" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.661022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:37.660515" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.661494" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.661160" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.662232" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.661823" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.661610" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.661134" elapsed="0.001231"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:37.662588" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:37.663712" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:37.663297" elapsed="0.000452"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:37.663953" elapsed="0.003325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:37.648192" elapsed="0.019175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.667678" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:37.667489" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.667440" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:37.671611" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.667909" elapsed="0.003763"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:37.671728" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:37.671892" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:37.364816" elapsed="0.307102"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:37.671983" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:37.672136" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:37.305917" elapsed="0.366245"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.688662" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.688253" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.689519" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.689204" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:37.689686" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:37.688858" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.690440" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:37.689865" elapsed="0.000624"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:37.690784" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:37.690946" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:37.690647" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.691365" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:37.691121" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:37.691866" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.691577" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.692386" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:37.692089" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:37.691951" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:37.691559" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.694498" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:37.692634" elapsed="0.001940"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:37.694684" elapsed="0.000064"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:37.687566" elapsed="0.007312"/>
</kw>
<msg time="2026-05-01T00:59:37.694979" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:37.686775" elapsed="0.008264"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.695613" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.696126" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.696658" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.696861" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.697125" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.697538" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.697373" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:37.697357" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.697753" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.697913" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.698077" elapsed="0.000095"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:37.697322" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.697209" elapsed="0.001027"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.698394" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.698486" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:37.698705" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:37.684103" elapsed="0.014629"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:37.698905" elapsed="0.002309"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:37.703222" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.701944" elapsed="0.001309"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:37.704583" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:37.703400" elapsed="0.001213"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:37.705106" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:37.705732" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.704762" elapsed="0.001061">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.701541" elapsed="0.004457">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:37.701295" elapsed="0.004803">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:37.706299" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:37.706138" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:37.701277" elapsed="0.005106">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.673304" elapsed="0.033269">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.672499" elapsed="0.034250">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:37.672247" elapsed="0.034608">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:37.672230" elapsed="0.034665">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:37.706948" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:37.297924" elapsed="0.409172">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.751242" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.750851" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.752120" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.751814" elapsed="0.000381">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:38.752290" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:38.751439" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.752880" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:38.752493" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.753207" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:38.753386" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:38.753065" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.753820" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.753576" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.754827" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.754570" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.755290" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.755023" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.756066" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.755703" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:38.757002" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.756631" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:38.757082" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:38.757246" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:38.756271" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.757419" elapsed="0.000337"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:38.755574" elapsed="0.002223"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.758540" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.758038" elapsed="0.000529"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:38.759433" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.759081" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:38.759537" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:38.759696" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:38.758747" elapsed="0.000974"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.759866" elapsed="0.000312"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:38.757913" elapsed="0.002307"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.760797" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.760475" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:38.761765" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.761386" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:38.761843" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:38.761995" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:38.760999" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.762163" elapsed="0.000276"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:38.760334" elapsed="0.002163"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.763057" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.762739" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:38.764002" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.763645" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:38.764081" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:38.764233" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:38.763265" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.764400" elapsed="0.000293"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:38.762613" elapsed="0.002122"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.765294" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.764973" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:38.766222" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.765867" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:38.766301" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:38.766467" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:38.765534" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.766638" elapsed="0.000278"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:38.764848" elapsed="0.002109"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:38.755369" elapsed="0.011622"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:38.767034" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:38.767191" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:38.754239" elapsed="0.012978"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.753943" elapsed="0.013306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.767414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.767275" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.753920" elapsed="0.013610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.768149" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:38.767668" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:38.768224" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:38.750230" elapsed="0.018119"/>
</kw>
<msg time="2026-05-01T00:59:38.768403" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:38.749336" elapsed="0.019130"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.768954" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.769555" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.770051" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.770228" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.770394" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.770774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.770636" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:38.770621" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.770986" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.771145" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.771300" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:38.770592" elapsed="0.000760"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.770489" elapsed="0.000889"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.771551" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.771629" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:38.771746" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:38.744916" elapsed="0.026855"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.773293" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.772965" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:38.773512" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:38.772636" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.773850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.773611" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.774388" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.774098" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.773931" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.773593" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.776829" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:38.774633" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:38.776938" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:38.777095" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:38.772301" elapsed="0.004819"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.778266" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:38.778079" elapsed="0.000239"/>
</kw>
<msg time="2026-05-01T00:59:38.778403" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:38.777753" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.778651" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:38.778514" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.778495" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.779017" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:38.779146" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:38.778854" elapsed="0.000319"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:38.779583" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.779320" elapsed="0.000290"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:38.779657" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:38.779810" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:38.777417" elapsed="0.002418"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.781193" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.780948" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.781638" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.781382" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:38.789381" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:38.789592" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:38.789702" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:38.783828" elapsed="0.005900"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.781746" elapsed="0.008024"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.789940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.789796" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.781728" elapsed="0.008334"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.793700" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.791067" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.790852" elapsed="0.002943"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.790834" elapsed="0.002987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.796618" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.794096" elapsed="0.002588"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.793877" elapsed="0.002857"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.793861" elapsed="0.002908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.797547" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:38.796992" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.798003" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.797687" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.798762" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.798327" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.798116" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.797662" elapsed="0.001218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.799628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:38.799091" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.800072" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.799762" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.800826" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.800393" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.800184" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.799738" elapsed="0.001202"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:38.801138" elapsed="0.000497"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:38.802238" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:38.801853" elapsed="0.000421"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:38.802497" elapsed="0.003129"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:38.790410" elapsed="0.015279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.805863" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:38.805758" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.805740" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:38.809571" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.806068" elapsed="0.003564"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:38.809688" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:38.809851" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:38.780136" elapsed="0.029742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:38.809942" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:38.810097" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:38.722370" elapsed="0.087754"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.827563" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.827150" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.828346" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.828070" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:38.828533" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:38.827748" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.829099" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:38.828716" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:38.829416" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:38.829578" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:38.829280" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.829997" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:38.829754" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:38.830484" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.830186" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.831000" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:38.830706" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:38.830569" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:38.830167" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.832266" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:38.831221" elapsed="0.001074"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:38.832346" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:38.826548" elapsed="0.005941"/>
</kw>
<msg time="2026-05-01T00:59:38.832574" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:38.825756" elapsed="0.006867"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.833105" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.833626" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.834117" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.834292" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.834470" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.834829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.834695" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:38.834681" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.835039" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.835198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.835365" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:38.834651" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.834548" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.835637" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.835713" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:38.835924" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:38.821712" elapsed="0.014239"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:38.836117" elapsed="0.002383"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:38.840433" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.839215" elapsed="0.001264"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:38.841785" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:38.840629" elapsed="0.001185"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:38.842292" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:38.842894" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.841961" elapsed="0.001019">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.838813" elapsed="0.004338">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:38.838582" elapsed="0.004664">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:38.843438" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:38.843297" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:38.838563" elapsed="0.004971">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.811240" elapsed="0.032469">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.810437" elapsed="0.033443">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:38.810207" elapsed="0.033776">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:38.810190" elapsed="0.033831">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:38.844072" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:38.717474" elapsed="0.126742">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.887284" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.886891" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.888078" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.887822" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:39.888249" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:39.887495" elapsed="0.000779"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.888860" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:39.888445" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.889222" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:39.889392" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:39.889076" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.889842" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.889589" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.890898" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.890612" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.891400" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.891115" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.892182" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.891815" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:39.893164" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.892762" elapsed="0.000429"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:39.893245" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:39.893410" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:39.892392" elapsed="0.001046"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.893611" elapsed="0.000302"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:39.891684" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.894549" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.894200" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:39.895492" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.895102" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:39.895571" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:39.895726" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:39.894761" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.895897" elapsed="0.000294"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:39.894073" elapsed="0.002160"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.897000" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.896489" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:39.897987" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.897629" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:39.898063" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:39.898216" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:39.897208" elapsed="0.001033"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.898387" elapsed="0.000315"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:39.896347" elapsed="0.002399"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.899314" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.898988" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:39.900255" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.899885" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:39.900332" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:39.900505" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:39.899548" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.900677" elapsed="0.000314"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:39.898862" elapsed="0.002177"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.901667" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.901298" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:39.902616" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.902239" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:39.902695" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:39.902850" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:39.901875" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.903017" elapsed="0.000293"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:39.901170" elapsed="0.002183"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:39.891498" elapsed="0.011889"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:39.903429" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T00:59:39.903609" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:39.890266" elapsed="0.013370"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.889969" elapsed="0.013699"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.903836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.903695" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.889945" elapsed="0.013983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.904567" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:39.904068" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:39.904642" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:39.886275" elapsed="0.018493"/>
</kw>
<msg time="2026-05-01T00:59:39.904831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:39.885409" elapsed="0.019500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.905406" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.906014" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.906529" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.906709" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.906874" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.907229" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.907093" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:39.907079" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.907441" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.907625" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.907783" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:39.907051" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.906947" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.908001" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.908075" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:39.908194" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:39.881012" elapsed="0.027208"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.909558" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.909229" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:39.909723" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:39.908890" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.910296" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.910022" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.910957" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.910609" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.910396" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.909802" elapsed="0.001240"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.913494" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:39.911190" elapsed="0.002332"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:39.913615" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:39.913776" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:39.908550" elapsed="0.005251"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.914949" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:39.914756" elapsed="0.000245"/>
</kw>
<msg time="2026-05-01T00:59:39.915087" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:39.914414" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.915318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:39.915181" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.915163" elapsed="0.000222"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.915702" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:39.915838" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:39.915538" elapsed="0.000326"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:39.916240" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.916011" elapsed="0.000255"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:39.916314" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:39.916485" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:39.914101" elapsed="0.002411"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.917911" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.917662" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.918346" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.918103" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:39.927101" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:39.927311" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:39.927440" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:39.920567" elapsed="0.006923"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.918471" elapsed="0.009063"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.927710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.927560" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.918438" elapsed="0.009392"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.931358" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.928864" elapsed="0.002554"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.928622" elapsed="0.002845"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.928604" elapsed="0.002891"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.934777" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.931766" elapsed="0.003078"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.931552" elapsed="0.003341"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.931535" elapsed="0.003393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.935740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:39.935147" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.936203" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.935882" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.937011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.936557" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.936318" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.935855" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.937892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:39.937349" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.938348" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.938029" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.939116" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.938702" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.938486" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.938004" elapsed="0.001230"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:39.939430" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:39.940573" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:39.940159" elapsed="0.000451"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:39.940846" elapsed="0.003302"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:39.928182" elapsed="0.016057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.944510" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:39.944338" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.944312" elapsed="0.000296"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:39.948602" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.944866" elapsed="0.003798"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:39.948722" elapsed="0.000053"/>
</return>
<msg time="2026-05-01T00:59:39.948909" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:39.916813" elapsed="0.032123"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:39.949000" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:39.949153" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:39.858422" elapsed="0.090757"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.965510" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.965124" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.966294" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.966017" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:39.966477" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:39.965694" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.967047" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:39.966665" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:39.967361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:39.967528" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:39.967227" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.968102" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:39.967706" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:39.968595" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.968289" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.969162" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:39.968860" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:39.968680" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:39.968271" elapsed="0.000977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.970483" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:39.969388" elapsed="0.001127"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:39.970567" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:39.964503" elapsed="0.006194"/>
</kw>
<msg time="2026-05-01T00:59:39.970783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:39.963727" elapsed="0.007105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.971321" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.971848" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.972350" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.972546" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.972734" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.973128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.972989" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:39.972974" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.973350" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.973536" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.973698" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:39.972943" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.972823" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.973958" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.974036" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T00:59:39.974251" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:39.961080" elapsed="0.013199"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:39.974448" elapsed="0.002298"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:39.978703" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.977479" elapsed="0.001254"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:39.980075" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:39.978883" elapsed="0.001222"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:39.980617" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:39.981253" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.980257" elapsed="0.001085">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.977064" elapsed="0.004474">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:39.976830" elapsed="0.004806">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:39.981818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:39.981676" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:39.976811" elapsed="0.005088">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.950348" elapsed="0.031741">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.949525" elapsed="0.032780">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:39.949265" elapsed="0.033149">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:39.949248" elapsed="0.033238">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:39.982546" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:39.853728" elapsed="0.128973">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.026993" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.026599" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.027821" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.027546" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:41.027991" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:41.027199" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.028575" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:41.028174" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.028899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:41.029136" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:41.028756" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.029580" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.029313" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.030619" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.030318" elapsed="0.000347"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.031084" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.030816" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.031845" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.031484" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:41.032779" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.032382" elapsed="0.000424"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:41.032865" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:41.033030" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:41.032047" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.033209" elapsed="0.000323"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:41.031339" elapsed="0.002234"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.034300" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.033814" elapsed="0.000512"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:41.035251" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.034889" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:41.035328" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:41.035496" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:41.034523" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.035666" elapsed="0.000277"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:41.033690" elapsed="0.002295"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.036557" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.036222" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:41.037538" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.037147" elapsed="0.000418"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:41.037614" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:41.037767" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:41.036759" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.037934" elapsed="0.000274"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:41.036098" elapsed="0.002152"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.038842" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.038504" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:41.039752" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.039379" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:41.039828" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:41.039980" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:41.039045" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.040146" elapsed="0.000275"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:41.038364" elapsed="0.002113"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.041036" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.040717" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:41.041956" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.041604" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:41.042032" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:41.042183" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:41.041237" elapsed="0.000971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.042350" elapsed="0.000304"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:41.040593" elapsed="0.002103"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:41.031162" elapsed="0.011567"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:41.042772" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:41.042931" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:41.029999" elapsed="0.012958"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.029705" elapsed="0.013290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.043168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.043026" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.029681" elapsed="0.013564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.043877" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:41.043381" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:41.043953" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:41.025968" elapsed="0.018109"/>
</kw>
<msg time="2026-05-01T00:59:41.044131" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:41.025081" elapsed="0.019103"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.044687" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.045225" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.045789" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.045967" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.046129" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.046503" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.046348" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:41.046333" elapsed="0.000286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.046753" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.046913" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.047068" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:41.046305" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.046203" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.047287" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.047363" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:41.047495" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:41.020796" elapsed="0.026726"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.048951" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.048717" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:41.049108" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:41.048366" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.049439" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.049203" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.050040" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.049753" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.049582" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.049184" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.052512" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:41.050270" elapsed="0.002269"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:41.052623" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:41.052781" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:41.048050" elapsed="0.004756"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.053952" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:41.053766" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T00:59:41.054088" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:41.053416" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.054324" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:41.054189" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.054168" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.054725" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:41.054852" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:41.054559" elapsed="0.000319"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:41.055256" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.055025" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:41.055330" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:41.055504" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:41.053102" elapsed="0.002429"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.056890" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.056646" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.057314" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.057077" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:41.064574" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:41.065795" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:41.065906" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:41.059513" elapsed="0.006419"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.057422" elapsed="0.008552"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.066145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.065999" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.057404" elapsed="0.008859"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.069881" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.067269" elapsed="0.002671"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.067057" elapsed="0.002918"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.067040" elapsed="0.002960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.073198" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.070270" elapsed="0.002993"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.070055" elapsed="0.003258"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.070039" elapsed="0.003310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.074134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:41.073588" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.074625" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.074277" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.075363" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.074951" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.074741" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.074252" elapsed="0.001251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.076214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:41.075715" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.076679" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.076347" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.077406" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.077002" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.076793" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.076323" elapsed="0.001221"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:41.077743" elapsed="0.000479"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:41.078861" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:41.078441" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:41.079102" elapsed="0.003236"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:41.066639" elapsed="0.015786"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.082730" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:41.082580" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.082553" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:41.086653" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.083019" elapsed="0.003695"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:41.086770" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:41.086931" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:41.055832" elapsed="0.031126"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:41.087021" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:41.087171" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:40.998136" elapsed="0.089060"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.103226" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.102857" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.104022" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.103745" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:41.104185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:41.103407" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.104933" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:41.104368" elapsed="0.000593"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:41.105253" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:41.105393" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:41.105118" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.105829" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:41.105587" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:41.106303" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.106020" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.106864" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:41.106568" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:41.106386" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:41.106001" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.108108" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:41.107084" elapsed="0.001053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:41.108188" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:41.102238" elapsed="0.006077"/>
</kw>
<msg time="2026-05-01T00:59:41.108398" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:41.101479" elapsed="0.006967"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.108940" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.109431" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.109945" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.110120" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.110281" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.110683" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.110548" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:41.110534" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.110893" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.111049" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.111204" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:41.110502" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.110356" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.111475" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.111555" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:41.111766" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:41.098884" elapsed="0.012909"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:41.111960" elapsed="0.002228"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:41.116086" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.114921" elapsed="0.001195"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:41.117398" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:41.116261" elapsed="0.001166"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:41.117918" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:41.118558" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.117590" elapsed="0.001055">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.114524" elapsed="0.004295">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:41.114268" elapsed="0.004646">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:41.119094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:41.118953" elapsed="0.000196"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:41.114249" elapsed="0.004923">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.088316" elapsed="0.031047">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:41.087531" elapsed="0.032023">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:41.087280" elapsed="0.032381">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:41.087263" elapsed="0.032437">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:41.119753" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:40.991989" elapsed="0.127912">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.161025" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.160626" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.161996" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.161730" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:42.162171" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:42.161232" elapsed="0.000964"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.162794" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:42.162355" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.163125" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:42.163295" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:42.162980" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.163736" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.163487" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.164809" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.164542" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.165285" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.165008" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.166064" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.165696" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:42.167019" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.166640" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:42.167101" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:42.167269" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:42.166274" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.167441" elapsed="0.000319"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:42.165567" elapsed="0.002234"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.168380" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.168047" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:42.169518" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.169139" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:42.169597" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:42.169751" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:42.168797" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.169920" elapsed="0.000281"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:42.167920" elapsed="0.002327"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.170868" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.170532" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:42.171858" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.171500" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:42.171935" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:42.172089" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:42.171077" elapsed="0.001037"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.172258" elapsed="0.000306"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:42.170363" elapsed="0.002243"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.173171" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.172847" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:42.174083" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.173728" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:42.174161" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:42.174315" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:42.173378" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.174499" elapsed="0.000287"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:42.172722" elapsed="0.002107"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.175436" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.175098" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:42.176382" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.176027" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:42.176474" elapsed="0.000072"/>
</return>
<msg time="2026-05-01T00:59:42.176672" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:42.175688" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.176839" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:42.174945" elapsed="0.002214"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:42.165365" elapsed="0.011828"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:42.177236" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:42.177398" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:42.164176" elapsed="0.013249"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.163864" elapsed="0.013608"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.177651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.177503" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.163839" elapsed="0.013890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.178465" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:42.177871" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:42.178547" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:42.159977" elapsed="0.018703"/>
</kw>
<msg time="2026-05-01T00:59:42.178736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:42.159026" elapsed="0.019763"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.179312" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.179948" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.180447" elapsed="0.000069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.180674" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.180845" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.181213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.181074" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:42.181058" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.181427" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.181605" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.181762" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:42.181026" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.180922" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.181978" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.182052" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:42.182173" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:42.154645" elapsed="0.027554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.183813" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.183537" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:42.183983" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:42.183120" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.184321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.184079" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.184919" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.184618" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.184402" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.184060" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.187418" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:42.185151" elapsed="0.002294"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:42.187558" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:42.187721" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:42.182534" elapsed="0.005212"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.188948" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:42.188755" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T00:59:42.189087" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:42.188371" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.189320" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:42.189182" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.189163" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.189716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:42.189873" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:42.189540" elapsed="0.000360"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:42.190302" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.190048" elapsed="0.000283"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:42.190384" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:42.190572" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:42.188053" elapsed="0.002545"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.191989" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.191735" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.192419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.192178" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:42.201325" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:42.201566" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:42.201716" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:42.194674" elapsed="0.007071"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.192561" elapsed="0.009236"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.202017" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.201830" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.192542" elapsed="0.009633"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.209058" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.203318" elapsed="0.005917"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.203072" elapsed="0.006268"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.203052" elapsed="0.006363"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.215756" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.210218" elapsed="0.005645"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.209615" elapsed="0.006329"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.209562" elapsed="0.006440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.217321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:42.216406" elapsed="0.000944"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.217677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.217424" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.218227" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.217920" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.217761" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.217405" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.218856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:42.218483" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.219181" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.218955" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.219735" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.219421" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.219269" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.218936" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:42.219970" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:42.220850" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:42.220535" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:42.221027" elapsed="0.002387"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:42.202592" elapsed="0.020912"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.223696" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:42.223580" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.223561" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:42.227573" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.223911" elapsed="0.003752"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:42.227720" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:42.227897" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:42.190905" elapsed="0.037019"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:42.227992" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:42.228148" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:42.132190" elapsed="0.095984"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.244599" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.244191" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.245426" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.245105" elapsed="0.000423">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:42.245624" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:42.244782" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.246193" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:42.245807" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:42.246691" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:42.246863" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:42.246374" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.247287" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:42.247041" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:42.247813" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.247521" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.248332" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:42.248034" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:42.247896" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:42.247502" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.249630" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:42.248587" elapsed="0.001073"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:42.249711" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:42.243584" elapsed="0.006257"/>
</kw>
<msg time="2026-05-01T00:59:42.249927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:42.242782" elapsed="0.007194"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.250492" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.250998" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.251509" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.251689" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.251854" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.252230" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.252094" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:42.252080" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.252492" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.252658" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.252815" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:42.252049" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.251935" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.253073" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.253151" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T00:59:42.253367" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:42.239972" elapsed="0.013423"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:42.253579" elapsed="0.002257"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:42.257769" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.256594" elapsed="0.001206"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:42.259090" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:42.257947" elapsed="0.001173"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:42.259618" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:42.260224" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.259267" elapsed="0.001044">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.256151" elapsed="0.004369">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:42.255918" elapsed="0.004699">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:42.260799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:42.260657" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:42.255899" elapsed="0.004979">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.229403" elapsed="0.031651">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.228572" elapsed="0.032663">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:42.228260" elapsed="0.033081">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:42.228242" elapsed="0.033137">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:42.261431" elapsed="0.000015"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:42.126106" elapsed="0.135490">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.308040" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.307620" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.308911" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.308610" elapsed="0.000386">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:43.309094" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:43.308257" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.309693" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:43.309280" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.310027" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:43.310237" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:43.309878" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.310753" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.310426" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.311853" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.311584" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.312332" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.312056" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.313134" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.312749" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:43.314096" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.313716" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:43.314179" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T00:59:43.314351" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:43.313349" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.314542" elapsed="0.000351"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:43.312616" elapsed="0.002320"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.315733" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.315184" elapsed="0.000577"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:43.316668" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.316287" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:43.316747" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:43.316901" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:43.315946" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.317075" elapsed="0.000330"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:43.315056" elapsed="0.002392"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.318072" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.317710" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:43.319128" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.318761" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:43.319206" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:43.319362" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:43.318291" elapsed="0.001096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.319547" elapsed="0.000286"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:43.317583" elapsed="0.002295"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.320446" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.320118" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:43.321429" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.321013" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:43.321537" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T00:59:43.321735" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:43.320672" elapsed="0.001094"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.321946" elapsed="0.000340"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:43.319992" elapsed="0.002345"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.323109" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.322696" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:43.324148" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.323784" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:43.324228" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:43.324386" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:43.323392" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.324600" elapsed="0.000297"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:43.322517" elapsed="0.002424"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:43.312413" elapsed="0.012563"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:43.325021" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:43.325188" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:43.311232" elapsed="0.013983"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.310890" elapsed="0.014360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.325425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.325279" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.310863" elapsed="0.014716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.326226" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:43.325720" elapsed="0.000534"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:43.326302" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:43.306978" elapsed="0.019452"/>
</kw>
<msg time="2026-05-01T00:59:43.326533" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:43.305972" elapsed="0.020615"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.327138" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.327713" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.328252" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.328433" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.328640" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.329033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.328894" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:43.328879" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.329256" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.329415" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.329592" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:43.328845" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.328715" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.329813" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.329890" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:43.330014" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:43.301169" elapsed="0.028871"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.331595" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.331314" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:43.331769" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:43.330975" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.332104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.331865" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.332708" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.332387" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.332187" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.331846" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.335187" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:43.332935" elapsed="0.002285"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:43.335306" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:43.335487" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:43.330645" elapsed="0.004869"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.336693" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:43.336482" elapsed="0.000268"/>
</kw>
<msg time="2026-05-01T00:59:43.336837" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:43.336138" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.337073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:43.336933" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.336914" elapsed="0.000228"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.337445" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:43.337610" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:43.337279" elapsed="0.000357"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:43.338020" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.337784" elapsed="0.000263"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:43.338094" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:43.338251" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:43.335821" elapsed="0.002455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.339702" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.339436" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.340133" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.339892" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:43.347929" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:43.348226" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:43.348384" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:43.342694" elapsed="0.005727"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.340259" elapsed="0.008245"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.348753" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.348542" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.340240" elapsed="0.008713"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.354474" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.350540" elapsed="0.004057"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.350206" elapsed="0.004444"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.350180" elapsed="0.004507"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.358547" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.355110" elapsed="0.003543"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.354771" elapsed="0.003933"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.354746" elapsed="0.003996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.359522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:43.359005" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.359893" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.359627" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.360490" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.360157" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.359990" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.359608" elapsed="0.000972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.361142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:43.360745" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.361513" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.361256" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.362067" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.361751" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.361598" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.361237" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:43.362299" elapsed="0.000393"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:43.363164" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:43.362863" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:43.363338" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:43.349583" elapsed="0.016194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.365971" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:43.365859" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.365840" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:43.369765" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.366183" elapsed="0.003648"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:43.369889" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:43.370057" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:43.338628" elapsed="0.031456"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:43.370151" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:43.370309" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:43.278014" elapsed="0.092322"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.389755" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.389197" elapsed="0.000610"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.391076" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.390619" elapsed="0.000566">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:43.391290" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:43.390047" elapsed="0.001267"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.392152" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:43.391534" elapsed="0.000648"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:43.392535" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:43.392712" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:43.392348" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.393205" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:43.392891" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:43.393786" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.393471" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.394405" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:43.394055" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:43.393908" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:43.393428" elapsed="0.001109"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.395809" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:43.394681" elapsed="0.001159"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:43.395893" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:43.388196" elapsed="0.007831"/>
</kw>
<msg time="2026-05-01T00:59:43.396113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:43.387058" elapsed="0.009105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.396701" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.397212" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.397753" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.397938" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.398105" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.398514" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.398344" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:43.398329" elapsed="0.000313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.398807" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.398971" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.399129" elapsed="0.000093"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:43.398298" elapsed="0.000960"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.398185" elapsed="0.001102"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.399427" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.399523" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:43.399773" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:43.383274" elapsed="0.016529"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:43.399980" elapsed="0.002306"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:43.404316" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.403112" elapsed="0.001235"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:43.405680" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:43.404512" elapsed="0.001198"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:43.406231" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:43.406896" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.405859" elapsed="0.001126">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.402693" elapsed="0.004468">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:43.402371" elapsed="0.004885">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:43.407440" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:43.407296" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:43.402351" elapsed="0.005184">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.371613" elapsed="0.036103">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.370768" elapsed="0.037124">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:43.370424" elapsed="0.037573">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:43.370406" elapsed="0.037631">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:43.408089" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:43.272341" elapsed="0.135901">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.453259" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.452831" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.454094" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.453833" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:44.454281" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:44.453502" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.454886" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:44.454497" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.455210" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:44.455376" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:44.455068" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.455814" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.455568" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.456825" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.456563" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.457333" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.457060" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.458096" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.457738" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:44.459037" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.458663" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:44.459117" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:44.459278" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:44.458303" elapsed="0.001001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.459449" elapsed="0.000361"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:44.457607" elapsed="0.002246"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.460599" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.460097" elapsed="0.000529"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:44.461544" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.461169" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:44.461621" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:44.461775" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:44.460805" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.461944" elapsed="0.000281"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:44.459971" elapsed="0.002296"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.462845" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.462521" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:44.463816" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.463438" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:44.463893" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:44.464045" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:44.463050" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.464214" elapsed="0.000329"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:44.462381" elapsed="0.002204"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.465186" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.464824" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:44.466138" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.465777" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:44.466215" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:44.466367" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:44.465426" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.466549" elapsed="0.000279"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:44.464700" elapsed="0.002171"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.467428" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.467109" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:44.468349" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.467998" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:44.468426" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:59:44.468596" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:44.467668" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.468761" elapsed="0.000326"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:44.466985" elapsed="0.002145"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:44.457411" elapsed="0.011753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:44.469208" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:44.469370" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:44.456230" elapsed="0.013166"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.455938" elapsed="0.013490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.469617" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.469472" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.455915" elapsed="0.013784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.470340" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:44.469854" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:44.470415" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:44.452200" elapsed="0.018357"/>
</kw>
<msg time="2026-05-01T00:59:44.470612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:44.451226" elapsed="0.019436"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.471150" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.471797" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.472307" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.472512" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.472679" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.473045" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.472895" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:44.472881" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.473258" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.473417" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.473589" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:44.472853" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.472751" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.473803" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.473877" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:44.473994" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:44.446871" elapsed="0.027148"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.476985" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.476718" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:44.477147" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:44.476366" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.477499" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.477242" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.478042" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.477752" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.477582" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.477223" elapsed="0.000902"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.480689" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:44.478268" elapsed="0.002449"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:44.480816" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:44.481033" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:44.476044" elapsed="0.005016"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.482249" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:44.482053" elapsed="0.000250"/>
</kw>
<msg time="2026-05-01T00:59:44.482388" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:44.481720" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.482663" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:44.482515" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.482489" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.483040" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:44.483193" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:44.482872" elapsed="0.000348"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:44.483645" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.483368" elapsed="0.000304"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:44.483721" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:44.483880" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:44.481378" elapsed="0.002528"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.485363" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.485107" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.485822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.485572" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:44.495593" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:44.495801" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:44.495940" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:44.488263" elapsed="0.007704"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.485954" elapsed="0.010061"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.496208" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.496045" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.485934" elapsed="0.010414"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.500248" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.497524" elapsed="0.002786"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.497284" elapsed="0.003061"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.497265" elapsed="0.003106"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.503889" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.500668" elapsed="0.003286"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.500429" elapsed="0.003575"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.500412" elapsed="0.003627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.504861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:44.504280" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.505394" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.505033" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.506253" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.505752" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.505534" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.505007" elapsed="0.001393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.507196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:44.506639" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.507684" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.507337" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.508593" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.508045" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.507816" elapsed="0.000868"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.507312" elapsed="0.001403"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:44.508986" elapsed="0.000594"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:44.510274" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:44.509834" elapsed="0.000478"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:44.510590" elapsed="0.003297"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:44.496803" elapsed="0.017157"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.514150" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:44.514035" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.514016" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:44.518712" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.514363" elapsed="0.004483"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:44.518924" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T00:59:44.519151" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:44.484216" elapsed="0.034971"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:44.519273" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:44.519495" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:44.424152" elapsed="0.095378"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.537972" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.537564" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.538881" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.538516" elapsed="0.000470">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:44.539088" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:44.538167" elapsed="0.000947"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.539693" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:44.539276" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:44.540033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:44.540209" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:44.539887" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.540913" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:44.540388" elapsed="0.000661"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:44.541435" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.541128" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.542008" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:44.541684" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:44.541542" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:44.541106" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.543330" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:44.542236" elapsed="0.001124"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:44.543413" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:44.536933" elapsed="0.006633"/>
</kw>
<msg time="2026-05-01T00:59:44.543651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:44.536007" elapsed="0.007694"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.544210" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.544743" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.545291" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.545490" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.545660" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.546059" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.545917" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:44.545902" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.546280" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.546441" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.546623" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:44.545869" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.545743" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.546899" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.546981" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:44.547197" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:44.533026" elapsed="0.014198"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:44.547396" elapsed="0.002361"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:44.551791" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.550513" elapsed="0.001317"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:44.553367" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:44.551986" elapsed="0.001413"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:44.553979" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:44.554610" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.553573" elapsed="0.001127">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.550089" elapsed="0.004830">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:44.549850" elapsed="0.005173">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:44.555209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:44.555063" elapsed="0.000202"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:44.549830" elapsed="0.005459">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.520975" elapsed="0.034516">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.519968" elapsed="0.035702">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:44.519641" elapsed="0.036137">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:44.519619" elapsed="0.036198">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:44.555884" elapsed="0.000023"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:44.417941" elapsed="0.138106">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.607830" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.607394" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.608649" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.608363" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:45.608824" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:45.608034" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.609397" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:45.609010" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.609747" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:45.609917" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:45.609596" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.610356" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.610107" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.611408" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.611143" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.611908" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.611636" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.612682" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.612307" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:45.613625" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.613226" elapsed="0.000425"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:45.613706" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:45.613875" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:45.612888" elapsed="0.001012"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.614049" elapsed="0.000304"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:45.612176" elapsed="0.002218"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.615168" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.614657" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:45.616118" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.615759" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:45.616195" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:45.616347" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:45.615375" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.616530" elapsed="0.000281"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:45.614530" elapsed="0.002323"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.617415" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.617092" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:45.618383" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.618026" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:45.618487" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:45.618644" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:45.617636" elapsed="0.001033"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.618812" elapsed="0.000275"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:45.616967" elapsed="0.002162"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.619746" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.619367" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:45.620657" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.620283" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:45.620735" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:45.620889" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:45.619951" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.621055" elapsed="0.000280"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:45.619242" elapsed="0.002134"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.621959" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.621632" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:45.622883" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.622528" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:45.622958" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:45.623108" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:45.622164" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.623275" elapsed="0.000349"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:45.621505" elapsed="0.002161"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:45.611990" elapsed="0.011709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:45.623742" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:45.623902" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:45.610821" elapsed="0.013107"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.610501" elapsed="0.013459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.624128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.623987" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.610473" elapsed="0.013732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.624834" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:45.624342" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:45.624908" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:45.606766" elapsed="0.018266"/>
</kw>
<msg time="2026-05-01T00:59:45.625086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:45.605785" elapsed="0.019348"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.625639" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.626196" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.626764" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.626944" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.627108" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.627511" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.627329" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:45.627315" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.627726" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.627884" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.628041" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:45.627286" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.627182" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.628256" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.628332" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:45.628448" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:45.601216" elapsed="0.027273"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.629928" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.629687" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:45.630084" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:45.629339" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.630418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.630179" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.631023" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.630734" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.630562" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.630160" elapsed="0.000947"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.633608" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:45.631251" elapsed="0.002384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:45.633727" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:45.633889" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:45.629019" elapsed="0.004895"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.635067" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:45.634875" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T00:59:45.635204" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:45.634547" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.635477" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:45.635299" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.635280" elapsed="0.000273"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.635853" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:45.635987" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:45.635689" elapsed="0.000325"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:45.636395" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.636163" elapsed="0.000259"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:45.636485" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:45.636643" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:45.634215" elapsed="0.002454"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.638028" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.637784" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.638468" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.638216" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:45.645962" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:45.647185" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:45.647297" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:45.640652" elapsed="0.006672"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.638578" elapsed="0.008804"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.647571" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.647410" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.638560" elapsed="0.009130"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.651304" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.648698" elapsed="0.002705"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.648482" elapsed="0.002963"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.648463" elapsed="0.003028"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.654826" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.651763" elapsed="0.003127"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.651548" elapsed="0.003390"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.651532" elapsed="0.003441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.655762" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:45.655188" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.656221" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.655902" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.657032" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.656611" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.656360" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.655876" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.657894" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:45.657364" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.658344" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.658030" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.659098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.658690" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.658477" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.658005" elapsed="0.001208"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:45.659437" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:45.660561" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:45.660152" elapsed="0.000445"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:45.660800" elapsed="0.003276"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:45.648039" elapsed="0.016125"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.664396" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:45.664262" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.664236" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:45.668152" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.664626" elapsed="0.003615"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:45.668298" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:45.668476" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:45.636970" elapsed="0.031535"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:45.668571" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:45.668725" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:45.572128" elapsed="0.096623"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.684956" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.684587" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.685736" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.685471" elapsed="0.000329">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:45.685892" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:45.685137" elapsed="0.000779"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.686634" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:45.686070" elapsed="0.000592"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:45.686956" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:45.687091" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:45.686819" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.687548" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:45.687268" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:45.688020" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.687736" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.688556" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:45.688241" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:45.688104" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:45.687717" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.689813" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:45.688782" elapsed="0.001061"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:45.689894" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:45.683975" elapsed="0.006047"/>
</kw>
<msg time="2026-05-01T00:59:45.690105" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:45.683138" elapsed="0.007015"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.690655" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.691154" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.691685" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.691863" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.692027" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.692374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.692241" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:45.692227" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.692609" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.692767" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.692924" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:45.692199" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.692099" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.693176" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.693254" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:45.693488" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:45.680546" elapsed="0.012970"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:45.693686" elapsed="0.002256"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:45.697821" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.696662" elapsed="0.001189"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:45.699132" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:45.697996" elapsed="0.001166"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:45.699692" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:45.700293" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.699323" elapsed="0.001055">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.696251" elapsed="0.004318">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:45.696023" elapsed="0.004641">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:45.700843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:45.700703" elapsed="0.000195"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:45.696004" elapsed="0.004918">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.669894" elapsed="0.031202">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.669087" elapsed="0.032182">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:45.668836" elapsed="0.032537">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:45.668819" elapsed="0.032593">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:45.701478" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:45.566654" elapsed="0.134972">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.751503" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.750800" elapsed="0.000763"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.752906" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.752450" elapsed="0.000585">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:46.753201" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:46.751860" elapsed="0.001385"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.754256" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:46.753554" elapsed="0.000752"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.754871" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:46.755133" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:46.754620" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.755925" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.755482" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.757783" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.757282" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.758703" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.758176" elapsed="0.000575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.760042" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.759398" elapsed="0.000692"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:46.761513" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.761028" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:46.761596" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:59:46.761772" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:46.760431" elapsed="0.001367"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.761948" elapsed="0.000355"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:46.759159" elapsed="0.003187"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.763288" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.762644" elapsed="0.000673"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:46.764231" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.763865" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:46.764310" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:46.764490" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:46.763521" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.764665" elapsed="0.000301"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:46.762484" elapsed="0.002525"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.765606" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.765254" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:46.766610" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.766225" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:46.766688" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:46.766843" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:46.765814" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.767011" elapsed="0.000280"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:46.765125" elapsed="0.002214"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.767926" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.767599" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:46.768845" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.768485" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:46.768923" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:46.769079" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:46.768133" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.769248" elapsed="0.000314"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:46.767470" elapsed="0.002135"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.770187" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.769847" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:46.771097" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.770747" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:46.771174" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:46.771328" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:46.770393" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.771510" elapsed="0.000280"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:46.769720" elapsed="0.002112"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:46.758843" elapsed="0.013023"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:46.771912" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:46.772073" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:46.756717" elapsed="0.015382"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.756154" elapsed="0.015977"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.772309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.772161" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.756110" elapsed="0.016276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.773043" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:46.772542" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:46.773119" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:46.749164" elapsed="0.024081"/>
</kw>
<msg time="2026-05-01T00:59:46.773300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:46.746703" elapsed="0.026649"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.773922" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.774513" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.775014" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.775192" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.775358" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.775739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.775602" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:46.775586" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.775951" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.776110" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.776267" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:46.775554" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.775433" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.776497" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.776574" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:46.776695" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:46.739438" elapsed="0.037282"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.778235" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.777946" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:46.778400" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:46.777609" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.778751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.778512" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.779293" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.779001" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.778832" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.778493" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.781781" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:46.779535" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:46.781898" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:46.782090" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:46.777254" elapsed="0.004862"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.783326" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:46.783132" elapsed="0.000248"/>
</kw>
<msg time="2026-05-01T00:59:46.783479" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:46.782799" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.783714" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:46.783577" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.783558" elapsed="0.000225"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.784084" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:46.784241" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:46.783919" elapsed="0.000348"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:46.784668" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.784416" elapsed="0.000278"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:46.784742" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:46.784898" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:46.782421" elapsed="0.002502"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.786350" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.786100" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.786795" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.786554" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:46.794891" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:46.795086" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:46.795195" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:46.789234" elapsed="0.005988"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.786903" elapsed="0.008361"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.795437" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.795290" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.786885" elapsed="0.008693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.799242" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.796589" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.796357" elapsed="0.002979"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.796340" elapsed="0.003021"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.801973" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.799649" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.799417" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.799400" elapsed="0.002714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.802680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:46.802273" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.803010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.802780" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.803563" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.803245" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.803092" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.802761" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.804163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:46.803799" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.804500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.804260" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.805025" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.804734" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.804582" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.804242" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:46.805250" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:46.806077" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:46.805763" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:46.806251" elapsed="0.002415"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:46.795931" elapsed="0.012799"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.808905" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:46.808800" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.808781" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:46.812797" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.809111" elapsed="0.003748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:46.812915" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:46.813075" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:46.785227" elapsed="0.027875"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:46.813165" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:46.813316" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:46.716106" elapsed="0.097236"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.831046" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.830675" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.831838" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.831561" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:46.832000" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:46.831227" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.832583" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:46.832179" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:46.832902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:46.833046" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:46.832765" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.833481" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:46.833222" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:46.833980" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.833672" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.834520" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:46.834203" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:46.834065" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:46.833653" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.835776" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:46.834743" elapsed="0.001062"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:46.835856" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:46.830057" elapsed="0.005928"/>
</kw>
<msg time="2026-05-01T00:59:46.836069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:46.829244" elapsed="0.006873"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.836624" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.837123" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.837634" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.837812" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.837998" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.838358" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.838224" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:46.838210" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.838585" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.838746" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.838902" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:46.838179" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.838075" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.839152" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.839228" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:46.839440" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:46.825095" elapsed="0.014388"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:46.839653" elapsed="0.002432"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:46.843995" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.842828" elapsed="0.001197"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:46.845312" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:46.844173" elapsed="0.001168"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:46.846717" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:46.847471" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.845506" elapsed="0.002064">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.842407" elapsed="0.005360">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:46.842168" elapsed="0.005701">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:46.848093" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:46.847914" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:46.842149" elapsed="0.006026">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.814531" elapsed="0.033836">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.813680" elapsed="0.035052">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:46.813426" elapsed="0.035417">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:46.813409" elapsed="0.035474">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:46.848936" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:46.709789" elapsed="0.139300">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.893365" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.892971" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.894199" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.893910" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:47.894376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:47.893583" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.894961" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:47.894578" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.895282" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:47.895531" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:47.895141" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.895952" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.895709" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.896998" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.896709" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.897477" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.897195" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.898236" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.897870" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:47.899168" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.898802" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:47.899249" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:47.899411" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:47.898444" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.899604" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:47.897741" elapsed="0.002200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.900525" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.900184" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:47.901464" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.901094" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:47.901544" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:47.901699" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:47.900736" elapsed="0.000988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.901867" elapsed="0.000282"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:47.900058" elapsed="0.002132"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.902941" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.902436" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:47.903912" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.903556" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:47.903989" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:47.904142" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:47.903146" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.904310" elapsed="0.000297"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:47.902305" elapsed="0.002346"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.905261" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.904933" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:47.906178" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.905820" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:47.906255" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:47.906406" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:47.905488" elapsed="0.000943"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.906590" elapsed="0.000274"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:47.904795" elapsed="0.002111"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.907498" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.907144" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:47.908384" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.908036" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:47.908475" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:47.908632" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:47.907704" elapsed="0.000953"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.908829" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:47.907019" elapsed="0.002131"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:47.897558" elapsed="0.011625"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:47.909227" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:47.909387" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:47.896376" elapsed="0.013037"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.896077" elapsed="0.013368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.909632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.909488" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.896052" elapsed="0.013658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.910328" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:47.909846" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:47.910404" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:47.892330" elapsed="0.018216"/>
</kw>
<msg time="2026-05-01T00:59:47.910602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:47.891383" elapsed="0.019268"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.911145" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.911752" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.912256" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.912439" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.912624" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.913016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.912873" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:47.912858" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.913232" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.913391" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.913565" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:47.912827" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.912698" elapsed="0.000948"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.913784" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.913860" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:47.913978" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:47.886823" elapsed="0.027181"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.915231" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.914986" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:47.915397" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:47.914658" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.916011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.915763" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.916574" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.916264" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.916093" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.915534" elapsed="0.001125"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.919042" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:47.916819" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:47.919167" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:47.919330" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:47.914324" elapsed="0.005031"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.920525" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:47.920323" elapsed="0.000255"/>
</kw>
<msg time="2026-05-01T00:59:47.920663" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:47.919995" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.920943" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:47.920795" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.920739" elapsed="0.000273"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.921317" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:47.921468" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:47.921150" elapsed="0.000345"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:47.921876" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.921644" elapsed="0.000261"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:47.921953" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:47.922109" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:47.919678" elapsed="0.002456"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.923512" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.923251" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.923939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.923700" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:47.938808" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:47.939206" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:47.939509" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:47.926137" elapsed="0.013436"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.924047" elapsed="0.015622"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.940054" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.939728" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.924029" elapsed="0.016291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.948193" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.942626" elapsed="0.005701"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.942122" elapsed="0.006284"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.942082" elapsed="0.006411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.951751" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.949157" elapsed="0.002641"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.948624" elapsed="0.003210"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.948586" elapsed="0.003273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.952406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:47.952018" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.952774" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.952522" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.953317" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.953017" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.952862" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.952503" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.953935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:47.953571" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.954257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.954032" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.954797" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.954502" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.954337" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.954014" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:47.955021" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:47.955827" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:47.955540" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:47.956001" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:47.941149" elapsed="0.017273"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.958616" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:47.958509" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.958489" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:47.962468" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.958824" elapsed="0.003708"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:47.962589" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:47.962754" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:47.922435" elapsed="0.040346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:47.962844" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:47.962998" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:47.864554" elapsed="0.098470"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.979185" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.978817" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.979975" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.979702" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:47.980136" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:47.979365" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.980743" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:47.980316" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:47.981060" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:47.981203" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:47.980925" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.981800" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:47.981380" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:47.982277" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.981992" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.982811" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:47.982515" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:47.982360" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:47.981973" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.984058" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:47.983032" elapsed="0.001056"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:47.984138" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:47.978201" elapsed="0.006066"/>
</kw>
<msg time="2026-05-01T00:59:47.984351" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:47.977421" elapsed="0.006983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.984950" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.985475" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.985970" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.986148" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.986312" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.986687" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.986553" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:47.986538" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.986899" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.987058" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.987215" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:47.986507" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.986388" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.987482" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.987561" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:47.987772" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:47.974797" elapsed="0.013002"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:47.987966" elapsed="0.002238"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:47.992102" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.990940" elapsed="0.001192"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:47.993432" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:47.992278" elapsed="0.001198"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:47.993954" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:47.994560" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.993625" elapsed="0.001022">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.990537" elapsed="0.004285">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:47.990285" elapsed="0.004631">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:47.995096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:47.994955" elapsed="0.000196"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:47.990266" elapsed="0.004908">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.964149" elapsed="0.031199">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.963340" elapsed="0.032204">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:47.963108" elapsed="0.032544">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:47.963091" elapsed="0.032600">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:47.995743" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:47.858710" elapsed="0.137178">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.040067" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.039669" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.040910" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.040614" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:49.041082" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:49.040269" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.041665" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:49.041262" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.041986" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:49.042151" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:49.041844" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.042584" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.042324" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.043608" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.043313" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.044113" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.043838" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.044880" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.044517" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:49.045812" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.045419" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:49.045892" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:49.046052" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:49.045084" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.046223" elapsed="0.000314"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:49.044371" elapsed="0.002207"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.047301" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.046819" elapsed="0.000509"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:49.048258" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.047899" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:49.048335" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:49.048507" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:49.047530" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.048678" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:49.046695" elapsed="0.002304"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.049612" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.049270" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:49.050589" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.050206" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:49.050667" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:49.050822" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:49.049818" elapsed="0.001029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.050991" elapsed="0.000279"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:49.049115" elapsed="0.002197"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.051907" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.051567" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:49.052815" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.052448" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:49.052892" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:49.053043" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:49.052118" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.053209" elapsed="0.000296"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:49.051426" elapsed="0.002120"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.054102" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.053783" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:49.055020" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.054670" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:49.055096" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:49.055246" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:49.054304" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.055410" elapsed="0.000323"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:49.053660" elapsed="0.002115"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:49.044191" elapsed="0.011616"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:49.055850" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:49.056014" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:49.042999" elapsed="0.013041"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.042707" elapsed="0.013364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.056238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.056097" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.042684" elapsed="0.013631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.056940" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:49.056464" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:49.057014" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:49.039031" elapsed="0.018105"/>
</kw>
<msg time="2026-05-01T00:59:49.057191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:49.038161" elapsed="0.019077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.057742" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.058281" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.058847" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.059023" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.059186" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.059554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.059401" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:49.059387" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.059792" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.059956" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.060113" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:49.059358" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.059258" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.060328" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.060403" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:49.060537" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:49.033889" elapsed="0.026673"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.061987" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.061753" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:49.062142" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:49.061407" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.062532" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.062236" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.063072" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.062784" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.062616" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.062218" elapsed="0.000938"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.065492" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:49.063298" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:49.065611" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:49.065770" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:49.061092" elapsed="0.004703"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.066953" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:49.066760" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T00:59:49.067091" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:49.066408" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.067362" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:49.067185" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.067167" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.067788" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:49.067929" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:49.067588" elapsed="0.000367"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:49.068340" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.068109" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:49.068413" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:49.068587" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:49.066093" elapsed="0.002520"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.069961" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.069718" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.070385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.070148" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:49.077568" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:49.077767" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:49.077874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:49.072568" elapsed="0.005331"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.070508" elapsed="0.007433"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.078111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.077966" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.070490" elapsed="0.007738"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.081841" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.079218" elapsed="0.002683"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.079007" elapsed="0.002935"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.078988" elapsed="0.002981"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.084574" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.082239" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.082025" elapsed="0.002630"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.082008" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.085217" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:49.084836" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.085555" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.085313" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.086087" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.085790" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.085637" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.085295" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.086706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:49.086328" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.087027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.086803" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.087568" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.087259" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.087109" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.086785" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:49.087830" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:49.088631" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:49.088337" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:49.088803" elapsed="0.002321"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:49.078591" elapsed="0.012596"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.091359" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:49.091256" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.091238" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:49.095102" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.091605" elapsed="0.003557"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:49.095217" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:49.095377" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:49.068911" elapsed="0.026492"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:49.095483" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:49.095652" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:49.011240" elapsed="0.084438"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.111767" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.111358" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.112565" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.112274" elapsed="0.000357">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:49.112724" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:49.111954" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.113444" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:49.112905" elapsed="0.000584"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:49.113781" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:49.113918" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:49.113646" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.114337" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:49.114092" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:49.114833" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.114550" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.115347" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:49.115054" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:49.114916" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:49.114531" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.116662" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:49.115601" elapsed="0.001091"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:49.116743" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:49.110761" elapsed="0.006110"/>
</kw>
<msg time="2026-05-01T00:59:49.116954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:49.109969" elapsed="0.007033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.117512" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.118015" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.118525" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.118703" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.118865" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.119218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.119084" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:49.119070" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.119425" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.119634" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.119794" elapsed="0.000059"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:49.119040" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.118939" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.120056" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.120133" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:49.120345" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:49.107242" elapsed="0.013130"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:49.120555" elapsed="0.002238"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:49.124719" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.123521" elapsed="0.001229"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:49.126055" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:49.124896" elapsed="0.001188"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:49.126586" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:49.127188" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.126231" elapsed="0.001042">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.123104" elapsed="0.004345">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:49.122874" elapsed="0.004701">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:49.127757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:49.127616" elapsed="0.000196"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:49.122856" elapsed="0.004983">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.096803" elapsed="0.031214">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.095998" elapsed="0.032198">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:49.095761" elapsed="0.032541">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:49.095744" elapsed="0.032597">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:49.128392" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:49.005107" elapsed="0.123453">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.175673" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.175202" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.176522" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.176218" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:50.176705" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:50.175881" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.177282" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:50.176890" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.177636" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:50.177824" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:50.177488" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.178255" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.178003" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.179334" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.179063" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.179834" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.179553" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.180666" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.180270" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:50.181632" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.181216" elapsed="0.000442"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:50.181714" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:50.181882" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:50.180875" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.182056" elapsed="0.000304"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:50.180136" elapsed="0.002266"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.183131" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.182695" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:50.184220" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.183860" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:50.184298" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:50.184466" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:50.183520" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.184638" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:50.182538" elapsed="0.002420"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.185539" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.185196" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:50.186602" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.186163" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:50.186684" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:50.186841" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:50.185745" elapsed="0.001121"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.187011" elapsed="0.000282"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:50.185072" elapsed="0.002262"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.187927" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.187593" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:50.188860" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.188494" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:50.188939" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:50.189094" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:50.188138" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.189264" elapsed="0.000302"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:50.187450" elapsed="0.002159"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.190189" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.189852" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:50.191158" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.190797" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:50.191236" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:50.191394" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:50.190399" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.191581" elapsed="0.000283"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:50.189725" elapsed="0.002180"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:50.179919" elapsed="0.012020"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:50.191983" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:50.192147" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:50.178741" elapsed="0.013432"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.178385" elapsed="0.013820"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.192375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.192233" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.178359" elapsed="0.014113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.193104" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:50.192613" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:50.193179" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:50.174428" elapsed="0.018877"/>
</kw>
<msg time="2026-05-01T00:59:50.193360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:50.173362" elapsed="0.020047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.193928" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.194572" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.195094" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.195274" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.195438" elapsed="0.000043"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.195843" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.195686" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:50.195671" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.196067" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.196228" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.196384" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:50.195642" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.195538" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.196625" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.196702" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:50.196824" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:50.168636" elapsed="0.028213"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.198307" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.198063" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:50.198577" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:50.197719" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.198929" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.198687" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.199505" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.199185" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.199012" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.198667" elapsed="0.000924"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.201968" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:50.199737" elapsed="0.002258"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:50.202081" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:50.202245" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:50.197170" elapsed="0.005101"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.203478" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:50.203272" elapsed="0.000262"/>
</kw>
<msg time="2026-05-01T00:59:50.203621" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:50.202939" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.203858" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:50.203719" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.203699" elapsed="0.000228"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.204228" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:50.204358" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:50.204062" elapsed="0.000323"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:50.204783" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.204548" elapsed="0.000262"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:50.204858" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:50.205014" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:50.202620" elapsed="0.002420"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.206449" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.206189" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.206967" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.206722" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:50.371259" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:50.371710" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:50.372007" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:50.209153" elapsed="0.162916"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.207078" elapsed="0.165093"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.372619" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.372235" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.207060" elapsed="0.165849"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.380382" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.375259" elapsed="0.005183"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.374772" elapsed="0.005720"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.374730" elapsed="0.005789"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.383608" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.380986" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.380576" elapsed="0.003114"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.380559" elapsed="0.003157"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.384282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:50.383885" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.384628" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.384381" elapsed="0.000491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.385350" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.385052" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.384896" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.384363" elapsed="0.001071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.386098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:50.385606" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.386446" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.386194" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.386993" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.386698" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.386546" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.386177" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:50.387220" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:50.388033" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:50.387741" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:50.388204" elapsed="0.002450"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:50.373738" elapsed="0.016981"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.390899" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:50.390790" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.390771" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:50.394750" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.391109" elapsed="0.003705"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:50.394869" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:50.395037" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:50.205343" elapsed="0.189721"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:50.395129" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:50.395282" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:50.145432" elapsed="0.249876"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.411697" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.411302" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.412526" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.412202" elapsed="0.000397">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:50.412693" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:50.411880" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.413259" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:50.412874" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:50.413755" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:50.413931" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:50.413441" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.414369" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:50.414110" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:50.414873" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.414583" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.415398" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:50.415096" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:50.414958" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:50.414564" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.416697" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:50.415648" elapsed="0.001078"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:50.416778" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:50.410706" elapsed="0.006200"/>
</kw>
<msg time="2026-05-01T00:59:50.416990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:50.409897" elapsed="0.007142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.417553" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.418057" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.418592" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.418773" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.418938" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.419302" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.419168" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:50.419154" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.419528" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.419756" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.419915" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:50.419124" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.419016" elapsed="0.001015"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.420171" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.420249" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:50.420482" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:50.407271" elapsed="0.013240"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:50.420682" elapsed="0.002266"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:50.424840" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.423671" elapsed="0.001199"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:50.426161" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:50.425019" elapsed="0.001171"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:50.426705" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:50.427303" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.426353" elapsed="0.001037">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.423259" elapsed="0.004323">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:50.423029" elapsed="0.004661">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:50.427892" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:50.427744" elapsed="0.000205"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:50.423011" elapsed="0.004961">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.396442" elapsed="0.031708">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.395651" elapsed="0.032674">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:50.395392" elapsed="0.033037">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:50.395375" elapsed="0.033109">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:50.428540" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:50.139327" elapsed="0.289362">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.472319" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.471917" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.473202" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.472892" elapsed="0.000407">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:51.473419" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:51.472540" elapsed="0.000953"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.474112" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:51.473704" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.474438" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:51.474620" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:51.474294" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.475045" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.474796" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.476074" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.475808" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.476569" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.476278" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.477324" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.476958" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:51.478320" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.477917" elapsed="0.000432"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:51.478403" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:51.478588" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:51.477570" elapsed="0.001044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.478764" elapsed="0.000306"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:51.476828" elapsed="0.002284"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.479877" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.479360" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:51.480811" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.480430" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:51.480891" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:51.481049" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:51.480090" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.481222" elapsed="0.000319"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:51.479230" elapsed="0.002354"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.482166" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.481830" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:51.483150" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.482788" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:51.483229" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:51.483385" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:51.482376" elapsed="0.001035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.483575" elapsed="0.000283"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:51.481702" elapsed="0.002199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.484484" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.484143" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:51.485392" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.485029" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:51.485576" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:51.485741" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:51.484693" elapsed="0.001073"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.485911" elapsed="0.000281"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:51.484017" elapsed="0.002217"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.486811" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.486487" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:51.487716" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.487347" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:51.487792" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:51.487944" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:51.487014" elapsed="0.000954"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.488109" elapsed="0.000273"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:51.486347" elapsed="0.002076"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:51.476648" elapsed="0.011822"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:51.488520" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:51.488679" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:51.475484" elapsed="0.013221"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.475172" elapsed="0.013565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.488904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.488763" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.475148" elapsed="0.013832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.489656" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:51.489114" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:51.489732" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:51.471294" elapsed="0.018564"/>
</kw>
<msg time="2026-05-01T00:59:51.489913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:51.470403" elapsed="0.019558"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.490521" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.491155" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.491678" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.491854" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.492018" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.492373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.492237" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:51.492222" elapsed="0.000268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.492629" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.492790" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.492945" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:51.492192" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.492091" elapsed="0.000933"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.493161" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.493237" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:51.493355" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:51.466119" elapsed="0.027262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.494851" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.494612" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:51.495009" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:51.494266" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.495339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.495104" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.495892" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.495601" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.495420" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.495086" elapsed="0.000890"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.498319" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:51.496118" elapsed="0.002228"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:51.498432" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:59:51.498610" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:51.493944" elapsed="0.004691"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.499790" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:51.499602" elapsed="0.000241"/>
</kw>
<msg time="2026-05-01T00:59:51.499928" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:51.499257" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.500159" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:51.500022" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.500004" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.500542" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:51.500672" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:51.500362" elapsed="0.000335"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:51.501075" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.500845" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:51.501148" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:51.501302" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:51.498938" elapsed="0.002389"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.502730" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.502485" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.503153" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.502917" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:51.510659" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:51.511855" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:51.511967" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:51.505304" elapsed="0.006689"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.503261" elapsed="0.008774"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.512205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.512061" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.503243" elapsed="0.009081"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.515961" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.513326" elapsed="0.002696"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.513113" elapsed="0.002944"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.513095" elapsed="0.002988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.518739" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.516353" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.516140" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.516123" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.519390" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:51.519004" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.519774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.519515" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.520305" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.520009" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.519855" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.519492" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.520916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:51.520554" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.521235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.521012" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.521808" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.521510" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.521316" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.520995" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:51.522036" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:51.522843" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:51.522556" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:51.523018" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:51.512689" elapsed="0.012778"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.525681" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:51.525556" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.525533" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:51.529421" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.525888" elapsed="0.003621"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:51.529568" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:51.529734" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:51.501677" elapsed="0.028083"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:51.529824" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:51.529976" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:51.443350" elapsed="0.086652"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.546155" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.545781" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.546955" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.546676" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:51.547115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:51.546335" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.547851" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:51.547294" elapsed="0.000585"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:51.548174" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:51.548321" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:51.548036" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.548757" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:51.548513" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:51.549229" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.548944" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.549778" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:51.549480" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:51.549313" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:51.548925" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.551024" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:51.550001" elapsed="0.001052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:51.551104" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:51.545069" elapsed="0.006162"/>
</kw>
<msg time="2026-05-01T00:59:51.551315" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:51.544291" elapsed="0.007072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.551900" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.552397" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.552909" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.553085" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.553246" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.553644" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.553506" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:51.553491" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.553852" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.554008" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.554162" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:51.553446" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.553323" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.554417" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.554509" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:51.554720" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:51.541685" elapsed="0.013062"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:51.554914" elapsed="0.002226"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:51.559097" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.557890" elapsed="0.001238"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:51.560478" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:51.559281" elapsed="0.001228"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:51.560991" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:51.561626" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.560660" elapsed="0.001054">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.557491" elapsed="0.004402">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:51.557220" elapsed="0.004769">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:51.562172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:51.562028" elapsed="0.000200"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:51.557202" elapsed="0.005050">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.531129" elapsed="0.031359">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.530321" elapsed="0.032354">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:51.530086" elapsed="0.032695">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:51.530069" elapsed="0.032753">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:51.562875" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:51.438820" elapsed="0.124206">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.609389" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.608969" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.610196" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.609935" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:52.610369" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:52.609608" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.610950" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:52.610566" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.611271" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:52.611435" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:52.611130" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.611903" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.611652" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.612919" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.612660" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.613420" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.613148" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.614174" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.613826" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:52.615116" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.614743" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:52.615197" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:52.615358" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:52.614382" elapsed="0.001002"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.615548" elapsed="0.000300"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:52.613697" elapsed="0.002193"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.616633" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.616133" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:52.617613" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.617185" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:52.617708" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:52.617895" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:52.616841" elapsed="0.001085"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.618111" elapsed="0.000304"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:52.616007" elapsed="0.002467"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.619099" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.618723" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:52.620124" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.619716" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:52.620202" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:52.620380" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:52.619305" elapsed="0.001109"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.620605" elapsed="0.000339"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:52.618596" elapsed="0.002402"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.621713" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.621331" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:52.622660" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.622268" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:52.622737" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:52.622890" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:52.621921" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.623082" elapsed="0.000283"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:52.621175" elapsed="0.002233"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.624008" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.623685" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:52.624915" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.624563" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:52.624990" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:52.625156" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:52.624211" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.625322" elapsed="0.000294"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:52.623558" elapsed="0.002099"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:52.613515" elapsed="0.012175"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:52.625733" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:52.625891" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:52.612323" elapsed="0.013593"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.612028" elapsed="0.013920"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.626114" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.625975" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.612004" elapsed="0.014187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.626889" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:52.626354" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:52.626965" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:52.608344" elapsed="0.018746"/>
</kw>
<msg time="2026-05-01T00:59:52.627145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:52.607465" elapsed="0.019729"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.627748" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.628333" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.628869" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.629075" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.629245" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.629616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.629478" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:52.629449" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.629827" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.629984" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.630139" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:52.629420" elapsed="0.000770"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.629319" elapsed="0.000897"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.630353" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.630428" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:52.630563" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:52.602733" elapsed="0.027856"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.633642" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.633323" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:52.633803" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:52.632956" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.634137" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.633898" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.634716" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.634382" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.634217" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.633879" elapsed="0.000920"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.637121" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:52.634939" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:52.637232" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:52.637389" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:52.632632" elapsed="0.004782"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.638614" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:52.638372" elapsed="0.000308"/>
</kw>
<msg time="2026-05-01T00:59:52.638782" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:52.638046" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.639065" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:52.638900" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.638877" elapsed="0.000272"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.639466" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:52.639633" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:52.639287" elapsed="0.000377"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:52.640051" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.639820" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:52.640123" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:52.640277" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:52.637731" elapsed="0.002571"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.641799" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.641511" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.642257" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.642007" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:52.650053" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:52.650281" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:52.650404" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:52.644708" elapsed="0.005723"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.642399" elapsed="0.008095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.650771" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.650527" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.642375" elapsed="0.008560"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.656145" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.652418" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.652101" elapsed="0.004175"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.652076" elapsed="0.004236"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.660025" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.656718" elapsed="0.003372"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.656389" elapsed="0.003750"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.656366" elapsed="0.003808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.660986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:52.660395" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.661543" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.661181" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.662196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.661834" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.661635" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.661153" elapsed="0.001146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.662856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:52.662480" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.663199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.662956" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.663749" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.663435" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.663283" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.662938" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:52.663974" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:52.664770" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:52.664487" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:52.664941" elapsed="0.002344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:52.651503" elapsed="0.015845"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.667540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:52.667417" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.667399" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:52.671700" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.667747" elapsed="0.004016"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:52.671820" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:52.671986" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:52.640620" elapsed="0.031394"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:52.672078" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:52.672230" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:52.578260" elapsed="0.093997"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.688941" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.688563" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.689789" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.689502" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:52.689959" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:52.689157" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.690567" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:52.690142" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:52.690890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:52.691043" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:52.690751" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.691779" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:52.691262" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:52.692303" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.692007" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.692867" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:52.692561" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:52.692389" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:52.691984" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.694327" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:52.693127" elapsed="0.001236"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:52.694426" elapsed="0.000054"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:52.687900" elapsed="0.006696"/>
</kw>
<msg time="2026-05-01T00:59:52.694683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:52.686982" elapsed="0.007752"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.695224" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.695779" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.696318" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.696528" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.696723" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.697133" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.696959" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:52.696945" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.697352" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.697528" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.697690" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:52.696915" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.696806" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.697950" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.698029" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:52.698241" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:52.684340" elapsed="0.013927"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:52.698435" elapsed="0.002280"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:52.702706" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.701498" elapsed="0.001239"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:52.704096" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:52.702887" elapsed="0.001239"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:52.704628" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:52.705264" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.704275" elapsed="0.001079">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.701031" elapsed="0.004527">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:52.700798" elapsed="0.004880">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:52.705861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:52.705718" elapsed="0.000201"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:52.700779" elapsed="0.005163">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.673409" elapsed="0.032713">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.672595" elapsed="0.033733">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:52.672342" elapsed="0.034147">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:52.672324" elapsed="0.034221">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:52.706613" elapsed="0.000021"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:52.572025" elapsed="0.134771">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.751743" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.751265" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.752603" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.752286" elapsed="0.000398">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:53.752780" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:53.751952" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.753349" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:53.752964" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.753691" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:53.753860" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:53.753546" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.754311" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.754040" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.755330" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.755070" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.755815" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.755544" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.756594" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.756205" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:53.757546" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.757142" elapsed="0.000433"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:53.757631" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:53.757796" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:53.756802" elapsed="0.001021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.757972" elapsed="0.000372"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:53.756078" elapsed="0.002310"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.759160" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.758657" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:53.760126" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.759765" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:53.760206" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:53.760362" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:53.759398" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.760552" elapsed="0.000288"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:53.758527" elapsed="0.002357"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.761463" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.761130" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:53.762478" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.762109" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:53.762618" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:53.762806" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:53.761710" elapsed="0.001123"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.762978" elapsed="0.000283"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:53.761000" elapsed="0.002304"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.763886" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.763562" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:53.764810" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.764427" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:53.764887" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:53.765040" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:53.764091" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.765206" elapsed="0.000282"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:53.763417" elapsed="0.002149"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.766129" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.765807" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:53.767078" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.766717" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:53.767155" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:53.767308" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:53.766333" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.767477" elapsed="0.000292"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:53.765682" elapsed="0.002128"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:53.755894" elapsed="0.011949"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:53.767887" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:53.768045" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:53.754758" elapsed="0.013313"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.754437" elapsed="0.013665"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.768270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.768129" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.754413" elapsed="0.013933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.768986" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:53.768485" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:53.769061" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:53.750661" elapsed="0.018525"/>
</kw>
<msg time="2026-05-01T00:59:53.769241" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:53.749720" elapsed="0.019569"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.769851" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.770395" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.770942" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.771122" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.771287" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.771661" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.771523" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:53.771494" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.771872" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.772029" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.772184" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:53.771461" elapsed="0.000775"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.771360" elapsed="0.000902"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.772399" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.772478" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:53.772646" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:53.745375" elapsed="0.027297"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.774124" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.773879" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:53.774284" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:53.773542" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.774634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.774378" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.775220" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.774884" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.774717" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.774360" elapsed="0.000977"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.778094" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:53.775555" elapsed="0.002573"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:53.778243" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:59:53.778430" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:53.773203" elapsed="0.005257"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.779836" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:53.779609" elapsed="0.000298"/>
</kw>
<msg time="2026-05-01T00:59:53.780017" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:53.779195" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.780325" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:53.780145" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.780117" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.780810" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:53.780966" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:53.780631" elapsed="0.000364"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:53.781420" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.781157" elapsed="0.000291"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:53.781519" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:53.781688" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:53.778815" elapsed="0.002899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.783135" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.782884" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.783612" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.783327" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:53.791010" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:53.791204" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:53.791313" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:53.785777" elapsed="0.005563"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.783725" elapsed="0.007656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.791583" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.791408" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.783707" elapsed="0.008005"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.795390" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.792745" elapsed="0.002704"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.792529" elapsed="0.002959"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.792496" elapsed="0.003033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.798804" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.795805" elapsed="0.003064"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.795589" elapsed="0.003329"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.795570" elapsed="0.003384"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.799746" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:53.799180" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.800202" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.799883" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.801000" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.800579" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.800317" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.799858" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.801865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:53.801330" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.802314" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.802002" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.803084" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.802674" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.802429" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.801977" elapsed="0.001222"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:53.803398" elapsed="0.000509"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:53.804548" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:53.804127" elapsed="0.000497"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:53.804833" elapsed="0.002551"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:53.792087" elapsed="0.015362"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.807655" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:53.807541" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.807521" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:53.811585" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.807865" elapsed="0.003784"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:53.811705" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:53.811867" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:53.782027" elapsed="0.029867"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:53.811959" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:53.812113" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:53.722360" elapsed="0.089779"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.828355" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.827986" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.829166" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.828876" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:53.829334" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:53.828554" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.830114" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:53.829539" elapsed="0.000603"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:53.830437" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:53.830610" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:53.830298" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.831030" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:53.830786" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:53.831525" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.831219" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.832045" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:53.831749" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:53.831611" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:53.831200" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.833300" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:53.832266" elapsed="0.001063"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:53.833379" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:53.827369" elapsed="0.006163"/>
</kw>
<msg time="2026-05-01T00:59:53.833625" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:53.826602" elapsed="0.007072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.834192" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.834717" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.835214" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.835389" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.835571" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.835936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.835802" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:53.835788" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.836147" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.836304" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.836464" elapsed="0.000068"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:53.835758" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.835651" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.836745" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.836823" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:53.837034" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:53.823953" elapsed="0.013108"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:53.837228" elapsed="0.002296"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:53.841419" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.840236" elapsed="0.001213"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:53.842787" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:53.841615" elapsed="0.001201"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:53.843295" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:53.843913" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.842964" elapsed="0.001035">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.839838" elapsed="0.004336">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:53.839607" elapsed="0.004661">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:53.844446" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:53.844307" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:53.839588" elapsed="0.004956">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.813308" elapsed="0.031417">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.812464" elapsed="0.032433">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:53.812225" elapsed="0.032777">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:53.812208" elapsed="0.032833">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:53.845093" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:53.716002" elapsed="0.129238">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.891001" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.890592" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.891860" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.891557" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:54.892042" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:54.891206" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.892693" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:54.892239" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.893068" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:54.893241" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:54.892914" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.893694" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.893420" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.894768" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.894487" elapsed="0.000328"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.895274" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.894969" elapsed="0.000333"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.896066" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.895701" elapsed="0.000392"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:54.897114" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.896690" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:54.897195" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:54.897362" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:54.896299" elapsed="0.001093"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.897586" elapsed="0.000310"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:54.895568" elapsed="0.002371"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.898756" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.898206" elapsed="0.000578"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:54.899732" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.899308" elapsed="0.000453"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:54.899813" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:54.899970" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:54.898968" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.900142" elapsed="0.000282"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:54.898066" elapsed="0.002404"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.901122" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.900739" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:54.902159" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.901752" elapsed="0.000434"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:54.902238" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:54.902395" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:54.901332" elapsed="0.001088"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.902588" elapsed="0.000282"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:54.900604" elapsed="0.002310"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.903545" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.903190" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:54.904512" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.904102" elapsed="0.000439"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:54.904593" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:54.904752" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:54.903762" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.904922" elapsed="0.000345"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:54.903031" elapsed="0.002281"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.905951" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.905619" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:54.906912" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.906534" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:54.906990" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:54.907144" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:54.906158" elapsed="0.001010"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.907312" elapsed="0.000303"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:54.905449" elapsed="0.002218"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:54.895358" elapsed="0.012358"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:54.907768" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:54.907932" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:54.894160" elapsed="0.013799"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.893824" elapsed="0.014167"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.908162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.908018" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.893799" elapsed="0.014442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.908937" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:54.908380" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:54.909015" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:54.889944" elapsed="0.019198"/>
</kw>
<msg time="2026-05-01T00:59:54.909197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:54.888999" elapsed="0.020247"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.909855" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.910465" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.911034" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.911243" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.911411" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.911820" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.911679" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:54.911664" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.912036" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.912218" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.912425" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:54.911631" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.911490" elapsed="0.001045"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.912696" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.912779" elapsed="0.000021"/>
</return>
<msg time="2026-05-01T00:59:54.912928" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:54.884425" elapsed="0.028537"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.914584" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.914293" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:54.914749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:54.913961" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.915085" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.914844" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.915701" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.915356" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.915167" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.914826" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.918302" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:54.915934" elapsed="0.002395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:54.918418" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:54.918602" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:54.913630" elapsed="0.004998"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.919860" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:54.919635" elapsed="0.000290"/>
</kw>
<msg time="2026-05-01T00:59:54.920026" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:54.919280" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.920307" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:54.920131" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.920112" elapsed="0.000287"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.920785" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:54.920930" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:54.920606" elapsed="0.000350"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:54.921366" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.921106" elapsed="0.000298"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:54.921460" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:54.921643" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:54.918937" elapsed="0.002731"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.923224" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.922896" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.923802" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.923446" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:54.931137" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:54.931336" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:54.931446" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:54.926124" elapsed="0.005355"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.923919" elapsed="0.007627"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.931838" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.931584" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.923901" elapsed="0.008111"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.937437" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.933527" elapsed="0.004038"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.933197" elapsed="0.004420"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.933170" elapsed="0.004483"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.941661" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.938044" elapsed="0.003683"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.937735" elapsed="0.004043"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.937710" elapsed="0.004103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.942662" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:54.942076" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.943240" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.942868" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.944000" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.943639" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.943380" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.942839" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.944681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:54.944274" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.945007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.944780" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.945584" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.945241" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.945089" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.944762" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:54.945818" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:54.946676" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:54.946332" elapsed="0.000372"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:54.946856" elapsed="0.002436"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:54.932550" elapsed="0.016807"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.949558" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:54.949429" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.949411" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:54.953531" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.949767" elapsed="0.003832"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:54.953655" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:54.953833" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:54.922019" elapsed="0.031849"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:54.953935" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:54.954091" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:54.860851" elapsed="0.093267"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.972959" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.972526" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.973885" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.973543" elapsed="0.000419">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:54.974060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:54.973186" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.974661" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:54.974243" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:54.975015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:54.975180" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:54.974862" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.975635" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:54.975360" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:54.976208" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.975841" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.976772" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:54.976441" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:54.976298" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:54.975819" elapsed="0.001063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.978117" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:54.977025" elapsed="0.001122"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:54.978203" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:54.971742" elapsed="0.006621"/>
</kw>
<msg time="2026-05-01T00:59:54.978449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:54.970854" elapsed="0.007666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.979032" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.979619" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.980129" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.980347" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.980568" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.980978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.980837" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:54.980822" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.981194" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.981355" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.981554" elapsed="0.000064"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:54.980788" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.980655" elapsed="0.001038"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.981838" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.981916" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:54.982130" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:54.966413" elapsed="0.015750"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:54.982373" elapsed="0.002761"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:54.987198" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.985912" elapsed="0.001327"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:54.988905" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:54.987442" elapsed="0.001494"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:54.989483" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:54.990111" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.989089" elapsed="0.001112">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.985468" elapsed="0.004909">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:54.985225" elapsed="0.005282">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:54.990718" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:54.990569" elapsed="0.000205"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:54.985205" elapsed="0.005593">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.955368" elapsed="0.035613">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.954443" elapsed="0.036715">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:54.954203" elapsed="0.037061">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:54.954185" elapsed="0.037118">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:54.991355" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:54.856070" elapsed="0.135483">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.034514" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.034097" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.035343" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.035046" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:56.035535" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:56.034717" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.036175" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:56.035747" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.036552" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:56.036734" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:56.036388" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.037154" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.036910" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.038188" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.037932" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.038678" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.038387" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.039447" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.039070" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:56.040387" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.040023" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:56.040471" elapsed="0.000102"/>
</return>
<msg time="2026-05-01T00:59:56.040713" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:56.039685" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.040893" elapsed="0.000305"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:56.038941" elapsed="0.002297"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.041830" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.041502" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:56.042754" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.042372" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:56.042832" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:56.042987" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:56.042038" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.043176" elapsed="0.000336"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:56.041357" elapsed="0.002199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.044315" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.043810" elapsed="0.000532"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:56.045421" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.045056" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:56.045521" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:56.045684" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:56.044561" elapsed="0.001158"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.045878" elapsed="0.000283"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:56.043680" elapsed="0.002530"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.046803" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.046456" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:56.047757" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.047372" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:56.047835" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:56.048005" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:56.047032" elapsed="0.001001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.048178" elapsed="0.000293"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:56.046326" elapsed="0.002222"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.049178" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.048830" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:56.050108" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.049749" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:56.050186" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T00:59:56.050351" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:56.049389" elapsed="0.000987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.050538" elapsed="0.000291"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:56.048665" elapsed="0.002206"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:56.038758" elapsed="0.012147"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:56.050949" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:56.051112" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:56.037614" elapsed="0.013525"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.037279" elapsed="0.013892"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.051343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.051197" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.037255" elapsed="0.014167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.052067" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:56.051579" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:56.052145" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:56.033479" elapsed="0.018797"/>
</kw>
<msg time="2026-05-01T00:59:56.052344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:56.032594" elapsed="0.019801"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.052993" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.053613" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.054145" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.054328" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.054514" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.054903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.054753" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:56.054739" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.055136" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.055325" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.055507" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:56.054707" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.054591" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.055742" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.055829" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:56.055949" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:56.028077" elapsed="0.027898"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.057334" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.057024" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:56.057512" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:56.056666" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.058087" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.057818" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.058663" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.058348" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.058175" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.057591" elapsed="0.001159"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.061176" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:56.058897" elapsed="0.002333"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:56.061340" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T00:59:56.061534" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:56.056295" elapsed="0.005266"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.062802" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:56.062609" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T00:59:56.062942" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:56.062200" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.063178" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:56.063039" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.063021" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.063570" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:56.063721" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:56.063383" elapsed="0.000366"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:56.064136" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.063902" elapsed="0.000260"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:56.064210" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:56.064369" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:56.061867" elapsed="0.002528"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.065840" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.065593" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.066266" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.066029" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:56.074060" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:56.075775" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:56.075954" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:56.068445" elapsed="0.007547"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.066374" elapsed="0.009679"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.076302" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.076092" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.066356" elapsed="0.010125"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.081440" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.077972" elapsed="0.003573"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.077636" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.077609" elapsed="0.004022"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.084784" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.082120" elapsed="0.002711"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.081709" elapsed="0.003157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.081687" elapsed="0.003204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.085446" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:56.085055" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.085859" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.085563" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.086419" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.086115" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.085943" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.085545" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.087043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:56.086680" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.087362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.087139" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.087906" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.087612" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.087443" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.087122" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:56.088131" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:56.088935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:56.088649" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:56.089105" elapsed="0.002394"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:56.077003" elapsed="0.014562"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.091745" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:56.091636" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.091618" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:56.095519" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.091950" elapsed="0.003649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:56.095654" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T00:59:56.095820" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:56.064726" elapsed="0.031121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:56.095913" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:56.096067" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:56.005476" elapsed="0.090618"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.112253" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.111882" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.113064" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.112775" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:56.113227" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:56.112435" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.113820" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:56.113407" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:56.114135" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:56.114287" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:56.114000" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.114887" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:56.114464" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:56.115412" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.115122" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.115953" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:56.115655" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:56.115515" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:56.115103" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.117226" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:56.116177" elapsed="0.001078"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:56.117306" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:56.111268" elapsed="0.006168"/>
</kw>
<msg time="2026-05-01T00:59:56.117538" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:56.110456" elapsed="0.007133"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.118081" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.118615" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.119115" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.119316" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.119499" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.119873" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.119737" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:56.119722" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.120082" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.120241" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.120397" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:56.119689" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.119578" elapsed="0.000950"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.120670" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.120747" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:56.120960" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:56.107847" elapsed="0.013141"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:56.121156" elapsed="0.002290"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:56.125381" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.124178" elapsed="0.001233"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:56.126742" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:56.125575" elapsed="0.001196"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:56.127253" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:56.127885" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.126920" elapsed="0.001053">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.123778" elapsed="0.004367">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:56.123545" elapsed="0.004693">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:56.128416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:56.128277" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:56.123525" elapsed="0.004987">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.097223" elapsed="0.031464">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.096411" elapsed="0.032450">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:56.096178" elapsed="0.032787">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:56.096161" elapsed="0.032843">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:56.129055" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:56.000961" elapsed="0.128241">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.181513" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.181097" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.182375" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.182105" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:57.182571" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:57.181720" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.183165" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:57.182771" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.183512" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:57.183683" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:57.183349" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.184116" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.183867" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.185145" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.184887" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.185634" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.185344" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.186468" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.186050" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:57.187421" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.187045" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:57.187522" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:57.187694" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:57.186703" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.187866" elapsed="0.000299"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:57.185918" elapsed="0.002288"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.188978" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.188447" elapsed="0.000558"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:57.189900" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.189542" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:57.189977" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:57.190129" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:57.189184" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.190329" elapsed="0.000307"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:57.188322" elapsed="0.002358"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.191240" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.190918" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:57.192238" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.191878" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:57.192315" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:57.192471" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:57.191442" elapsed="0.001068"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.192654" elapsed="0.000281"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:57.190793" elapsed="0.002185"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.193555" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.193215" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:57.194473" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.194098" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:57.194567" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:57.194720" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:57.193757" elapsed="0.000987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.194888" elapsed="0.000278"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:57.193092" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.195817" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.195446" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:57.196785" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.196397" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:57.196861" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:57.197013" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:57.196025" elapsed="0.001012"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.197180" elapsed="0.000282"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:57.195322" elapsed="0.002195"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:57.185723" elapsed="0.011829"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:57.197596" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:57.197755" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:57.184568" elapsed="0.013213"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.184245" elapsed="0.013567"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.197984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.197839" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.184219" elapsed="0.013842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.198792" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:57.198197" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:57.198872" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:57.180473" elapsed="0.018526"/>
</kw>
<msg time="2026-05-01T00:59:57.199055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:57.179491" elapsed="0.019613"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.199669" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.200225" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.200740" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.200918" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.201083" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.201444" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.201308" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:57.201294" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.201675" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.201832" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.201987" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:57.201265" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.201161" elapsed="0.000904"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.202209" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.202285" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:57.202403" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:57.175017" elapsed="0.027411"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.203978" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.203730" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:57.204136" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:57.203340" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.204468" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.204230" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.205024" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.204734" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.204565" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.204212" elapsed="0.000894"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.207919" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:57.205246" elapsed="0.002711"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:57.208086" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T00:59:57.208313" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:57.203022" elapsed="0.005327"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.210147" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:57.209843" elapsed="0.000380"/>
</kw>
<msg time="2026-05-01T00:59:57.210341" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:57.209254" elapsed="0.001121"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.210726" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:57.210502" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.210455" elapsed="0.000384"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.211323" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:57.211550" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:57.211082" elapsed="0.000507"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:57.212180" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.211832" elapsed="0.000385"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:57.212285" elapsed="0.000042"/>
</return>
<msg time="2026-05-01T00:59:57.212532" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:57.208796" elapsed="0.003774"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.214623" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.214246" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.215368" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.214929" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:57.223061" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:57.223313" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:57.223428" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:57.217851" elapsed="0.005603"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.215583" elapsed="0.007936"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.223695" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.223547" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.215554" elapsed="0.008324"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.229675" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.225417" elapsed="0.004368"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.225105" elapsed="0.004742"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.225079" elapsed="0.004814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.233211" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.230345" elapsed="0.002913"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.229995" elapsed="0.003299"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.229965" elapsed="0.003354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.233915" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:57.233499" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.234254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.234019" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.234825" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.234510" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.234338" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.234000" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.235441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:57.235072" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.235847" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.235573" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.236377" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.236083" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.235931" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.235553" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:57.236627" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:57.237469" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:57.237174" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:57.237661" elapsed="0.002423"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:57.224474" elapsed="0.015675"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.240377" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:57.240241" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.240213" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:57.244262" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.240612" elapsed="0.003712"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:57.244380" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:57.244563" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:57.213022" elapsed="0.031569"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:57.244656" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:57.244816" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:57.146543" elapsed="0.098306"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.261756" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.261349" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.262603" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.262295" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:57.262768" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:57.261970" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.263535" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:57.262962" elapsed="0.000601"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:57.263876" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:57.264033" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:57.263727" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.264462" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:57.264211" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:57.265050" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.264751" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.265589" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:57.265273" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:57.265134" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:57.264731" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.266869" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:57.265816" elapsed="0.001082"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:57.266949" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:57.260647" elapsed="0.006430"/>
</kw>
<msg time="2026-05-01T00:59:57.267161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:57.259791" elapsed="0.007419"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.267715" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.268215" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.268786" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.268964" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.269125" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.269500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.269350" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:57.269336" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.269717" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.269876" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.270032" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:57.269306" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.269202" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.270285" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.270362" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:57.270591" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:57.257114" elapsed="0.013504"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:57.270786" elapsed="0.002367"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:57.275119" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.273890" elapsed="0.001260"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:57.276435" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:57.275298" elapsed="0.001170"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:57.276999" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:57.277638" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.276630" elapsed="0.001100">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.273472" elapsed="0.004438">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:57.273235" elapsed="0.004770">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:57.278183" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:57.278044" elapsed="0.000194"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:57.273216" elapsed="0.005046">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.246039" elapsed="0.032397">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.245177" elapsed="0.033453">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:57.244938" elapsed="0.033798">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:57.244920" elapsed="0.033855">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:57.278828" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:57.140514" elapsed="0.138462">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.323910" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.323518" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.324716" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.324430" elapsed="0.000363">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:58.324888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:58.324107" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.325448" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:58.325066" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.325795" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:58.326038" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:58.325646" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.326487" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.326215" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.327542" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.327265" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.328014" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.327740" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.328766" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.328396" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:58.329705" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.329308" elapsed="0.000423"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:58.329784" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T00:59:58.329944" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:58.328973" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.330115" elapsed="0.000292"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:58.328270" elapsed="0.002178"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.331054" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.330708" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:58.332127" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.331763" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:58.332206" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:58.332361" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:58.331405" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.332548" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:58.330583" elapsed="0.002286"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.333433" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.333108" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:58.334405" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.334046" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:58.334509" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:58.334665" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:58.333656" elapsed="0.001034"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.334838" elapsed="0.000310"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:58.332983" elapsed="0.002207"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.335774" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.335431" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:58.336684" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.336310" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:58.336761" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:58.336912" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:58.335980" elapsed="0.000956"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.337077" elapsed="0.000274"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:58.335306" elapsed="0.002086"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.337977" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.337649" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:58.338910" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.338552" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:58.339035" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T00:59:58.339201" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:58.338190" elapsed="0.001035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.339368" elapsed="0.000300"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:58.337523" elapsed="0.002187"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:58.328091" elapsed="0.011653"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:58.339787" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:58.339944" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:58.326949" elapsed="0.013020"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.326614" elapsed="0.013387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.340164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.340026" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.326591" elapsed="0.013649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.340865" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:58.340375" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:58.340940" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:58.322899" elapsed="0.018166"/>
</kw>
<msg time="2026-05-01T00:59:58.341119" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:58.321982" elapsed="0.019184"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.341687" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.342229" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.342798" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.342976" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.343171" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.343550" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.343399" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:58.343385" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.343761" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.343920" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.344076" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:58.343355" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.343252" elapsed="0.000902"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.344291" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.344366" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:58.344499" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:58.317728" elapsed="0.026798"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.345969" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.345725" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:58.346126" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:58.345365" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.346460" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.346221" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.347065" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.346772" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.346603" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.346203" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.349508" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:58.347301" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:58.349626" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T00:59:58.349787" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:58.344846" elapsed="0.004966"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.350966" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:58.350781" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T00:59:58.351103" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:58.350428" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.351369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:58.351198" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.351180" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.351756" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:58.351881" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:58.351589" elapsed="0.000318"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:58.352283" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.352053" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:58.352356" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:58.352530" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:58.350112" elapsed="0.002444"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.353911" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.353662" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.354337" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.354097" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:58.362045" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:58.362239" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:58.362359" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:58.356573" elapsed="0.005813"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.354446" elapsed="0.007982"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.362627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.362460" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.354428" elapsed="0.008321"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.366391" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.363774" elapsed="0.002680"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.363531" elapsed="0.002972"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.363512" elapsed="0.003018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.369490" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.366808" elapsed="0.002753"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.366588" elapsed="0.003023"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.366571" elapsed="0.003076"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.370396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:58.369866" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.370888" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.370568" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.371661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.371214" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.371002" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.370542" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.372594" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:58.372047" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.373061" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.372732" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.373824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.373388" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.373174" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.372707" elapsed="0.001234"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:58.374137" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:58.375251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:58.374867" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:58.375510" elapsed="0.002761"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:58.363096" elapsed="0.015239"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.378535" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:58.378406" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.378387" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:58.382264" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.378742" elapsed="0.003583"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:58.382381" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:58.382562" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:58.352852" elapsed="0.029737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:58.382654" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:58.382805" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:58.295498" elapsed="0.087334"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.399037" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.398662" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.399826" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.399554" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:58.399986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:58.399217" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.400573" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:58.400165" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:58.401101" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:58.401244" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:58.400780" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.401685" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:58.401419" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:58.402167" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.401880" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.402704" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:58.402390" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:58.402251" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:58.401862" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.403949" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:58.402924" elapsed="0.001055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:58.404030" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:58.398049" elapsed="0.006110"/>
</kw>
<msg time="2026-05-01T00:59:58.404244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:58.397268" elapsed="0.007023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.404821" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.405334" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.405857" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.406034" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.406197" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.406574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.406424" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:58.406410" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.406785" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.406941" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.407096" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:58.406381" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.406273" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.407349" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.407426" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:58.407656" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:58.394637" elapsed="0.013046"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:58.407851" elapsed="0.002256"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:58.412066" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.410842" elapsed="0.001254"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:58.413468" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:58.412242" elapsed="0.001270"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:58.413993" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:58.414615" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.413662" elapsed="0.001040">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.410418" elapsed="0.004474">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:58.410188" elapsed="0.004805">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:58.415174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:58.415034" elapsed="0.000195"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:58.410170" elapsed="0.005082">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.383950" elapsed="0.031481">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.383146" elapsed="0.032479">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:58.382915" elapsed="0.032815">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:58.382898" elapsed="0.032871">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:58.415838" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:58.289560" elapsed="0.126424">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.453830" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.453424" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.454667" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.454351" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.454843" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.454026" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.455408" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.455023" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.455757" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:59.455914" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.455607" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.456334" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.456088" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.457340" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.457082" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.457824" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.457553" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.458594" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.458218" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:59.459540" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.459153" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:59.459620" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:59.459781" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:59.458819" elapsed="0.000988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.459954" elapsed="0.000298"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T00:59:59.458090" elapsed="0.002203"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.461048" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.460560" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:59.461963" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.461607" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:59.462039" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:59.462190" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:59.461254" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.462358" elapsed="0.000297"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T00:59:59.460416" elapsed="0.002282"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.463299" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.462973" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:59.464265" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.463913" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:59.464342" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:59.464513" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:59.463526" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.464682" elapsed="0.000275"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T00:59:59.462847" elapsed="0.002152"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.465574" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.465236" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:59.466471" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.466113" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:59.466562" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T00:59:59.466720" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:59.465778" elapsed="0.000968"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.466903" elapsed="0.000292"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T00:59:59.465112" elapsed="0.002141"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.467892" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.467549" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T00:59:59.468845" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.468437" elapsed="0.000438"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T00:59:59.468927" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T00:59:59.469101" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T00:59:59.468102" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.469291" elapsed="0.000310"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T00:59:59.467380" elapsed="0.002264"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T00:59:59.457908" elapsed="0.011770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:59.469726" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T00:59:59.469895" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:59.456768" elapsed="0.013154"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.456460" elapsed="0.013495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.470124" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.469981" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.456433" elapsed="0.013771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.470841" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.470341" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.470963" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:59.452827" elapsed="0.018265"/>
</kw>
<msg time="2026-05-01T00:59:59.471147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.451960" elapsed="0.019241"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.471762" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.472297" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.472815" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.472993" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.473156" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.473525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.473374" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:59.473359" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.473736" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.473890" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.474043" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:59.473330" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.473229" elapsed="0.000891"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.474254" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.474328" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:59.474444" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:59.447720" elapsed="0.026764"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.475977" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.475731" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.476135" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.475353" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.476469" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.476229" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.477020" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.476734" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.476564" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.476210" elapsed="0.000893"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.479461" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.477243" elapsed="0.002277"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:59.479608" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T00:59:59.479770" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:59.475033" elapsed="0.004762"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.480942" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.480752" elapsed="0.000243"/>
</kw>
<msg time="2026-05-01T00:59:59.481078" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.480407" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.481307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:59.481172" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.481154" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.481689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:59.481875" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.481525" elapsed="0.000376"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T00:59:59.482277" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.482049" elapsed="0.000254"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T00:59:59.482350" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T00:59:59.482527" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:59.480093" elapsed="0.002460"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.483931" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.483688" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.484353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.484117" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:59.491911" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:59.492115" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:59.492234" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:59.486534" elapsed="0.005727"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.484464" elapsed="0.007842"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.492517" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.492334" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.484443" elapsed="0.008203"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.496682" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.493695" elapsed="0.003071"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.493455" elapsed="0.003359"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.493433" elapsed="0.003418"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.500553" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.497230" elapsed="0.003390"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.496929" elapsed="0.003741"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.496906" elapsed="0.003800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.501490" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.500933" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.501959" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.501631" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.502725" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.502285" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.502073" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.501606" elapsed="0.001237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.503576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.503052" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.504067" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.503755" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.504827" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.504385" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.504179" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.503728" elapsed="0.001240"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.505123" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:59.505929" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.505639" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.506099" elapsed="0.002507"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:59.493016" elapsed="0.015665"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.508869" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:59.508761" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.508742" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.512631" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.509084" elapsed="0.003609"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:59.512748" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T00:59:59.512923" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:59.482854" elapsed="0.030095"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.513014" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T00:59:59.513166" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:59.425396" elapsed="0.087797"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.529199" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.528830" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.530042" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.529721" elapsed="0.000400">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.530222" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.529380" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.530971" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.530401" elapsed="0.000598"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.531292" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:59.531467" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.531153" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.531902" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.531658" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:59.532411" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.532101" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.532950" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.532654" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.532513" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.532082" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.534242" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.533173" elapsed="0.001099"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.534323" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:59.528185" elapsed="0.006270"/>
</kw>
<msg time="2026-05-01T00:59:59.534563" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.527377" elapsed="0.007236"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.535097" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.535634" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.536133" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.536310" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.536531" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.536902" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.536765" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:59.536751" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.537115" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.537275" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.537435" elapsed="0.000073"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:59.536720" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.536613" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.537715" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.537794" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T00:59:59.538006" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:59.524779" elapsed="0.013254"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.538201" elapsed="0.002239"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.542352" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.541174" elapsed="0.001208"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.543746" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.542546" elapsed="0.001229"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.544255" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:59.544906" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.543923" elapsed="0.001072">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.540777" elapsed="0.004390">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:59.540547" elapsed="0.004715">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.545443" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.545301" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:59.540528" elapsed="0.005013">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.514320" elapsed="0.031394">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.513528" elapsed="0.032362">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:59.513276" elapsed="0.032718">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:59.513259" elapsed="0.032773">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.546083" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.420959" elapsed="0.125270">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<msg time="2026-05-01T00:59:59.546407" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.245589" elapsed="30.300973">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.548079" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:59.547766" elapsed="0.000356"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T00:59:59.547222" elapsed="0.000951"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T00:59:59.546920" elapsed="0.001309"/>
</kw>
<doc>Compare pcep-topology/path-computation-client to filled one, which includes a tunnel from pcc-mock.</doc>
<status status="FAIL" start="2026-05-01T00:59:29.243373" elapsed="30.304897">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597170,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</test>
<test id="s1-s21-t8" name="Stop_Pcc_Mock_1" line="102">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast" type="SETUP">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:59:59.549597" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T00:59:59.549301" elapsed="0.000563"/>
</kw>
<kw name="Stop_Pcc_Mock_Tool">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.550944" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.550633" elapsed="0.000338"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T00:59:59.551116" elapsed="0.000300"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T00:59:59.550333" elapsed="0.001159"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T00:59:59.564635" level="INFO">[?2004l00:59:29.859 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189]
00:59:30.008 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP session with [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189] started, sent proposal Open{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
00:59:30.029 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
00:59:30.031 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
00:59:30.033 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:37237[0] &lt;-&gt;</msg>
<msg time="2026-05-01T00:59:59.564795" level="INFO">${output} = [?2004l00:59:29.859 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0xc850b9fa, L:/...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T00:59:59.551643" elapsed="0.013179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.565246" level="INFO">[?2004l00:59:29.859 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189]
00:59:30.008 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP session with [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189] started, sent proposal Open{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
00:59:30.029 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
00:59:30.031 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0xc850b9fa, L:/10.30.170.157:37237 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
00:59:30.033 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:37237[0] &lt;-&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.564975" elapsed="0.000332"/>
</kw>
<doc>Send ctrl+c to pcc-mock, fails if no prompt is seen
after 3 seconds (the default for SSHLibrary)</doc>
<status status="PASS" start="2026-05-01T00:59:59.550015" elapsed="0.015347"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.566152" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T00:59:59.565837" elapsed="0.000357"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T00:59:59.565563" elapsed="0.000688"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T00:59:59.566808" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T00:59:59.566511" elapsed="0.000551"/>
</kw>
<doc>Stops First instance of pcc-mock.</doc>
<status status="PASS" start="2026-05-01T00:59:59.548742" elapsed="0.018358"/>
</test>
<test id="s1-s21-t9" name="Topology_Unauthorized_3" line="110">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.568322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.568106" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.568086" elapsed="0.000317"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T00:59:59.567905" elapsed="0.000544"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.619196" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.618709" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.620223" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.619877" elapsed="0.000446">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.620442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.619444" elapsed="0.001049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.621191" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.620709" elapsed="0.000516"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.621647" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:59.621847" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.621424" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.622416" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.622065" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.623769" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.623382" elapsed="0.000444"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.624430" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.624087" elapsed="0.000380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.624917" elapsed="0.000029"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.625172" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.625389" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T00:59:59.624750" elapsed="0.000717"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.624565" elapsed="0.000961"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T00:59:59.625594" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T00:59:59.625814" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T00:59:59.622974" elapsed="0.002871"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.622593" elapsed="0.003292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.626095" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.625917" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.622562" elapsed="0.003633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.626983" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.626370" elapsed="0.000647"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.627076" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:59.617897" elapsed="0.009333"/>
</kw>
<msg time="2026-05-01T00:59:59.627297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.616816" elapsed="0.010540"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.627986" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.628628" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.631362" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.631613" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.631825" elapsed="0.000026"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.632276" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.632100" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:59.632082" elapsed="0.000334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.632609" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.632817" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.633021" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:59.632044" elapsed="0.001043"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.631915" elapsed="0.001204"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.633297" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.633393" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:59.633565" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:59.611344" elapsed="0.022254"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.635185" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.634872" elapsed="0.000398">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.635388" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.634388" elapsed="0.001031"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.635832" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.635530" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.636535" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.636153" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.635933" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.635505" elapsed="0.001136"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.639679" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.636824" elapsed="0.002889"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T00:59:59.639779" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T00:59:59.639980" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:59.633992" elapsed="0.006022"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.641525" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.641211" elapsed="0.000392">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.641718" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.640798" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T00:59:59.642006" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-05-01T00:59:59.641840" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.641815" elapsed="0.000298"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.642280" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.642489" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.642568" elapsed="0.000020"/>
</return>
<msg time="2026-05-01T00:59:59.645071" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T00:59:59.640385" elapsed="0.004772"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.646950" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.646607" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.647520" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.647194" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T00:59:59.656626" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T00:59:59.656835" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T00:59:59.656960" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T00:59:59.650568" elapsed="0.006418"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.647661" elapsed="0.009368"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.657203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.657057" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.647638" elapsed="0.009650"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.660825" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":1,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597170,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.658299" elapsed="0.002585"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.658086" elapsed="0.002833"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.658069" elapsed="0.002875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.663546" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.661213" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.661000" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.660984" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.664206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.663818" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.664619" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.664369" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.665159" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.664856" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.664701" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.664350" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.665780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.665395" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.666108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.665883" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.666659" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.666343" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.666191" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.665865" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.666888" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T00:59:59.667745" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.667427" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T00:59:59.667919" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T00:59:59.657663" elapsed="0.012652"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.670511" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T00:59:59.670386" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.670368" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.674364" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.670721" elapsed="0.003673"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T00:59:59.674446" elapsed="0.000055"/>
</return>
<msg time="2026-05-01T00:59:59.674635" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T00:59:59.645573" elapsed="0.029089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.674726" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T00:59:59.674882" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T00:59:59.582713" elapsed="0.092195"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.691567" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.691058" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.692491" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.692149" elapsed="0.000492">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T00:59:59.692888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T00:59:59.691764" elapsed="0.001151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.693557" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T00:59:59.693075" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T00:59:59.693912" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T00:59:59.694073" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T00:59:59.693743" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.694568" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T00:59:59.694260" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T00:59:59.695116" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.694692" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.695927" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T00:59:59.695355" elapsed="0.000600"/>
</kw>
<status status="PASS" start="2026-05-01T00:59:59.695208" elapsed="0.000832"/>
</branch>
<status status="PASS" start="2026-05-01T00:59:59.694671" elapsed="0.001398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.696736" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T00:59:59.696229" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T00:59:59.696820" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T00:59:59.690355" elapsed="0.006598"/>
</kw>
<msg time="2026-05-01T00:59:59.697010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.689499" elapsed="0.007563"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.697575" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.698078" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.698617" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.698839" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.699009" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.699386" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.699246" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-01T00:59:59.699231" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.699640" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.699804" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.699965" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T00:59:59.699200" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.699089" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.700235" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.700317" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T00:59:59.700439" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T00:59:59.686811" elapsed="0.013659"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T00:59:59.700655" elapsed="0.002461"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.704178" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.703865" elapsed="0.000355"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T00:59:59.705758" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T00:59:59.704366" elapsed="0.001422"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T00:59:59.706265" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": 1
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597170,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": 0
      },
      "session-duration": "0:00:00:25",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T00:59:59.706713" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
+        "sent-error-msg-count": 0
+       },
+       "last-received-rpt-msg-timestamp": 1777597170,
+       "last-sent-msg-timestamp": 0,
+       "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
+       "reply-time": {
+        "average-time": 0,
+        "max-time": 0,
+        "min-time": 0
+       },
+       "sent-init-msg-count": 0,
+       "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
+       "unknown-msg-received": 0
+      },
+      "peer-capabilities": {
+       "active": true,
+       "instantiation": true,
+       "stateful": true
+      },
+      "peer-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.157",
+       "keepalive": 30,
+       "session-id": 0
+      },
+      "session-duration": "0:00:00:25",
+      "synchronized": true
+     },
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.705939" elapsed="0.000872">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.703433" elapsed="0.003554">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:59.703198" elapsed="0.003884">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T00:59:59.707263" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T00:59:59.707119" elapsed="0.000201"/>
</branch>
<status status="FAIL" start="2026-05-01T00:59:59.703179" elapsed="0.004165">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.676064" elapsed="0.031473">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.675221" elapsed="0.032493">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T00:59:59.674990" elapsed="0.032829">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T00:59:59.674974" elapsed="0.032883">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T00:59:59.707909" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T00:59:59.574793" elapsed="0.133264">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T00:59:59.569263" elapsed="0.138946">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,114 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-pcep-topology-stats:pcep-session-state": {
+      "delegated-lsps-count": 1,
+      "local-pref": {
+       "deadtimer": 120,
+       "ip-address": "10.30.170.185",
+       "keepalive": 30,
+       "session-id": 1
+      },
+      "messages": {
+       "error-messages": {
+        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.756369" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.755980" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.757186" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.756918" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.757356" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.756587" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.757947" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:00.757558" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.758320" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:00.758587" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:00.758147" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.759017" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.758765" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.760096" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.759783" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.760589" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:00.760292" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.760941" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.761142" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.761309" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:00.760809" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.760668" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:00.761445" elapsed="0.000052"/>
</return>
<msg time="2026-05-01T01:00:00.761633" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:00.759438" elapsed="0.002220"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.759143" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.761855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.761716" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.759119" elapsed="0.002813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.762574" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.762066" elapsed="0.000536"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.762651" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:00.755350" elapsed="0.007425"/>
</kw>
<msg time="2026-05-01T01:00:00.762830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.754431" elapsed="0.008448"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.763423" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.763941" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.764434" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.764630" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.764796" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.765157" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.765022" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.765008" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.765367" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.765547" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.765705" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:00.764978" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.764871" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.765925" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.766001" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:00.766119" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:00.750022" elapsed="0.016123"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.767599" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.767343" elapsed="0.000319">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.767756" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.767008" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.768088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.767852" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.768688" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.768374" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.768204" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.767834" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.771133" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:00.768928" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:00.771212" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:00.771368" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:00.766503" elapsed="0.004890"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.772605" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.772355" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.772761" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.772028" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:00.772990" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:00.772856" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.772837" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.773217" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.773379" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.773443" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:00.775420" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:00.771711" elapsed="0.003736"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.776851" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.776600" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.777279" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.777038" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:00.784268" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:00.784406" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:00.784526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:00.779494" elapsed="0.005059"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.777390" elapsed="0.007205"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.784765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.784621" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.777372" elapsed="0.007481"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.788807" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.785866" elapsed="0.003009"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.785642" elapsed="0.003281"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.785625" elapsed="0.003333"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.792714" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.789337" elapsed="0.003441"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.789037" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.789014" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.793730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.793154" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.794183" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.793868" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.794993" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.794531" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.794296" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.793842" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.795872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.795325" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.796256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.796029" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.796795" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.796502" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.796336" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.796007" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.797024" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:00.797836" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.797541" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:00.798006" elapsed="0.002515"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:00.785207" elapsed="0.015381"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.800766" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:00.800659" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.800640" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:00.803669" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:00.800975" elapsed="0.002722"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:00.803749" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:00.803912" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:00.775772" elapsed="0.028165"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.803999" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:00.804151" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:00.724388" elapsed="0.079789"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.820525" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.820024" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.821455" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.821109" elapsed="0.000516">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.821900" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.820709" elapsed="0.001218"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.822789" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:00.822113" elapsed="0.000705"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.823150" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:00.823302" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:00.822981" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.823810" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.823525" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:00.824350" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.823932" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.825153" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.824598" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.824437" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.823912" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.825894" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.825380" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.825972" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:00.819364" elapsed="0.006735"/>
</kw>
<msg time="2026-05-01T01:00:00.826154" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.818601" elapsed="0.007612"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.826735" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.827247" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.827809" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.828025" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.828196" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.828587" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.828431" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.828417" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.828801" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.828968" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.829134" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:00.828386" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.828277" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.829352" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.829429" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:00.829589" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:00.815902" elapsed="0.013715"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.829787" elapsed="0.002315"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:00.833125" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:00.832834" elapsed="0.000319"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:00.833669" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:00.833299" elapsed="0.000398"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:00.833846" elapsed="0.000330"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:00.832413" elapsed="0.001822"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.832184" elapsed="0.002085"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.834433" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.834294" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.832165" elapsed="0.002372"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:00.805301" elapsed="0.029300"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:00.804511" elapsed="0.030170"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.804261" elapsed="0.030480"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.804244" elapsed="0.030532"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.834814" elapsed="0.000030"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:00.716617" elapsed="0.118331"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:00.708872" elapsed="0.126182"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T00:59:59.568700" elapsed="1.266403"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:00.835699" elapsed="0.000301"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:00.835382" elapsed="0.000685"/>
</kw>
<doc>The same logic as Topology_Unauthorized_1, with no pcc-mock running.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T00:59:59.567355" elapsed="1.268752"/>
</test>
<test id="s1-s21-t10" name="Start_Secure_Pcc_Mock_2" line="115">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.837569" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.837340" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.837314" elapsed="0.000338"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:00.837122" elapsed="0.000577"/>
</kw>
<kw name="Start_Pcc_Mock_Tool_With_Password">
<kw name="Compose_Full_Java_Command" owner="NexusKeywords">
<kw name="Compose_Base_Java_Command" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk8"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_8_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_8_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.839436" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk11"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_11_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_11_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.839978" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${openjdk}""" == "openjdk17"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_17_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_17_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.840445" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Compose_Dilemma_Filepath" owner="NexusKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-01T01:00:00.841991" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T01:00:00.865566" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-05-01T01:00:00.865817" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jul 16  2025 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-05-01T01:00:00.865919" level="INFO">${rc} = 0</msg>
<var>${out}</var>
<var>${rc}</var>
<arg>ls -lA ${specific_path} 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-05-01T01:00:00.841811" elapsed="0.024159"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-05-01T01:00:00.866422" elapsed="0.000102"/>
</return>
<status status="PASS" start="2026-05-01T01:00:00.866159" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.866113" elapsed="0.000549"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.866741" elapsed="0.000032"/>
</return>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Query active SSH connection, return specific path if it exists else default path.</doc>
<status status="PASS" start="2026-05-01T01:00:00.841408" elapsed="0.025584"/>
</kw>
<msg time="2026-05-01T01:00:00.867088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"""${openjdk}""" == "openjdk21"</arg>
<arg>Compose_Dilemma_Filepath</arg>
<arg>${JAVA_21_HOME_CENTOS}/bin/java</arg>
<arg>${JAVA_21_HOME_UBUNTU}/bin/java</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.840926" elapsed="0.026268"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>java -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.867590" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.867885" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:00.867805" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.867768" elapsed="0.000256"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<var>${java}</var>
<arg>echo $JAVA_HOME/bin/java 2&gt;&amp;1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.868339" elapsed="0.000101"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.868877" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.869173" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:00.869096" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.869059" elapsed="0.000254"/>
</if>
<kw name="Get Environment Variable" owner="OperatingSystem">
<var>${JAVA_HOME}</var>
<arg>JAVA_HOME</arg>
<arg>${EMPTY}</arg>
<doc>Returns the value of an environment variable with the given name.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.869646" elapsed="0.000051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${java}</var>
<arg>"""${JAVA_HOME}"""!=""</arg>
<arg>${JAVA_HOME}/bin/java</arg>
<arg>false</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.870037" elapsed="0.000053"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${out}</var>
<var>${rc}</var>
<arg>${java} -version 2&gt;&amp;1</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.870513" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.870854" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:00.870753" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.870711" elapsed="0.000335"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.871399" elapsed="0.000179"/>
</kw>
<msg time="2026-05-01T01:00:00.871844" level="INFO">${base_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<var>${base_command}</var>
<arg>openjdk=${openjdk}</arg>
<doc>Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
Not directly related to Nexus, but versioned Java tools may need this.</doc>
<status status="PASS" start="2026-05-01T01:00:00.839074" elapsed="0.032832"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.873170" level="INFO">${full_command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password newtopsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmoc...</msg>
<var>${full_command}</var>
<arg>${base_command} ${options}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.872264" elapsed="0.000975"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.874245" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password newtopsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.873629" elapsed="0.000724"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-05-01T01:00:00.874464" elapsed="0.000097"/>
</return>
<msg time="2026-05-01T01:00:00.874863" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password newtopsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmoc...</msg>
<var>${command}</var>
<arg>-jar ${filename} --password ${password} --reconnect 1 --local-address ${TOOLS_SYSTEM_IP} --remote-address ${ODL_SYSTEM_IP} 2&gt;&amp;1 | tee pccmock.log</arg>
<doc>Return full Bash command to run Java with given options.
This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
The options may include JVM options, application command line arguments, Bash redirects and other constructs.</doc>
<status status="PASS" start="2026-05-01T01:00:00.838209" elapsed="0.036719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.875900" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -jar pcep-pcc-mock-1.0.1-executable.jar --password newtopsecret --reconnect 1 --local-address 10.30.170.157 --remote-address 10.30.170.185 2&gt;&amp;1 | tee pccmock.log</msg>
<arg>${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.875283" elapsed="0.000729"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-01T01:00:00.877325" level="INFO">10.30.170.185/10.30.170.185:4189[1] started</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-05-01T01:00:00.876348" elapsed="0.001028"/>
</kw>
<arg>password=newtopsecret</arg>
<doc>Starts pcc-mock with password argument.</doc>
<status status="PASS" start="2026-05-01T01:00:00.837842" elapsed="0.039590"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:00.878011" elapsed="0.000236"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:00.877709" elapsed="0.000601"/>
</kw>
<doc>Execute pcc-mock on Mininet with new password set, fail if pcc-mock promptly exits. Keep pcc-mock running for next test cases.</doc>
<status status="PASS" start="2026-05-01T01:00:00.836448" elapsed="0.041899"/>
</test>
<test id="s1-s21-t11" name="Topology_Unauthorized_4" line="119">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.879695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.879487" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.879456" elapsed="0.000320"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:00.879282" elapsed="0.000539"/>
</kw>
<kw name="Verify_Keyword_Does_Not_Fail_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Confirm_Keyword_Fails_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.932049" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.931668" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.932840" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.932575" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.933010" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.932238" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.933596" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:00.933195" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.934007" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:00.934162" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:00.933862" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.934734" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.934336" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.935733" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.935464" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.936203" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:00.935936" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.936580" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.936780" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.936946" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:00.936430" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.936285" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:00.937080" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:00.937242" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:00.935146" elapsed="0.002121"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.934853" elapsed="0.002445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.937467" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.937324" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.934831" elapsed="0.002728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.938171" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.937697" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.938248" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:00.931053" elapsed="0.007319"/>
</kw>
<msg time="2026-05-01T01:00:00.938426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.930251" elapsed="0.008242"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.938978" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.939490" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.940027" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.940207" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.940372" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.940746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.940609" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:00.940594" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.940963" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.941122" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.941278" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:00.940564" elapsed="0.000767"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.940446" elapsed="0.000910"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.941511" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.941589" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:00.941707" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:00.926064" elapsed="0.015668"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.942972" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.942736" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.943132" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.942389" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.943488" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.943227" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.944036" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.943747" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.943577" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.943208" elapsed="0.000909"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.946658" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:00.944256" elapsed="0.002431"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:00.946741" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:00.946903" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:00.942076" elapsed="0.004852"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:00.948161" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.947914" elapsed="0.000310">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:00.948361" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:00.947581" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:00.948617" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:00.948463" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.948439" elapsed="0.000264"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.948842" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.949005" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.949071" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:00.950997" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:00.947236" elapsed="0.003788"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.952419" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.952163" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.952870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.952629" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:00.962838" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:00.962981" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:00.963079" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:00.955107" elapsed="0.007998"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.953025" elapsed="0.010122"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.963322" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.963175" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.953004" elapsed="0.010404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.969080" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.964462" elapsed="0.004685"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.964235" elapsed="0.004962"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.964217" elapsed="0.005016"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.972909" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:00.969634" elapsed="0.003342"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.969311" elapsed="0.003714"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.969287" elapsed="0.003773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.973864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.973288" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.974317" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.974002" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.975103" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.974705" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.974431" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.973976" elapsed="0.001209"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.975710" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.975333" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:00.976028" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:00.975806" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:00.976623" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:00.976309" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.976157" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.975788" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.976847" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:00.977666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:00.977350" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:00.977837" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:00.963796" elapsed="0.016438"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:00.980411" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:00.980304" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.980285" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:00.983284" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:00.980635" elapsed="0.002677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:00.983363" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:00.983543" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:00.951328" elapsed="0.032241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:00.983631" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:00.983967" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:00.902849" elapsed="0.081156"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.001408" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:01.000963" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:01.002296" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:01.001998" elapsed="0.000388">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:01.002505" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:01.001627" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.003108" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:01.002691" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:01.003460" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:01.003659" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:01.003291" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.063018" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:01.003899" elapsed="0.059196"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:01.063636" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:01.063213" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.064252" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:01.063895" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:01.063735" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:01.063179" elapsed="0.001204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.065036" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:01.064570" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:01.065118" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:01.000325" elapsed="0.064941"/>
</kw>
<msg time="2026-05-01T01:00:01.065321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.999429" elapsed="0.065950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.065889" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.066413" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.066934" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.067117" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.067314" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.067719" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:01.067579" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:01.067563" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.067933" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.068093" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.068323" elapsed="0.000067"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:01.067530" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:01.067399" elapsed="0.001061"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.068631" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:01.068712" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:01.068833" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:00.996605" elapsed="0.072256"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:01.069036" elapsed="0.002244"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:01.072363" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:01.072046" elapsed="0.000346"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:01.072876" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:01.072589" elapsed="0.000317"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:01.073055" elapsed="0.000332"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:01.071616" elapsed="0.001832"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:01.071364" elapsed="0.002136"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:01.073673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:01.073528" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:01.071344" elapsed="0.002408"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:00.985330" elapsed="0.088471"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:00.984540" elapsed="0.089337"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:00.984137" elapsed="0.089824"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:00.984103" elapsed="0.089914"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:01.074086" elapsed="0.000083"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:00.894928" elapsed="0.179458"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:00.883753" elapsed="0.190836"/>
</kw>
<msg time="2026-05-01T01:00:01.074684" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:01.074731" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:00.883374" elapsed="0.191387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:01.074954" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:01.074841" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:01.074821" elapsed="0.000202"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.075492" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:01.075161" elapsed="0.000360"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:01.075976" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:01.075669" elapsed="0.000381">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.883054" elapsed="0.193107">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.132517" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.132108" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.133312" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.133048" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:02.133497" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:02.132719" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.134070" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:02.133684" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.134395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:02.134574" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:02.134252" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.135001" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.134751" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.136025" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.135768" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.136652" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:02.136221" elapsed="0.000457"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.137008" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.137206" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.137375" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:02.136879" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.136735" elapsed="0.000750"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:02.137535" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:02.137707" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:02.135434" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.135142" elapsed="0.002621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.137927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.137788" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.135117" elapsed="0.002886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.138602" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:02.138134" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:02.138677" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:02.131505" elapsed="0.007297"/>
</kw>
<msg time="2026-05-01T01:00:02.138857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:02.130611" elapsed="0.008298"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.139502" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.140006" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.140519" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.140699" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.140864" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.141218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.141084" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:02.141069" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.141427" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.141603" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.141759" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:02.141040" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.140938" elapsed="0.000899"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.141971" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.142047" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:02.142165" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:02.126349" elapsed="0.015842"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.143453" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.143169" elapsed="0.000367">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:02.143628" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:02.142837" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.144000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.143758" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.144562" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.144249" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.144082" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.143737" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.147125" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:02.144793" elapsed="0.002359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:02.147204" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:02.147396" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:02.142520" elapsed="0.004900"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.148659" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.148393" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:02.148818" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:02.148066" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:02.149057" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:02.148916" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.148897" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.149279" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.149444" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.149530" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:02.151466" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:02.147741" elapsed="0.003763"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.152913" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.152653" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.153346" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.153104" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:02.159970" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:02.160106" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:02.160223" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:02.155571" elapsed="0.004679"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.153461" elapsed="0.006831"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.160491" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.160319" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.153438" elapsed="0.007142"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.164313" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.161602" elapsed="0.002777"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.161368" elapsed="0.003062"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.161349" elapsed="0.003139"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.168119" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.164872" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.164571" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.164546" elapsed="0.003799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.169146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:02.168598" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.169629" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.169286" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.170386" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.169964" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.169746" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.169259" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.171249" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:02.170742" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.171765" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.171386" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.172341" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.172043" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.171884" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.171360" elapsed="0.001066"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:02.172586" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:02.173393" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:02.173098" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:02.173655" elapsed="0.002389"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:02.160943" elapsed="0.015164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.176286" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:02.176178" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.176159" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:02.179168" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:02.176513" elapsed="0.002683"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:02.179250" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:02.179417" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:02.151820" elapsed="0.027624"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:02.179527" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:02.179912" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:02.103643" elapsed="0.076308"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.196555" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.196159" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.197415" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.197153" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:02.197609" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:02.196819" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.198365" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:02.197789" elapsed="0.000605"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:02.198711" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:02.198868" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:02.198567" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.199294" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:02.199048" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:02.199724" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.199414" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.200263" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:02.199950" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.199811" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.199392" elapsed="0.000956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.200948" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:02.200503" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:02.201028" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:02.195533" elapsed="0.005631"/>
</kw>
<msg time="2026-05-01T01:00:02.201219" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:02.194692" elapsed="0.006581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.201785" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.202288" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.202804" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.203025" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.203194" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.203581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.203426" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:02.203411" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.203797" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.203965" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.204129" elapsed="0.000049"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:02.203380" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.203272" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.204383" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.204464" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:02.204599" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:02.192008" elapsed="0.012619"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:02.204796" elapsed="0.002221"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:02.208068" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:02.207755" elapsed="0.000341"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:02.208579" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:02.208281" elapsed="0.000326"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:02.208755" elapsed="0.000327"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:02.207329" elapsed="0.001814"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.207097" elapsed="0.002078"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:02.209340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:02.209201" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.207078" elapsed="0.002339"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:02.181319" elapsed="0.028161"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:02.180508" elapsed="0.029051"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:02.180085" elapsed="0.029586"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.180052" elapsed="0.029673"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:02.209793" elapsed="0.000081"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:02.095272" elapsed="0.114815"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:02.079947" elapsed="0.130307"/>
</kw>
<msg time="2026-05-01T01:00:02.210345" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:02.210391" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:02.078957" elapsed="0.131458"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:02.210636" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:02.210524" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:02.210504" elapsed="0.000200"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.211150" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:02.210841" elapsed="0.000335"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:02.211642" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.211320" elapsed="0.000389">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:02.077796" elapsed="0.134024">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.265092" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.264688" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.265941" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.265645" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:03.266118" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:03.265294" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.266715" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:03.266304" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.267042" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:03.267213" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:03.266898" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.267655" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.267390" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.268778" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.268519" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.269244" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:03.268975" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.269621" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.269822" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.269996" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:03.269489" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.269326" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:03.270135" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:03.270376" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:03.268126" elapsed="0.002275"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.267787" elapsed="0.002647"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.270622" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.270477" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.267759" elapsed="0.002941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.271331" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:03.270837" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:03.271409" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:03.264017" elapsed="0.007538"/>
</kw>
<msg time="2026-05-01T01:00:03.271612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:03.263078" elapsed="0.008590"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.272420" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.272944" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.273442" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.273642" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.273809" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.274180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.274042" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:03.274025" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.274391" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.274569" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.274729" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:03.273994" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.273884" elapsed="0.000925"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.274947" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.275072" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:03.275199" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:03.258657" elapsed="0.016568"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.276640" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.276323" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:03.276807" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:03.275900" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.277181" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.276907" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.277762" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.277435" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.277264" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.276885" elapsed="0.000961"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.280359" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:03.277991" elapsed="0.002417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:03.280490" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T01:00:03.280671" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:03.275570" elapsed="0.005126"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.282008" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.281720" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:03.282174" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:03.281367" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:03.282411" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T01:00:03.282273" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.282254" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.282656" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.282820" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.282886" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:03.285099" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:03.281034" elapsed="0.004091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.286547" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.286275" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.286976" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.286736" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:03.293544" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:03.293749" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:03.293847" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:03.289287" elapsed="0.004586"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.287086" elapsed="0.006831"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.294170" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.293956" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.287067" elapsed="0.007231"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.299524" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.295834" elapsed="0.003760"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.295513" elapsed="0.004133"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.295484" elapsed="0.004199"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.303998" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.300092" elapsed="0.003982"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.299768" elapsed="0.004359"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.299742" elapsed="0.004423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.305055" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:03.304424" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.305393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.305156" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.305956" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.305653" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.305495" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.305137" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.306577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:03.306194" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.306901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.306676" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.307431" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.307136" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.306983" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.306657" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:03.307687" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:03.308518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:03.308198" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:03.308692" elapsed="0.002521"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:03.294856" elapsed="0.016424"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.311477" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:03.311351" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.311332" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:03.314537" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:03.311692" elapsed="0.002874"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:03.314618" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:03.314785" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:03.285438" elapsed="0.029448"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:03.314955" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:03.315315" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:03.235855" elapsed="0.079497"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.332121" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.331748" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.332933" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.332652" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:03.333126" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:03.332309" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.333728" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:03.333319" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:03.334051" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:03.334233" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:03.333909" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.334675" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:03.334410" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:03.335093" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.334795" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.335624" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:03.335317" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.335179" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.334772" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.336273" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:03.335845" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:03.336351" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:03.331135" elapsed="0.005363"/>
</kw>
<msg time="2026-05-01T01:00:03.336553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:03.330315" elapsed="0.006291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.337391" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.337914" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.338409" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.338611" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.338776" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.339149" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.339012" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:03.338998" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.339359" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.339535" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.339696" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:03.338967" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.338857" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.339916" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.339995" elapsed="0.000019"/>
</return>
<msg time="2026-05-01T01:00:03.340116" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:03.327640" elapsed="0.012503"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:03.340308" elapsed="0.002243"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:03.343586" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:03.343263" elapsed="0.000351"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:03.344022" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:03.343757" elapsed="0.000325"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:03.344230" elapsed="0.000345"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:03.342864" elapsed="0.001772"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.342633" elapsed="0.002036"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:03.344833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:03.344694" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.342613" elapsed="0.002297"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:03.316759" elapsed="0.028198"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:03.315926" elapsed="0.029106"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:03.315524" elapsed="0.029577"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.315456" elapsed="0.029692"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:03.345216" elapsed="0.000106"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:03.227178" elapsed="0.118398"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:03.213895" elapsed="0.131855"/>
</kw>
<msg time="2026-05-01T01:00:03.345841" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:03.345886" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:03.213277" elapsed="0.132632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:03.346090" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:03.345981" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:03.345963" elapsed="0.000194"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.346616" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:03.346293" elapsed="0.000349"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:03.347082" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.346786" elapsed="0.000355">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:03.212640" elapsed="0.134614">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.401647" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.401240" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.402490" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.402170" elapsed="0.000397">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:04.402662" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:04.401844" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.403270" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:04.402848" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.403609" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:04.403769" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:04.403450" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.404190" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.403945" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.405272" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.405014" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.405758" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:04.405486" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.406105" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.406305" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.406490" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:04.405976" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.405836" elapsed="0.000745"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:04.406629" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:04.406796" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:04.404697" elapsed="0.002125"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.404382" elapsed="0.002471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.407018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.406879" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.404359" elapsed="0.002737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.407731" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:04.407264" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:04.407808" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:04.400641" elapsed="0.007294"/>
</kw>
<msg time="2026-05-01T01:00:04.407990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:04.399815" elapsed="0.008228"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.408553" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.410791" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.411356" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.411557" elapsed="0.000058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.411766" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.412127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.411989" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:04.411975" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.412340" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.412522" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.412684" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:04.411944" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.411841" elapsed="0.000924"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.412903" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.412980" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:04.413100" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:04.395286" elapsed="0.017841"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.414359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.414117" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:04.414536" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:04.413782" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.414874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.414634" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.415430" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.415122" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.414955" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.414616" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.417858" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:04.415672" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:04.417938" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:04.418100" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:04.413443" elapsed="0.004682"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.419346" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.419087" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:04.419522" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:04.418759" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:04.419756" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T01:00:04.419620" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.419600" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.419979" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.420181" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.420250" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:04.422363" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:04.418425" elapsed="0.003965"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.423841" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.423584" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.424287" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.424037" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:04.431304" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:04.431445" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:04.431623" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:04.426488" elapsed="0.005162"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.424402" elapsed="0.007294"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.431879" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.431723" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.424383" elapsed="0.007585"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.435408" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.432996" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.432782" elapsed="0.002726"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.432763" elapsed="0.002808"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.439132" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.435846" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.435630" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.435613" elapsed="0.003667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.440114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:04.439526" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.440610" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.440266" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.441367" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.440948" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.440728" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.440240" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.442224" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:04.441719" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.442699" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.442360" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.443434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.443024" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.442814" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.442334" elapsed="0.001244"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:04.443809" elapsed="0.000440"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:04.444790" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:04.444483" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:04.444965" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:04.432328" elapsed="0.015031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.447560" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:04.447432" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.447412" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:04.450503" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:04.447810" elapsed="0.002724"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:04.450589" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:04.450755" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:04.422721" elapsed="0.028061"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:04.450848" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:04.451204" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:04.372581" elapsed="0.078662"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.468155" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.467718" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.468956" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.468706" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:04.469128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:04.468356" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.469714" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:04.469313" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:04.470035" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:04.470191" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:04.469897" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.470634" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:04.470370" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:04.471037" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.470750" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.471565" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:04.471260" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.471122" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.470730" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.472313" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:04.471835" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:04.472393" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:04.467100" elapsed="0.005443"/>
</kw>
<msg time="2026-05-01T01:00:04.472599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:04.466294" elapsed="0.006357"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.473135" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.473653" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.474149" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.474327" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.474510" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.474880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.474744" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:04.474729" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.475096" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.475258" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.475418" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:04.474699" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.474591" elapsed="0.000927"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.475658" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.475736" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:04.475853" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:04.463628" elapsed="0.012284"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:04.476119" elapsed="0.002391"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:04.479549" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:04.479235" elapsed="0.000342"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:04.479999" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:04.479725" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:04.480355" elapsed="0.000357"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:04.478828" elapsed="0.001946"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.478594" elapsed="0.002215"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:04.480978" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:04.480835" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.478574" elapsed="0.002487"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:04.452681" elapsed="0.028428"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:04.451849" elapsed="0.029335"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:04.451382" elapsed="0.029866"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.451347" elapsed="0.029947"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:04.481358" elapsed="0.000077"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:04.364138" elapsed="0.117531"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:04.350279" elapsed="0.131556"/>
</kw>
<msg time="2026-05-01T01:00:04.481928" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:04.481973" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:04.349272" elapsed="0.132724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:04.482178" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:04.482068" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:04.482050" elapsed="0.000194"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.482710" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:04.482382" elapsed="0.000354"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:04.483176" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.482881" elapsed="0.000354">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:04.348254" elapsed="0.135096">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.538499" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.538094" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.539390" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.539127" elapsed="0.000353">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:05.539579" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:05.538784" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.540202" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:05.539767" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.540558" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:05.540708" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:05.540396" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.541137" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.540886" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.542144" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.541888" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.542632" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:05.542343" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.542984" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.543335" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.543522" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:05.542855" elapsed="0.000727"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.542711" elapsed="0.000902"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:05.543673" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:05.543842" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:05.541570" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.541259" elapsed="0.002641"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.544065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.543925" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.541235" elapsed="0.002934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.544875" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:05.544342" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:05.544953" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:05.537485" elapsed="0.007595"/>
</kw>
<msg time="2026-05-01T01:00:05.545136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:05.536662" elapsed="0.008525"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.545692" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.546233" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.546752" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.546934" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.547099" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.547456" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.547317" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:05.547303" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.547687" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.547848" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.548007" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:05.547274" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.547173" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.548269" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.548369" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:05.548509" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:05.532335" elapsed="0.016201"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.549967" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.549723" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:05.550125" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:05.549361" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.550477" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.550221" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.551028" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.550734" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.550563" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.550202" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.553528" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:05.551258" elapsed="0.002297"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:05.553641" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:05.553803" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:05.548861" elapsed="0.004967"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.555119" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.554876" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:05.555277" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:05.554547" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:05.555530" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:05.555373" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.555354" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.555756" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.555922" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.555989" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:05.557962" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:05.554126" elapsed="0.003863"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.559370" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.559123" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.559818" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.559576" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:05.566771" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:05.566906" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:05.567022" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:05.562086" elapsed="0.004978"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.559928" elapsed="0.007199"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.567372" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.567165" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.559909" elapsed="0.007610"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.572680" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.569012" elapsed="0.003736"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.568705" elapsed="0.004092"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.568677" elapsed="0.004156"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.576612" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.573214" elapsed="0.003479"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.572912" elapsed="0.003841"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.572888" elapsed="0.003909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.577420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:05.577023" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.577781" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.577543" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.578319" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.578017" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.577864" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.577524" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.578984" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:05.578612" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.579313" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.579083" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.579862" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.579566" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.579396" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.579064" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:05.580091" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:05.580967" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:05.580648" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:05.581143" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:05.568014" elapsed="0.015533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.583727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:05.583620" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.583601" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:05.586682" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:05.583934" elapsed="0.002777"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:05.586765" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:05.586923" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:05.558302" elapsed="0.028648"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:05.587013" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:05.587339" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:05.509007" elapsed="0.078370"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.603899" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.603529" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.604635" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.604399" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:05.604817" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:05.604080" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.605424" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:05.605041" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:05.605802" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:05.606149" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:05.605663" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.606609" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:05.606330" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:05.607011" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.606726" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.607543" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:05.607235" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.607096" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.606706" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.608184" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:05.607764" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:05.608261" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:05.602915" elapsed="0.005473"/>
</kw>
<msg time="2026-05-01T01:00:05.608441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:05.602133" elapsed="0.006391"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.609082" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.609616" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.610107" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.610283" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.610447" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.610885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.610749" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:05.610734" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.611096" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.611256" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.611414" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:05.610705" elapsed="0.000779"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.610598" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.611652" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.611728" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:05.611846" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:05.599424" elapsed="0.012449"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:05.612039" elapsed="0.002221"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:05.615282" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:05.614996" elapsed="0.000314"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:05.615743" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:05.615458" elapsed="0.000312"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:05.615914" elapsed="0.000321"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:05.614598" elapsed="0.001697"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.614351" elapsed="0.001978"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:05.616509" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:05.616354" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.614324" elapsed="0.002262"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:05.588742" elapsed="0.027892"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:05.587902" elapsed="0.028804"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:05.587532" elapsed="0.029234"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.587497" elapsed="0.029313"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:05.616873" elapsed="0.000137"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:05.500530" elapsed="0.116728"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:05.486342" elapsed="0.131085"/>
</kw>
<msg time="2026-05-01T01:00:05.617541" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:05.617587" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:05.485404" elapsed="0.132206"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:05.617838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:05.617726" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:05.617706" elapsed="0.000199"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.618347" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:05.618042" elapsed="0.000330"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:05.618834" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.618534" elapsed="0.000360">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:05.484427" elapsed="0.134579">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.673836" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.673418" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.674652" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.674364" elapsed="0.000368">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:06.674856" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:06.674037" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.675509" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:06.675047" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.675840" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:06.676006" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:06.675696" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.676429" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.676184" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.677445" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.677192" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.677928" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:06.677661" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.678287" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.678503" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.678675" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:06.678160" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.678011" elapsed="0.000754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:06.678814" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:06.678984" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:06.676875" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.676577" elapsed="0.002466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.679216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.679073" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.676551" elapsed="0.002744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.679964" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:06.679508" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:06.680094" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:06.672770" elapsed="0.007455"/>
</kw>
<msg time="2026-05-01T01:00:06.680280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:06.671947" elapsed="0.008386"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.680839" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.681536" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.682039" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.682218" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.682384" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.682760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.682624" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:06.682609" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.682971" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.683131" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.683288" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:06.682580" elapsed="0.000761"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.682476" elapsed="0.000891"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.683561" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.683642" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:06.683764" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:06.667741" elapsed="0.016049"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.685043" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.684807" elapsed="0.000298">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:06.685196" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:06.684477" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.685544" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.685290" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.686082" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.685793" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.685626" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.685272" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.688489" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:06.686305" elapsed="0.002211"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:06.688568" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:06.688723" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:06.684144" elapsed="0.004603"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.689931" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.689697" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:06.690084" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:06.689354" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:06.690314" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-05-01T01:00:06.690179" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.690160" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.690551" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.690714" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.690780" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:06.692896" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:06.689043" elapsed="0.003884"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.694413" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.694166" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.694873" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.694633" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:06.703121" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:06.703298" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:06.703429" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:06.697057" elapsed="0.006442"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.694982" elapsed="0.008580"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.703836" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.703602" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.694963" elapsed="0.009044"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.708878" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.705437" elapsed="0.003508"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.705097" elapsed="0.003897"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.705071" elapsed="0.003959"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.712572" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.709412" elapsed="0.003206"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.709111" elapsed="0.003542"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.709086" elapsed="0.003592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.713240" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:06.712834" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.713581" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.713338" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.714114" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.713818" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.713665" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.713320" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.714783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:06.714396" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.715223" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.714881" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.715799" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.715479" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.715308" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.714863" elapsed="0.001021"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:06.716026" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:06.716842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:06.716547" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:06.717016" elapsed="0.002426"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:06.704508" elapsed="0.015015"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.719704" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:06.719596" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.719577" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:06.722603" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:06.719939" elapsed="0.002693"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:06.722685" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:06.722840" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:06.693294" elapsed="0.029572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:06.722929" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:06.723262" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:06.644986" elapsed="0.078313"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.739730" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.739344" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.740498" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.740259" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:06.740661" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:06.739911" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.741220" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:06.740840" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:06.741551" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:06.741691" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:06.741398" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.742103" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:06.741865" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:06.742517" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.742215" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.743024" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:06.742738" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.742601" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.742196" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.743679" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:06.743240" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:06.743756" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:06.738753" elapsed="0.005129"/>
</kw>
<msg time="2026-05-01T01:00:06.743935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:06.737972" elapsed="0.006049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.745813" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.746319" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.746869" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.747049" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.747222" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.747600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.747446" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:06.747432" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.747816" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.747975" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.748155" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:06.747402" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.747299" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.748374" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.748450" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:06.748585" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:06.735317" elapsed="0.013295"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:06.748778" elapsed="0.002192"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:06.751982" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:06.751696" elapsed="0.000315"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:06.752477" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:06.752188" elapsed="0.000318"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:06.752651" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:06.751279" elapsed="0.001758"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.751051" elapsed="0.002025"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:06.753241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:06.753103" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.751032" elapsed="0.002316"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:06.724709" elapsed="0.028690"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:06.723894" elapsed="0.029594"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:06.723488" elapsed="0.030063"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.723433" elapsed="0.030162"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:06.753659" elapsed="0.000077"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:06.636743" elapsed="0.117198"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:06.621912" elapsed="0.132190"/>
</kw>
<msg time="2026-05-01T01:00:06.754188" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:06.754232" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:06.620954" elapsed="0.133301"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:06.754432" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:06.754324" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:06.754306" elapsed="0.000216"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.754958" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:06.754655" elapsed="0.000329"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:06.755420" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.755124" elapsed="0.000376">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:06.620002" elapsed="0.135608">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.814540" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.814096" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.815362" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.815081" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:07.815559" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:07.814747" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.816136" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:07.815744" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.816477" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:07.816645" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:07.816319" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.817069" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.816821" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.818148" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.817872" elapsed="0.000341"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.818825" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:07.818424" elapsed="0.000437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.819430" elapsed="0.000057"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.819911" elapsed="0.000036"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.820149" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:07.819145" elapsed="0.001084"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.818937" elapsed="0.001337"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:07.820342" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T01:00:07.820607" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:07.817551" elapsed="0.003092"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.817232" elapsed="0.003456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.820920" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.820724" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.817172" elapsed="0.003856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.821900" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:07.821245" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:07.822008" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:07.813354" elapsed="0.008829"/>
</kw>
<msg time="2026-05-01T01:00:07.822259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:07.812379" elapsed="0.009952"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.823031" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.823752" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.824739" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.824996" elapsed="0.000031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.825237" elapsed="0.000074"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.825811" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.825617" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:07.825597" elapsed="0.000326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.826108" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.826306" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.826481" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:07.825555" elapsed="0.000981"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.825390" elapsed="0.001172"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.826701" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.826779" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:07.826897" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:07.808068" elapsed="0.018855"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.828149" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.827905" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:07.828306" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:07.827577" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.828659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.828401" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.829203" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.828911" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.828740" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.828382" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.831694" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:07.829483" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:07.831773" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:07.831930" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:07.827244" elapsed="0.004711"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.833161" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.832923" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:07.833347" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:07.832595" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:07.833602" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T01:00:07.833449" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.833429" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.833827" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.833993" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.834059" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:07.835972" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:07.832262" elapsed="0.003737"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.837449" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.837173" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.837903" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.837658" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:07.845106" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:07.845240" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:07.845351" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:07.840220" elapsed="0.005158"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.838015" elapsed="0.007439"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.845655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.845506" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.837995" elapsed="0.007749"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.849137" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.846756" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.846544" elapsed="0.002676"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.846525" elapsed="0.002720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.852600" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.849560" elapsed="0.003105"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.849301" elapsed="0.003413"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.849284" elapsed="0.003465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.853565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:07.852965" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.854031" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.853709" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.854865" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.854407" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.854155" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.853681" elapsed="0.001304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.855740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:07.855200" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.856193" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.855877" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.856959" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.856546" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.856308" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.855850" elapsed="0.001225"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:07.857276" elapsed="0.000595"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:07.858412" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:07.858096" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:07.858607" elapsed="0.002366"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:07.846103" elapsed="0.014934"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.861280" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:07.861168" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.861148" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:07.864217" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:07.861513" elapsed="0.002733"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:07.864299" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:07.864485" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:07.836348" elapsed="0.028165"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:07.864579" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:07.864933" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:07.785188" elapsed="0.079783"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.881865" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.881417" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.882678" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.882404" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:07.882848" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:07.882075" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.883416" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:07.883032" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:07.883756" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:07.883912" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:07.883616" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.884330" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:07.884087" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:07.884748" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.884443" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.885306" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:07.885007" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.884843" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.884424" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.886029" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:07.885544" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:07.886109" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:07.880826" elapsed="0.005411"/>
</kw>
<msg time="2026-05-01T01:00:07.886330" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:07.880035" elapsed="0.006349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.886892" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.887398" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.887913" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.888091" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.888255" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.888644" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.888507" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:07.888491" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.888856" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.889015" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.889173" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:07.888443" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.888336" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.889390" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.889482" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:07.889602" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:07.877332" elapsed="0.012297"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:07.889880" elapsed="0.002392"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:07.893293" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:07.893006" elapsed="0.000314"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:07.893756" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:07.893482" elapsed="0.000303"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:07.893964" elapsed="0.000326"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:07.892606" elapsed="0.001744"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.892356" elapsed="0.002028"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:07.894574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:07.894410" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.892337" elapsed="0.002316"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:07.866416" elapsed="0.028286"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:07.865518" elapsed="0.029259"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:07.865109" elapsed="0.029730"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.865075" elapsed="0.029809"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:07.894949" elapsed="0.000077"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:07.776692" elapsed="0.118545"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:07.758589" elapsed="0.136816"/>
</kw>
<msg time="2026-05-01T01:00:07.895519" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:07.895566" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:07.757561" elapsed="0.138028"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:07.895773" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:07.895662" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:07.895644" elapsed="0.000195"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.896279" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:07.895974" elapsed="0.000330"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:07.896759" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.896446" elapsed="0.000374">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:07.756589" elapsed="0.140343">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.962599" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:08.962186" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:08.963391" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:08.963125" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:08.963581" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:08.962798" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.964232" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:08.963841" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:08.964577" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:08.964737" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:08.964416" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.965163" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.964913" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.966190" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.965934" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.966678" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:08.966390" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.967030" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.967231" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.967403" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:08.966903" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:08.966759" elapsed="0.000778"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:08.967586" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:08.967759" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:08.965600" elapsed="0.002185"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:08.965287" elapsed="0.002530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.967984" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:08.967843" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.965263" elapsed="0.002797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.968662" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:08.968197" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:08.968740" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:08.961546" elapsed="0.007320"/>
</kw>
<msg time="2026-05-01T01:00:08.968920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:08.960703" elapsed="0.008269"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.969478" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.970032" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.970589" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.970772" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.970939" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.971301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:08.971161" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:08.971144" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.971530" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.971693" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.971853" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:08.971113" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:08.971012" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.972071" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:08.972147" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:08.972266" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:08.956371" elapsed="0.015920"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:08.973718" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:08.973475" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:08.973894" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:08.973125" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.974230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:08.973992" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.974917" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:08.974625" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:08.974440" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.973973" elapsed="0.001028"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.977327" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:08.975144" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:08.977405" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:08.977579" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:08.972624" elapsed="0.004979"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:08.978835" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:08.978598" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:08.979026" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:08.978252" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:08.979259" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T01:00:08.979124" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.979105" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.979500" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.979667" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:08.979733" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:08.981639" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:08.977936" elapsed="0.003730"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.983099" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.982852" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.983550" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.983293" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:08.990400" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:08.990559" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:08.990656" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:08.985705" elapsed="0.004976"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:08.983659" elapsed="0.007066"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:08.990897" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:08.990751" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.983641" elapsed="0.007342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.994678" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.991985" elapsed="0.002741"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:08.991773" elapsed="0.002989"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.991754" elapsed="0.003034"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.998626" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:08.995059" elapsed="0.003636"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:08.994844" elapsed="0.003903"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.994827" elapsed="0.003957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:08.999692" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:08.999011" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.000253" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:08.999843" elapsed="0.000523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.001294" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:09.000746" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:09.000415" elapsed="0.000979"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:08.999814" elapsed="0.001613"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.002273" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:09.001679" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.002779" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:09.002418" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.003484" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:09.003170" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:09.002951" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.002391" elapsed="0.001180"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:09.003714" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:09.004526" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:09.004214" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:09.004700" elapsed="0.002359"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:08.991335" elapsed="0.015789"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:09.007304" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:09.007196" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.007175" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:09.010230" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:09.007548" elapsed="0.002711"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:09.010313" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:09.010487" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:08.981988" elapsed="0.028526"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:09.010609" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T01:00:09.010976" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:08.923741" elapsed="0.087273"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.027400" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:09.027023" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:09.028162" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:09.027932" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:09.028326" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:09.027607" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.029157" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:09.028525" elapsed="0.000661"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:09.029509" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:09.029786" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:09.029347" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.030306" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:09.030015" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:09.030754" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:09.030429" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.031286" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:09.030985" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:09.030843" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.030408" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.031975" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:09.031533" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:09.032056" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:09.026408" elapsed="0.005782"/>
</kw>
<msg time="2026-05-01T01:00:09.032245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:09.025603" elapsed="0.006693"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.032803" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.033307" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.033818" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.033996" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.034167" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.034601" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:09.034447" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:09.034431" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.034816" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.035008" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.035221" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:09.034399" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:09.034246" elapsed="0.001059"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.035444" elapsed="0.000040"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:09.035542" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:09.035663" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:09.022952" elapsed="0.012738"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:09.035857" elapsed="0.002383"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:09.039333" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:09.038999" elapsed="0.000362"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:09.039795" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:09.039523" elapsed="0.000299"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:09.039967" elapsed="0.000323"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:09.038594" elapsed="0.001757"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:09.038343" elapsed="0.002041"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:09.040565" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:09.040409" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.038322" elapsed="0.002323"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:09.012330" elapsed="0.028374"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:09.011543" elapsed="0.029273"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:09.011147" elapsed="0.029757"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.011113" elapsed="0.029852"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:09.041035" elapsed="0.000083"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:08.913116" elapsed="0.128220"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:08.899007" elapsed="0.142526"/>
</kw>
<msg time="2026-05-01T01:00:09.041626" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:09.041671" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:08.898436" elapsed="0.143259"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:09.041879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:09.041768" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:09.041750" elapsed="0.000199"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.042487" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:09.042085" elapsed="0.000430"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:09.042961" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:09.042661" elapsed="0.000365">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:08.897778" elapsed="0.145363">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.099384" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.098950" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.100303" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.099986" elapsed="0.000398">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:10.100499" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:10.099642" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.101083" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:10.100690" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.101507" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:10.101685" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:10.101340" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.102119" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.101866" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.103203" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.102943" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.103696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:10.103401" elapsed="0.000321"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.104065" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.104266" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.104436" elapsed="0.000037"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:10.103935" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.103780" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:10.104597" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:10.104774" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:10.102622" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.102257" elapsed="0.002574"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.105001" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.104858" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.102228" elapsed="0.002849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.105758" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:10.105267" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:10.105836" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:10.098229" elapsed="0.007735"/>
</kw>
<msg time="2026-05-01T01:00:10.106022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:10.097261" elapsed="0.008816"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.106884" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.107414" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.107936" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.108136" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.108308" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.108691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.108552" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:10.108537" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.108919" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.109096" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.109283" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:10.108505" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.108384" elapsed="0.000983"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.109525" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.109605" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:10.109731" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:10.092798" elapsed="0.016959"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.111013" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.110763" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:10.111176" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:10.110406" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.111568" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.111308" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.112127" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.111830" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.111653" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.111288" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.114706" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:10.112354" elapsed="0.002379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:10.114788" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:10.114951" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:10.110080" elapsed="0.004895"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.116221" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.115965" elapsed="0.000326">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:10.116385" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:10.115629" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:10.116643" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T01:00:10.116501" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.116481" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.116871" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.117040" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.117106" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:10.120949" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:10.115285" elapsed="0.005693"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.122561" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.122231" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.123003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.122756" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:10.130440" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:10.130651" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:10.130815" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:10.125196" elapsed="0.005656"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.123118" elapsed="0.007796"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.131132" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.130951" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.123096" elapsed="0.008126"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.135874" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.132408" elapsed="0.003539"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.132174" elapsed="0.003829"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.132151" elapsed="0.003891"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.140415" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.136498" elapsed="0.004113"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.136126" elapsed="0.004540"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.136100" elapsed="0.004605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.141703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:10.141002" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.142229" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.141855" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.142807" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.142494" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.142315" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.141826" elapsed="0.001068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.143484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:10.143062" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.143817" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.143587" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.144392" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.144056" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.143901" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.143567" elapsed="0.000953"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:10.144673" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:10.145568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:10.145193" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:10.145749" elapsed="0.002502"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:10.131674" elapsed="0.016649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.148533" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:10.148398" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.148379" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:10.152148" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:10.148774" elapsed="0.003415"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:10.152266" elapsed="0.000057"/>
</return>
<msg time="2026-05-01T01:00:10.152500" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:10.121366" elapsed="0.031163"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:10.152599" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:10.152976" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:10.068764" elapsed="0.084251"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.170739" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.170329" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.171640" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.171347" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:10.171818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:10.171014" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.172416" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:10.172021" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:10.172767" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:10.172935" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:10.172621" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.173365" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:10.173114" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:10.173845" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.173508" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.174372" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:10.174076" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.173938" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.173480" elapsed="0.000993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.175058" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:10.174617" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:10.175139" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:10.169714" elapsed="0.005563"/>
</kw>
<msg time="2026-05-01T01:00:10.175332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:10.168773" elapsed="0.006613"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.175896" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.176426" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.176953" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.177174" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.177341" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.177782" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.177615" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:10.177600" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.178000" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.178162" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.178323" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:10.177566" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.177426" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.178568" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.178648" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:10.178770" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:10.166012" elapsed="0.012785"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:10.178967" elapsed="0.002526"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:10.182629" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:10.182287" elapsed="0.000370"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:10.183077" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:10.182804" elapsed="0.000300"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:10.183251" elapsed="0.000352"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:10.181862" elapsed="0.001803"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.181580" elapsed="0.002117"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:10.183864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:10.183724" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.181560" elapsed="0.002380"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:10.154653" elapsed="0.029338"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:10.153721" elapsed="0.030349"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:10.153170" elapsed="0.031021"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.153131" elapsed="0.031116"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:10.184314" elapsed="0.000084"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:10.060310" elapsed="0.124330"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:10.045535" elapsed="0.139273"/>
</kw>
<msg time="2026-05-01T01:00:10.184901" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:10.184946" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:10.044791" elapsed="0.140177"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:10.185150" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:10.185041" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:10.185023" elapsed="0.000195"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.185682" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:10.185353" elapsed="0.000356"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:10.186242" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.185906" elapsed="0.000432">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:10.044018" elapsed="0.142609">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.241849" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.241439" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.242679" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.242373" elapsed="0.000409">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.242902" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.242048" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.243603" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.243103" elapsed="0.000534"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.244022" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.244286" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.243853" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.244738" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.244489" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.245783" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.245526" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.246286" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.245994" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.246720" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.246925" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.247095" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.246582" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.246368" elapsed="0.000837"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:11.247256" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:11.247509" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:11.245191" elapsed="0.002345"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.244885" elapsed="0.002684"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.247775" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.247597" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.244857" elapsed="0.003000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.248471" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.247994" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.248551" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.240828" elapsed="0.007853"/>
</kw>
<msg time="2026-05-01T01:00:11.248736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.239984" elapsed="0.008805"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.249283" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.249808" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.250338" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.250538" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.250707" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.251068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.250930" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.250914" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.251283" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.251446" elapsed="0.000043"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.251650" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.250885" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.250782" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.251892" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.252004" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:11.252125" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.235703" elapsed="0.016447"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.253623" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.253360" elapsed="0.000330">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.253783" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.252827" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.254142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.253888" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.254709" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.254395" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.254225" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.253866" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.257235" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.254938" elapsed="0.002324"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:11.257314" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:11.257487" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:11.252483" elapsed="0.005030"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.258713" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.258472" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.258870" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.258128" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:11.259103" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:11.258967" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.258948" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.259324" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.259507" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.259576" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:11.261519" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:11.257813" elapsed="0.003733"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.262924" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.262674" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.263354" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.263114" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:11.270749" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:11.270932" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:11.271053" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:11.265588" elapsed="0.005493"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.263480" elapsed="0.007647"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.271315" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.271155" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.263445" elapsed="0.007956"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.276345" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.272612" elapsed="0.003800"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.272285" elapsed="0.004200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.272264" elapsed="0.004260"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.280275" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.276906" elapsed="0.003442"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.276605" elapsed="0.003787"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.276581" elapsed="0.003837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.281000" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.280603" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.281329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.281099" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.281882" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.281584" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.281412" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.281080" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.282497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.282118" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.282821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.282596" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.283350" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.283054" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.282902" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.282578" elapsed="0.000854"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.283594" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:11.284440" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.284134" elapsed="0.000350"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.284635" elapsed="0.002325"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:11.271788" elapsed="0.015236"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.287203" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:11.287094" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.287075" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.290117" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.287417" elapsed="0.002729"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:11.290198" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:11.290360" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:11.261853" elapsed="0.028573"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.290512" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:11.290860" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:11.212715" elapsed="0.078182"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.307596" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.307203" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.308380" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.308136" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.308569" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.307781" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.309132" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.308751" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.309471" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.309780" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.309319" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.310203" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.309957" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:11.310622" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.310317" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.311139" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.310850" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.310709" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.310297" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.311810" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.311362" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.311888" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.306607" elapsed="0.005412"/>
</kw>
<msg time="2026-05-01T01:00:11.312096" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.305777" elapsed="0.006373"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.312699" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.313201" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.313723" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.313905" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.314071" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.314446" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.314309" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.314294" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.314679" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.314841" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.315002" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.314260" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.314150" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.315222" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.315298" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:11.315414" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.302961" elapsed="0.012479"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.315626" elapsed="0.002232"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.318883" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.318594" elapsed="0.000317"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.319324" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.319056" elapsed="0.000327"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-01T01:00:11.319550" elapsed="0.000325"/>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="PASS" start="2026-05-01T01:00:11.318171" elapsed="0.001764"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.317940" elapsed="0.002028"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.320163" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.319993" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.317920" elapsed="0.002323"/>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="PASS" start="2026-05-01T01:00:11.292262" elapsed="0.028029"/>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="PASS" start="2026-05-01T01:00:11.291411" elapsed="0.028953"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.291032" elapsed="0.029395"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.290999" elapsed="0.029492"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.320560" elapsed="0.000077"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-05-01T01:00:11.204373" elapsed="0.116472"/>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="PASS" start="2026-05-01T01:00:11.189651" elapsed="0.131361"/>
</kw>
<msg time="2026-05-01T01:00:11.321104" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:11.321149" level="INFO">${output} = None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:11.188721" elapsed="0.132452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.321359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:11.321245" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.321227" elapsed="0.000198"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.321889" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.321581" elapsed="0.000334"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.322355" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.322060" elapsed="0.000354">None</status>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.187747" elapsed="0.134798">None</status>
</kw>
<msg time="2026-05-01T01:00:11.322637" level="FAIL">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.882458" elapsed="10.440272">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T01:00:11.322782" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.882098" elapsed="10.440733"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some Keywords need several tries to finally fail, this keyword passes if and only if the failure ultimately happens.</doc>
<status status="FAIL" start="2026-05-01T01:00:00.881780" elapsed="10.441150">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-05-01T01:00:11.323039" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T01:00:11.323082" level="INFO">${output} = Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:00.881183" elapsed="10.441923"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T01:00:11.323286" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-05-01T01:00:11.323178" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.323160" elapsed="0.000209"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.323522" elapsed="0.000022"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.323684" elapsed="0.000020"/>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T01:00:00.880804" elapsed="10.442996"/>
</kw>
<msg time="2026-05-01T01:00:11.323849" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:00.880331" elapsed="10.443562"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some positive checks report false success for a short time. This keyword verifies no failure does happen within timeout period.
This implementation needs more complicated logic than, Verify_Keyword_Never_Passes_Within_Timeout,
so use that keyword in case you have a negative check handy.</doc>
<status status="PASS" start="2026-05-01T01:00:00.880012" elapsed="10.443997"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:11.324612" elapsed="0.000445"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:11.324300" elapsed="0.000822"/>
</kw>
<doc>The same logic as Topology_Unauthorized_1, but ODL password became incorrect with new pcc-mock running.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-05-01T01:00:00.878645" elapsed="10.446516"/>
</test>
<test id="s1-s21-t12" name="Set_Correct_Password_2" line="124">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.326664" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.326427" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.326410" elapsed="0.000337"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:11.326234" elapsed="0.000559"/>
</kw>
<kw name="Replace_Password_On_Pcep_Node">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.327758" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | PASSWD=newtopsecret }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>PASSWD=${password}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.327233" elapsed="0.000554"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.349184" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.348806" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.350107" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.349864" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.350277" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.349374" elapsed="0.000929"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.350874" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.350487" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.351194" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.351345" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.351055" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.351784" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.351537" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.352826" level="INFO">mapping: {'IP': '10.30.170.157', 'PASSWD': 'newtopsecret'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.352567" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.353483" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.353025" elapsed="0.000486"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.354169" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.353869" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.355175" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.354702" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.355253" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:11.355413" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.354377" elapsed="0.001060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.355609" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:11.353741" elapsed="0.002201"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.356529" level="INFO">${value} = newtopsecret</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.356188" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.357506" level="INFO">${encoded} = newtopsecret</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.357046" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.357584" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:11.357737" level="INFO">${encoded_value} = newtopsecret</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.356738" elapsed="0.001023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.357906" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSWD</var>
<var name="${value}">newtopsecret</var>
<status status="PASS" start="2026-05-01T01:00:11.356060" elapsed="0.002108"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:11.353565" elapsed="0.004638"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:11.358248" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:11.358400" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'newtopsecret'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:11.352194" elapsed="0.006231"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.351904" elapsed="0.006570"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.358641" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.358500" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.351883" elapsed="0.006834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.359425" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.358851" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.359519" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.348161" elapsed="0.011482"/>
</kw>
<msg time="2026-05-01T01:00:11.359697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.347333" elapsed="0.012411"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.360229" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.360808" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.361304" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.361535" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.361706" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.362061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.361923" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.361909" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.362273" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.362432" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.362609" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.361880" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.361779" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.362826" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.362901" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:11.363019" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.343050" elapsed="0.019994"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.377978" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.377597" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.378806" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.378510" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.378985" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.378169" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.379573" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.379169" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.379891" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.380056" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.379752" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.380515" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;$PASSWD&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.380234" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:11.380941" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.380641" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.381478" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'PASSWD': 'newtopsecret'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.381169" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.381031" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.380617" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.382343" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;newtops...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.381761" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.382426" elapsed="0.000052"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.376984" elapsed="0.005599"/>
</kw>
<msg time="2026-05-01T01:00:11.382639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.376094" elapsed="0.006592"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.383171" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.383686" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.384181" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.384357" elapsed="0.000053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.384590" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.384964" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.384827" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.384813" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.385175" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.385333" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.385505" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.384782" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.384672" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.385726" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.385801" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:11.385921" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;newtops...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.373360" elapsed="0.012626"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.387227" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.386986" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.387385" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.386656" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.387744" elapsed="0.000205"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.387504" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.388512" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.388189" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.388013" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.387485" elapsed="0.001113"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.390970" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.388743" elapsed="0.002254"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:11.391051" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:11.391211" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:11.386316" elapsed="0.004919"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.392876" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.392616" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.393301" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;newtopsecret&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.393066" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.393751" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.393508" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.394172" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.393935" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T01:00:11.395033" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T01:00:11.394830" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T01:00:11.395375" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T01:00:11.395203" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.395559" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.396162" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.395919" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T01:00:11.396248" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:11.396405" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T01:00:11.394413" elapsed="0.002016"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:11.408713" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01wa4zqh2fkawd1hp4tf4uaepnl31.node0', 'Content-Length': '246', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
    &lt;session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"&gt;
        &lt;password&gt;newtopsecret&lt;/password&gt;
    &lt;/session-config&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-05-01T01:00:11.408832" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:11.408928" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:11.398673" elapsed="0.010281"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.396535" elapsed="0.012465"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.409178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.409027" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.396515" elapsed="0.012764"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.417591" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.411548" elapsed="0.006093"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.411005" elapsed="0.006677"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.410961" elapsed="0.006751"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.420351" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.418003" elapsed="0.002393"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.417775" elapsed="0.002656"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.417755" elapsed="0.002717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.421076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.420671" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.421402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.421174" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.421954" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.421657" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.421503" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.421156" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.422567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.422186" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.422885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.422663" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.423403" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.423113" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.422965" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.422646" elapsed="0.000857"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.423652" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:11.424454" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.424154" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.424662" elapsed="0.002313"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:11.410111" elapsed="0.016929"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T01:00:11.427217" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-05-01T01:00:11.427108" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.427090" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.427471" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.427541" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:11.429798" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:11.391766" elapsed="0.038059"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.429891" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:11.430047" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:11.332347" elapsed="0.097787"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.430498" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.430236" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.430219" elapsed="0.000374"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.430627" elapsed="0.000027"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}pcep_topology_node</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T01:00:11.328061" elapsed="0.102693"/>
</kw>
<arg>password=newtopsecret</arg>
<doc>Send restconf PUT to replace the config module specifying PCEP password element.</doc>
<status status="PASS" start="2026-05-01T01:00:11.326932" elapsed="0.103885"/>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:11.431386" elapsed="0.000260"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:11.431082" elapsed="0.000627"/>
</kw>
<doc>Configure password in pcep dispatcher for client with Mininet IP address.
This password again matches what second pcc-mock instance uses.</doc>
<status status="PASS" start="2026-05-01T01:00:11.325508" elapsed="0.106242"/>
</test>
<test id="s1-s21-t13" name="Topology_Intercondition_2" line="129">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.433248" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.433027" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.433010" elapsed="0.000344"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:11.432836" elapsed="0.000581"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.434211" level="INFO">&amp;{mapping} = { IP=10.30.170.157 | CODE=cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE= | NAME=pcc_10.30.170.157_tunnel_1 | IP_ODL=10.30.170.185 | ERRORS= }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>CODE=${pcc_name_code}</arg>
<arg>NAME=${pcc_name}</arg>
<arg>IP_ODL=${ODL_SYSTEM_IP}</arg>
<arg>ERRORS=${ERROR_ARGS}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.433605" elapsed="0.000634"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.473029" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.472627" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.473802" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.473550" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.473972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.473214" elapsed="0.000783"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.474552" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.474150" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.474871" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.475029" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.474731" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.475443" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.475201" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.476437" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.476181" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.476983" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.476705" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.477748" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.477376" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.478669" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.478283" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.478747" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:11.478906" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.477952" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.479076" elapsed="0.000294"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:11.477247" elapsed="0.002163"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.479990" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.479671" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.480930" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.480541" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.481007" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:11.481159" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.480192" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.481326" elapsed="0.000296"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:11.479546" elapsed="0.002117"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.482223" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.481903" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.483297" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.482946" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.483374" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:11.483555" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.482611" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.483745" elapsed="0.000328"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:11.481779" elapsed="0.002335"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.484697" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.484355" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.485654" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.485279" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.485729" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:11.485878" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.484928" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.486048" elapsed="0.000277"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:11.484228" elapsed="0.002137"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.486945" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.486622" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:11.487867" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.487515" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:11.487943" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:11.488094" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:11.487149" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.488313" elapsed="0.000297"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:11.486496" elapsed="0.002156"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:11.477064" elapsed="0.011622"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:11.488730" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:11.488890" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:11.475869" elapsed="0.013085"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.475581" elapsed="0.013406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.489155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.489014" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.475560" elapsed="0.013671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.489851" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.489363" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.489926" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.472018" elapsed="0.018030"/>
</kw>
<msg time="2026-05-01T01:00:11.490102" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.471218" elapsed="0.018931"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.490654" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.491149" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.491850" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.492025" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.492191" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.492563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.492410" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.492395" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.492778" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.492999" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.493160" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.492366" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.492263" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.493377" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.493455" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:11.493589" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.466967" elapsed="0.026648"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.495267" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.494646" elapsed="0.000695">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.495439" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.494244" elapsed="0.001237"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.495799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.495558" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.496335" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.496045" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.495880" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.495537" elapsed="0.000881"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.499060" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.496576" elapsed="0.002510"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:11.499140" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:11.499295" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:11.493932" elapsed="0.005388"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.500636" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.500281" elapsed="0.000408"/>
</kw>
<msg time="2026-05-01T01:00:11.500774" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.499953" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.501028" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:11.500868" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.500850" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.501399" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.501558" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.501231" elapsed="0.000353"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:11.501962" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.501732" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:11.502071" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:11.502231" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:11.499638" elapsed="0.002619"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.503643" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.503378" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.504069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.503832" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:11.511695" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:11.511833" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '123'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:11.511938" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:11.506257" elapsed="0.005707"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.504177" elapsed="0.007830"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.512176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.512032" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.504159" elapsed="0.008106"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.516705" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.513328" elapsed="0.003442"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.513094" elapsed="0.003725"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.513075" elapsed="0.003780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.520509" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.517255" elapsed="0.003319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.516934" elapsed="0.003689"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.516911" elapsed="0.003746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.521472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.520875" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.521927" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.521613" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.522571" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.522249" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.522039" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.521587" elapsed="0.001067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.523163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.522804" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.523497" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.523260" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.524018" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.523728" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.523579" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.523242" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.524247" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:11.525053" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.524765" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:11.525287" elapsed="0.002509"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:11.512634" elapsed="0.015226"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.528037" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:11.527930" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.527911" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.530936" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.528242" elapsed="0.002723"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:11.531019" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:11.531181" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:11.502579" elapsed="0.028628"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.531270" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:11.531420" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:11.442900" elapsed="0.088545"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.547695" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.547301" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.548578" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.548209" elapsed="0.000445">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:11.548748" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:11.547885" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.549340" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:11.548931" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:11.549681" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:11.549855" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:11.549537" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.550278" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:11.550034" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:11.550827" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.550521" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.551350" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:11.551053" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:11.550915" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:11.550498" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.552689" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:11.551592" elapsed="0.001127"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:11.552772" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:11.546642" elapsed="0.006268"/>
</kw>
<msg time="2026-05-01T01:00:11.552995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.545803" elapsed="0.007242"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.553604" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.554347" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.554873" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.555053" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.555220" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.555617" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.555478" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:11.555445" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.555831" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.555990" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.556148" elapsed="0.000071"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:11.555413" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.555301" elapsed="0.000989"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.556432" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.556527" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:11.556745" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:11.543142" elapsed="0.013630"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:11.556941" elapsed="0.002332"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.561308" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.560023" elapsed="0.001317"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:11.561854" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:11.561575" elapsed="0.000307"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:11.562362" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:11.562800" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
-     "network-topology-pcep:path-computation-client": {
-      "ip-address": "10.30.170.157",
-      "reported-lsp": [
-       {
-        "name": "pcc_10.30.170.157_tunnel_1",
-        "path": [
-         {
-          "ero": {
-           "ignore": false,
-           "processing-rule": false,
-           "subobject": [
-            {
-             "ip-prefix": {
-              "ip-prefix": "1.1.1.1/32"
-             },
-             "loose": false
-            }
-           ]
-          },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
-           "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
-           "plsp-id": 1,
-           "processing-rule": false,
-           "remove": false,
-           "sync": true,
-           "tlvs": {
-            "lsp-identifiers": {
-             "ipv4": {
-              "ipv4-extended-tunnel-id": "10.30.170.157",
-              "ipv4-tunnel-endpoint-address": "1.1.1.1",
-              "ipv4-tunnel-sender-address": "10.30.170.157"
-             },
-             "lsp-id": 1,
-             "tunnel-id": 1
-            },
-            "symbolic-path-name": {
-             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
-            }
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.562029" elapsed="0.000943">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.559607" elapsed="0.003544">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:11.559354" elapsed="0.003892">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:11.563431" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:11.563285" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:11.559336" elapsed="0.004194">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.532605" elapsed="0.031075">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.531785" elapsed="0.032082">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:11.531548" elapsed="0.032427">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:11.531531" elapsed="0.032508">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:11.564096" elapsed="0.000019"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.438617" elapsed="0.125635">Multiline strings are different:
--- first
+++ second
@@ -1,110 +1,6 @@
 {
  "network-topology:topology": [
   {
-   "node": [
-    {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
    [ Message content over the limit has been removed. ]
-           }
-          }
-         }
-        ]
-       }
-      ],
-      "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
-      }
-     },
-     "node-id": "pcc://10.30.170.157"
-    }
-   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.607923" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.607526" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.608734" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.608473" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:12.608906" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:12.608126" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.609501" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:12.609089" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.609828" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:12.609992" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:12.609684" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.610435" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.610170" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.611471" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.611190" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.611944" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.611674" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.612712" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.612331" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:12.613657" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.613261" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:12.613737" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:12.613902" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:12.612922" elapsed="0.001006"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.614154" elapsed="0.000360"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:12.612203" elapsed="0.002354"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.615128" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.614803" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:12.616198" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.615840" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:12.616276" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:12.616430" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:12.615497" elapsed="0.000975"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.616620" elapsed="0.000278"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:12.614676" elapsed="0.002263"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.617521" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.617180" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:12.618441" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.618063" elapsed="0.000430"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:12.618545" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:12.618700" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:12.617729" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.618869" elapsed="0.000276"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:12.617055" elapsed="0.002131"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.619767" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.619426" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:12.620681" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.620304" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:12.620757" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:12.620911" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:12.619972" elapsed="0.000963"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.621078" elapsed="0.000282"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:12.619301" elapsed="0.002101"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.621985" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.621663" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:12.622944" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.622590" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:12.623021" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:12.623174" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:12.622189" elapsed="0.001010"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.623342" elapsed="0.000295"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:12.621535" elapsed="0.002143"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:12.612023" elapsed="0.011689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:12.623756" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:12.623915" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:12.610870" elapsed="0.013072"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.610575" elapsed="0.013399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.624141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.624000" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.610552" elapsed="0.013704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.624891" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:12.624397" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:12.624968" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:12.606904" elapsed="0.018188"/>
</kw>
<msg time="2026-05-01T01:00:12.625148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:12.605989" elapsed="0.019207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.625707" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.626211" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.626794" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.626973" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.627137" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.627509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.627356" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:12.627340" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.627720" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.627877" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.628032" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:12.627310" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.627209" elapsed="0.000900"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.628245" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.628320" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:12.628601" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:12.601727" elapsed="0.026901"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.630081" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.629845" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:12.630237" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:12.629512" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.630670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.630333" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.631210" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.630919" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.630753" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.630315" elapsed="0.000979"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.633639" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:12.631437" elapsed="0.002230"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:12.633719" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:12.633875" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:12.628978" elapsed="0.004922"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.635058" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:12.634873" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T01:00:12.635194" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:12.634547" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.635423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:12.635287" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.635269" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.635807" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:12.635932" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:12.635644" elapsed="0.000315"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:12.636333" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.636104" elapsed="0.000255"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:12.636405" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:12.636579" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:12.634200" elapsed="0.002405"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.637958" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.637711" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.638483" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.638151" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:12.645864" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:12.646039" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:12.646144" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:12.640683" elapsed="0.005487"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.638600" elapsed="0.007613"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.646390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.646240" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.638581" elapsed="0.007954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.651365" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.647683" elapsed="0.003761"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.647341" elapsed="0.004175"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.647319" elapsed="0.004233"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.655255" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.651930" elapsed="0.003407"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.651632" elapsed="0.003757"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.651609" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.655996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:12.655606" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.656327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.656097" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.656883" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.656582" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.656410" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.656078" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.657504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:12.657122" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.657828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.657604" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.658363" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.658060" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.657909" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.657585" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:12.658622" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:12.659441" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:12.659156" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:12.659633" elapsed="0.002351"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:12.646899" elapsed="0.015150"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.662226" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:12.662120" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.662101" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:12.665743" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.662434" elapsed="0.003340"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:12.665827" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:12.665987" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:12.636901" elapsed="0.029112"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:12.666077" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:12.666229" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:12.579289" elapsed="0.086967"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.682635" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.682224" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.683417" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.683139" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:12.683604" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:12.682817" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.684162" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:12.683784" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:12.684495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:12.684640" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:12.684344" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.685049" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:12.684811" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:12.685541" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.685241" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.686055" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:12.685762" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:12.685625" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:12.685222" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.687348" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:12.686275" elapsed="0.001103"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:12.687429" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:12.681624" elapsed="0.005951"/>
</kw>
<msg time="2026-05-01T01:00:12.687659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:12.680835" elapsed="0.006872"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.688193" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.688722" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.689223" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.689402" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.689586" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.689946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.689811" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:12.689797" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.690158" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.690322" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.690501" elapsed="0.000057"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:12.689766" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.689663" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.690779" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.690858" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:12.691071" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:12.678056" elapsed="0.013042"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:12.691267" elapsed="0.002409"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:12.695635" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.694396" elapsed="0.001361"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:12.696723" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:12.695910" elapsed="0.000842"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:12.697225" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:12.697771" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.696901" elapsed="0.000959">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.693992" elapsed="0.004040">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:12.693759" elapsed="0.004367">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:12.698306" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:12.698164" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:12.693741" elapsed="0.004645">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.667390" elapsed="0.031191">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.666607" elapsed="0.032166">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:12.666340" elapsed="0.032536">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:12.666323" elapsed="0.032591">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:12.698965" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:12.573667" elapsed="0.125444">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.742577" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.742156" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.743517" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.743236" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:13.743697" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:13.742788" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.744298" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:13.743894" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.744651" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:13.744814" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:13.744503" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.745268" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.745010" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.746368" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.746060" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.746900" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.746593" elapsed="0.000334"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.747872" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.747432" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:13.748821" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.748423" elapsed="0.000425"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:13.748901" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:13.749068" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:13.748085" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.749239" elapsed="0.000350"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:13.747261" elapsed="0.002371"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.750197" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.749873" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:13.751140" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.750752" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:13.751217" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:13.751370" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:13.750401" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.751555" elapsed="0.000282"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:13.749748" elapsed="0.002130"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.753934" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.752118" elapsed="0.001844"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:13.754856" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.754499" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:13.754934" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:13.755106" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:13.754146" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.755276" elapsed="0.000326"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:13.751993" elapsed="0.003697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.756265" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.755935" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:13.757180" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.756822" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:13.757257" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:13.757414" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:13.756488" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.757620" elapsed="0.000277"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:13.755807" elapsed="0.002131"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.758561" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.758176" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:13.759515" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.759141" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:13.759593" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:13.759745" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:13.758766" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.759914" elapsed="0.000276"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:13.758052" elapsed="0.002179"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:13.746994" elapsed="0.013271"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:13.760308" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:13.760492" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:13.745723" elapsed="0.014818"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.745400" elapsed="0.015188"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.760800" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.760617" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.745375" elapsed="0.015524"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.761581" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:13.761040" elapsed="0.000583"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:13.761691" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:13.741520" elapsed="0.020306"/>
</kw>
<msg time="2026-05-01T01:00:13.761882" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:13.740588" elapsed="0.021345"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.762425" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.762974" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.763680" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.763870" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.764037" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.764394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.764256" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:13.764241" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.764622" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.764779" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.764934" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:13.764212" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.764111" elapsed="0.000901"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.765147" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.765221" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:13.765342" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:13.735908" elapsed="0.029462"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.766665" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.766393" elapsed="0.000344">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:13.766828" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:13.766062" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.767189" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.766923" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.767963" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.767435" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.767270" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.766905" elapsed="0.001143"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.770424" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:13.768192" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:13.770520" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:13.770678" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:13.765746" elapsed="0.004956"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.771930" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:13.771741" elapsed="0.000242"/>
</kw>
<msg time="2026-05-01T01:00:13.772066" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:13.771394" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.772299" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:13.772160" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.772142" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.772722" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:13.772875" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:13.772557" elapsed="0.000344"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:13.773278" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.773048" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:13.773355" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:13.773530" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:13.771040" elapsed="0.002516"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.774914" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.774668" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.775359" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.775103" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:13.783591" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:13.783764" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:13.783881" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:13.777539" elapsed="0.006368"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.775484" elapsed="0.008466"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.784122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.783976" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.775451" elapsed="0.008756"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.787676" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.785203" elapsed="0.002561"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.784990" elapsed="0.002810"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.784972" elapsed="0.002854"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.790423" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.788100" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.787884" elapsed="0.002636"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.787866" elapsed="0.002679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.791087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:13.790704" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.791429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.791184" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.791981" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.791682" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.791527" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.791167" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.792597" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:13.792219" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.792918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.792694" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.793442" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.793150" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.792999" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.792676" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:13.793689" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:13.794487" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:13.794187" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:13.794661" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:13.784570" elapsed="0.012669"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.797414" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:13.797309" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.797290" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:13.800875" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.797640" elapsed="0.003265"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:13.800958" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:13.801117" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:13.773853" elapsed="0.027290"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:13.801206" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:13.801358" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:13.712729" elapsed="0.088654"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.817766" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.817376" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.818572" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.818268" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:13.818738" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:13.817948" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.819303" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:13.818920" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:13.819670" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:13.819817" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:13.819529" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.820232" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:13.819992" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:13.820715" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.820412" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.821227" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:13.820934" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:13.820798" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:13.820393" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.822519" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:13.821448" elapsed="0.001100"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:13.822598" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:13.816779" elapsed="0.005945"/>
</kw>
<msg time="2026-05-01T01:00:13.822808" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:13.815993" elapsed="0.006863"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.823359" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.824059" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.824573" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.824752" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.824916" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.825280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.825145" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:13.825130" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.825513" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.825676" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.825836" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:13.825099" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.824993" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.826089" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.826166" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:13.826377" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:13.813290" elapsed="0.013114"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:13.826594" elapsed="0.002256"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:13.830762" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.829584" elapsed="0.001209"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:13.831762" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:13.830943" elapsed="0.000847"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:13.832265" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:13.832815" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.831939" elapsed="0.000965">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.829164" elapsed="0.003911">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:13.828930" elapsed="0.004239">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:13.833350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:13.833208" elapsed="0.000200"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:13.828912" elapsed="0.004519">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.802531" elapsed="0.031097">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.801719" elapsed="0.032084">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:13.801483" elapsed="0.032424">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:13.801449" elapsed="0.032496">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:13.833996" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:13.706836" elapsed="0.127305">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.876923" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.876534" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.877817" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.877553" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:14.877987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:14.877120" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.878583" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:14.878172" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.878905" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:14.879062" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:14.878764" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.879542" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.879275" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.880549" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.880271" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.881011" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.880745" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.881770" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.881397" elapsed="0.000399"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:14.882710" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.882315" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:14.882799" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:14.882960" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:14.881979" elapsed="0.001007"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.883131" elapsed="0.000308"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:14.881269" elapsed="0.002229"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.884065" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.883740" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:14.885214" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.884858" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:14.885291" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:14.885448" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:14.884515" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.885640" elapsed="0.000277"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:14.883614" elapsed="0.002344"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.886544" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.886198" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:14.887630" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.887212" elapsed="0.000444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:14.887707" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:14.887859" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:14.886875" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.888025" elapsed="0.000275"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:14.886074" elapsed="0.002304"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.888969" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.888638" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:14.889893" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.889537" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:14.889970" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:14.890121" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:14.889180" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.890288" elapsed="0.000294"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:14.888512" elapsed="0.002112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.891179" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.890861" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:14.892125" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.891775" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:14.892201" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:14.892354" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:14.891410" elapsed="0.000968"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.892538" elapsed="0.000281"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:14.890737" elapsed="0.002123"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:14.881091" elapsed="0.011802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:14.892937" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:14.893101" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:14.879959" elapsed="0.013168"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.879666" elapsed="0.013492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.893326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.893186" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.879642" elapsed="0.013766"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.894051" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:14.893562" elapsed="0.000516"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:14.894126" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:14.875904" elapsed="0.018346"/>
</kw>
<msg time="2026-05-01T01:00:14.894304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:14.875004" elapsed="0.019348"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.894914" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.895451" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.895995" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.896173" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.896337" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.896714" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.896578" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:14.896563" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.896929" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.897088" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.897244" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:14.896533" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.896415" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.897471" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.897549" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:14.897666" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:14.870696" elapsed="0.026995"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.899149" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.898909" elapsed="0.000307">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:14.899330" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:14.898575" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.899684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.899432" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.900219" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.899930" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.899764" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.899414" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.902672" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:14.900483" elapsed="0.002215"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:14.902750" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:14.902904" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:14.898003" elapsed="0.004926"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.904138" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:14.903952" elapsed="0.000239"/>
</kw>
<msg time="2026-05-01T01:00:14.904274" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:14.903628" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.904521" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:14.904368" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.904350" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.904889" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:14.905021" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:14.904725" elapsed="0.000322"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:14.905425" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.905195" elapsed="0.000271"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:14.905516" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:14.905672" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:14.903265" elapsed="0.002433"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.907049" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.906807" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.907513" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.907238" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:14.916237" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:14.916494" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:14.916597" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:14.909681" elapsed="0.006942"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.907623" elapsed="0.009042"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.916834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.916690" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.907605" elapsed="0.009313"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.920798" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.917911" elapsed="0.003008"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.917701" elapsed="0.003269"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.917684" elapsed="0.003322"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.924669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.921388" elapsed="0.003346"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.921087" elapsed="0.003696"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.921064" elapsed="0.003754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.925592" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:14.925037" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.926046" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.925731" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.926860" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.926416" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.926161" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.925706" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.927755" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:14.927191" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.928207" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.927893" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.928812" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.928519" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.928320" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.927868" elapsed="0.001028"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:14.929040" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:14.929837" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:14.929558" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:14.930010" elapsed="0.002336"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:14.917263" elapsed="0.015146"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.932603" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:14.932496" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.932476" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:14.936022" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.932809" elapsed="0.003242"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:14.936104" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:14.936261" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:14.905996" elapsed="0.030292"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:14.936351" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:14.936521" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:14.848113" elapsed="0.088435"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.952590" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.952196" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.953359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.953091" elapsed="0.000334">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:14.953544" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:14.952771" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.954256" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:14.953725" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:14.954597" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:14.954735" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:14.954441" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.955151" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:14.954909" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:14.955642" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.955331" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.956154" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:14.955863" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:14.955726" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:14.955313" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.957425" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:14.956374" elapsed="0.001095"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:14.957522" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:14.951600" elapsed="0.006050"/>
</kw>
<msg time="2026-05-01T01:00:14.957734" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:14.950797" elapsed="0.006985"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.958261" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.958783" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.959279" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.959470" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.959661" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.960014" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.959881" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:14.959868" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.960222" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.960379" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.960553" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:14.959839" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.959737" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.960807" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.960884" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:14.961095" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:14.948149" elapsed="0.012973"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:14.961290" elapsed="0.002254"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:14.965428" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.964250" elapsed="0.001225"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:14.966411" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:14.965623" elapsed="0.000816"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:14.966933" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:14.967482" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.966605" elapsed="0.000990">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.963853" elapsed="0.003918">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:14.963625" elapsed="0.004238">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:14.968040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:14.967901" elapsed="0.000195"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:14.963607" elapsed="0.004512">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.937666" elapsed="0.030622">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.936862" elapsed="0.031613">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:14.936632" elapsed="0.031951">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:14.936615" elapsed="0.032005">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:14.968671" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:14.841969" elapsed="0.126847">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.006490" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.006084" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.007348" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.007097" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:16.007550" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:16.006686" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.008123" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:16.007735" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.008454" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:16.008623" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:16.008304" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.009044" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.008797" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.010050" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.009789" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.010532" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.010250" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.011300" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.010945" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:16.012234" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.011867" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:16.012313" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:16.012492" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:16.011531" elapsed="0.000987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.012664" elapsed="0.000294"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:16.010789" elapsed="0.002212"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.013746" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.013242" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:16.014666" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.014290" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:16.014743" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:16.014896" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:16.013955" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.015084" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:16.013116" elapsed="0.002289"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.015987" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.015662" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:16.016902" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.016547" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:16.016979" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:16.017132" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:16.016193" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.017300" elapsed="0.000297"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:16.015536" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.018251" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.017927" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:16.019196" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.018809" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:16.019273" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:16.019427" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:16.018474" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.019613" elapsed="0.000281"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:16.017799" elapsed="0.002136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.020534" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.020175" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:16.021425" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.021071" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:16.021522" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:16.021677" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:16.020739" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.021847" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:16.020051" elapsed="0.002114"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:16.010611" elapsed="0.011588"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:16.022244" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:16.022405" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:16.009469" elapsed="0.012963"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.009165" elapsed="0.013316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.022649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.022507" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.009143" elapsed="0.013584"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.023410" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:16.022916" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:16.023509" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:16.005481" elapsed="0.018155"/>
</kw>
<msg time="2026-05-01T01:00:16.023691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:16.004626" elapsed="0.019112"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.024227" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.024803" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.025345" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.025539" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.025707" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.026060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.025925" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:16.025910" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.026273" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.026432" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.026607" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:16.025881" elapsed="0.000779"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.025780" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.026823" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.026899" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:16.027049" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:16.000355" elapsed="0.026720"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.028562" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.028268" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:16.028721" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:16.027938" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.029054" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.028818" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.029610" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.029300" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.029136" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.028800" elapsed="0.000895"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.032019" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:16.029838" elapsed="0.002208"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:16.032097" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:16.032252" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:16.027620" elapsed="0.004657"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.033484" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:16.033283" elapsed="0.000255"/>
</kw>
<msg time="2026-05-01T01:00:16.033623" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:16.032956" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.033854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:16.033719" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.033700" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.034222" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:16.034347" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:16.034057" elapsed="0.000315"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:16.034768" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.034537" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:16.034842" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:16.035028" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:16.032639" elapsed="0.002416"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.036409" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.036165" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.036858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.036617" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:16.043902" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:16.044067" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:16.044168" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:16.039015" elapsed="0.005179"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.036969" elapsed="0.007267"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.044411" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.044262" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.036950" elapsed="0.007574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.049304" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.045571" elapsed="0.003821"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.045299" elapsed="0.004129"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.045281" elapsed="0.004189"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.052094" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.049749" elapsed="0.002392"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.049531" elapsed="0.002646"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.049514" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.052765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:16.052360" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.053093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.052864" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.053649" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.053328" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.053176" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.052846" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.054254" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:16.053888" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.054595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.054352" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.055139" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.054830" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.054678" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.054335" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:16.055368" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:16.056177" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:16.055897" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:16.056351" elapsed="0.002339"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:16.044881" elapsed="0.013873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.058930" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:16.058824" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.058806" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:16.062354" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.059165" elapsed="0.003220"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:16.062439" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T01:00:16.062625" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:16.035355" elapsed="0.027298"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:16.062717" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:16.062867" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:15.977995" elapsed="0.084899"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.079042" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.078666" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.079852" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.079585" elapsed="0.000332">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:16.080011" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:16.079244" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.080603" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:16.080191" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:16.080920" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:16.081055" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:16.080786" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.081647" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:16.081229" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:16.082114" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.081829" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.082656" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:16.082338" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:16.082198" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:16.081810" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.083959" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:16.082882" elapsed="0.001108"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:16.084041" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:16.078040" elapsed="0.006131"/>
</kw>
<msg time="2026-05-01T01:00:16.084254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:16.077257" elapsed="0.007047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.084810" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.085313" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.085841" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.086021" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.086188" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.086566" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.086411" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:16.086394" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.086782" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.086945" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.087106" elapsed="0.000071"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:16.086365" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.086263" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.087384" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.087475" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:16.087690" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:16.074568" elapsed="0.013149"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:16.087887" elapsed="0.002216"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:16.092045" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.090831" elapsed="0.001243"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:16.093026" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:16.092222" elapsed="0.000832"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:16.093551" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:16.094084" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
-       "reply-time": {
-        "average-time": 0,
-        "max-time": 0,
-        "min-time": 0
-       },
-       "sent-msg-count": 0,
-       "unknown-msg-received": 0
-      },
-      "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
-      },
-      "peer-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.157",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "session-duration": "*",
-      "synchronized": true
-     },
      "network-topology-pcep:path-computation-client": {
       "ip-address": "10.30.170.157",
       "reported-lsp": [
@@ -63,18 +22,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +49,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.093203" elapsed="0.000969">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.090412" elapsed="0.003931">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:16.090183" elapsed="0.004255">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:16.094654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:16.094510" elapsed="0.000201"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:16.090165" elapsed="0.004570">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.064031" elapsed="0.030877">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:16.063222" elapsed="0.031859">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:16.062976" elapsed="0.032226">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:16.062959" elapsed="0.032282">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:16.095292" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:15.973633" elapsed="0.121803">Multiline strings are different:
--- first
+++ second
@@ -3,47 +3,6 @@
   {
    "node": [
     {
-     "network-pcep-topology-stats:pcep-session-state": {
-      "delegated-lsps-count": 1,
-      "local-pref": {
-       "deadtimer": 120,
-       "ip-address": "10.30.170.185",
-       "keepalive": 30,
-       "session-id": "*"
-      },
-      "messages": {
-       "error-messages": {
-        "received-error-msg-count": 0,
-        "sent-error-msg-count": 0
-       },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.139257" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.138868" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.140125" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.139873" elapsed="0.000325">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:17.140294" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:17.139474" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.140881" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:17.140495" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.141203" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:17.141358" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:17.141061" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.141797" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.141551" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.142838" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.142577" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.143303" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.143038" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.144058" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.143705" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:17.144999" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.144627" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:17.145078" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:17.145240" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:17.144266" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.145412" elapsed="0.000322"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:17.143577" elapsed="0.002199"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.146538" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.146018" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:17.147439" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.147080" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:17.147533" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:17.147688" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:17.146744" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.147857" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:17.145892" elapsed="0.002286"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.148763" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.148418" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:17.149677" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.149297" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:17.149753" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:17.149906" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:17.148965" elapsed="0.000966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.150074" elapsed="0.000311"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:17.148292" elapsed="0.002185"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.151047" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.150723" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:17.151957" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.151599" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:17.152033" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:17.152187" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:17.151251" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.152353" elapsed="0.000299"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:17.150596" elapsed="0.002097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.153252" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.152932" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:17.154183" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.153826" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:17.154280" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:17.154435" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:17.153491" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.154620" elapsed="0.000278"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:17.152807" elapsed="0.002132"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:17.143380" elapsed="0.011593"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:17.155017" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:17.155177" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:17.142243" elapsed="0.012960"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.141918" elapsed="0.013318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.155404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.155262" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.141896" elapsed="0.013604"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.156110" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:17.155639" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:17.156187" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:17.138245" elapsed="0.018068"/>
</kw>
<msg time="2026-05-01T01:00:17.156367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:17.137353" elapsed="0.019061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.156927" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.157430" elapsed="0.000097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.158047" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.158261" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.158430" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.158811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.158673" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:17.158658" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.159025" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.159185" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.159343" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:17.158629" elapsed="0.000767"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.158526" elapsed="0.000897"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.159756" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.159835" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:17.159953" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:17.133097" elapsed="0.026882"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.161422" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.161184" elapsed="0.000367">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:17.161646" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:17.160851" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.161979" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.161742" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.162567" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.162249" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.162059" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.161724" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.164981" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:17.162795" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:17.165060" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:17.165215" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:17.160531" elapsed="0.004709"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.166487" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:17.166282" elapsed="0.000260"/>
</kw>
<msg time="2026-05-01T01:00:17.166628" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:17.165920" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.166864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:17.166725" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.166706" elapsed="0.000227"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.167238" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:17.167364" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:17.167071" elapsed="0.000319"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:17.167795" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.167561" elapsed="0.000261"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:17.167870" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:17.168027" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:17.165600" elapsed="0.002453"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.169419" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.169174" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.169863" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.169624" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:17.177352" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:17.179129" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:17.179284" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:17.172031" elapsed="0.007290"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.169971" elapsed="0.009409"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.179643" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.179417" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.169953" elapsed="0.009851"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.184925" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.181205" elapsed="0.003805"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.180909" elapsed="0.004150"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.180884" elapsed="0.004212"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.188519" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.185493" elapsed="0.003074"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.185175" elapsed="0.003428"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.185152" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.189173" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:17.188788" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.189524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.189273" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.190063" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.189762" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.189607" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.189254" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.190701" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:17.190321" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.191023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.190799" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.191569" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.191257" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.191105" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.190781" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:17.191796" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:17.192602" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:17.192300" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:17.192774" elapsed="0.002355"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:17.180292" elapsed="0.014899"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.195367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:17.195262" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.195244" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:17.199120" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.195600" elapsed="0.003550"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:17.199237" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:17.199399" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:17.168355" elapsed="0.031071"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:17.199510" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:17.199663" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:17.110688" elapsed="0.089002"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.215821" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.215436" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.216607" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.216318" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:17.216764" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:17.216001" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.217495" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:17.216943" elapsed="0.000581"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:17.217814" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:17.217952" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:17.217678" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.218401" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:17.218126" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:17.218897" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.218610" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.219413" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:17.219120" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:17.218981" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:17.218591" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.220692" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:17.219656" elapsed="0.001065"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:17.220772" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:17.214844" elapsed="0.006058"/>
</kw>
<msg time="2026-05-01T01:00:17.220986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:17.214026" elapsed="0.007009"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.221548" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.222050" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.222584" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.222763" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.222924" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.223278" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.223144" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:17.223129" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.223506" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.223667" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.223825" elapsed="0.000049"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:17.223099" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.222998" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.224077" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.224153" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:17.224364" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:17.211413" elapsed="0.012978"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:17.224583" elapsed="0.002247"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:17.228721" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.227558" elapsed="0.001193"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:17.230036" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:17.228898" elapsed="0.001167"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:17.230584" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:17.231189" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.230213" elapsed="0.001062">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.227143" elapsed="0.004310">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:17.226912" elapsed="0.004652">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:17.231745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:17.231603" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:17.226894" elapsed="0.004930">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.200815" elapsed="0.031194">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.200005" elapsed="0.032178">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:17.199774" elapsed="0.032515">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:17.199757" elapsed="0.032571">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:17.232379" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:17.104408" elapsed="0.128156">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.284833" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.284422" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.285666" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.285382" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:18.285842" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:18.285035" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.286411" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:18.286027" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.286759" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:18.286930" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:18.286614" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.287353" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.287109" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.288408" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.288142" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.288902" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.288631" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.289724" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.289341" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:18.290671" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.290271" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:18.290753" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:18.290922" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:18.289933" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.291095" elapsed="0.000304"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:18.289209" elapsed="0.002232"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.292548" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.291841" elapsed="0.000746"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:18.293562" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.293183" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:18.293640" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:18.293793" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:18.292793" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.293976" elapsed="0.000299"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:18.291578" elapsed="0.002740"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.294927" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.294599" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:18.295900" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.295547" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:18.295976" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:18.296131" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:18.295132" elapsed="0.001024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.296298" elapsed="0.000306"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:18.294433" elapsed="0.002213"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.297245" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.296883" elapsed="0.000388"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:18.298187" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.297830" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:18.298264" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:18.298433" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:18.297449" elapsed="0.001047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.298642" elapsed="0.000313"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:18.296760" elapsed="0.002248"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.299652" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.299295" elapsed="0.000383"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:18.300635" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.300201" elapsed="0.000643"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:18.300910" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:18.301126" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:18.299867" elapsed="0.001292"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.301327" elapsed="0.000344"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:18.299134" elapsed="0.002593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:18.288987" elapsed="0.012788"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:18.301829" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:18.302011" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:18.287818" elapsed="0.014225"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.287506" elapsed="0.014571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.302260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.302109" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.287478" elapsed="0.014860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.303047" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:18.302531" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:18.303123" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:18.283815" elapsed="0.019435"/>
</kw>
<msg time="2026-05-01T01:00:18.303308" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:18.282900" elapsed="0.020465"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.303904" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.304476" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.304971" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.305183" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.305354" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.305746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.305610" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:18.305593" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.305958" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.306116" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.306272" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:18.305559" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.305433" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.306568" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.306646" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:18.306769" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:18.278595" elapsed="0.028200"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.308338" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.308057" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:18.308534" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:18.307714" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.308872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.308630" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.309544" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.309211" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.308953" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.308612" elapsed="0.001016"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.312093" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:18.309771" elapsed="0.002350"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:18.312229" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:18.312391" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:18.307368" elapsed="0.005047"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.313652" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:18.313430" elapsed="0.000277"/>
</kw>
<msg time="2026-05-01T01:00:18.313790" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:18.313056" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.314030" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:18.313893" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.313874" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.314397" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:18.314688" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:18.314232" elapsed="0.000483"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:18.315107" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.314866" elapsed="0.000267"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:18.315181" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:18.315336" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:18.312741" elapsed="0.002620"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.316776" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.316524" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.317227" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.316964" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:18.324858" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:18.325066" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:18.325208" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:18.319411" elapsed="0.005825"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.317337" elapsed="0.007944"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.325484" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.325309" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.317319" elapsed="0.008305"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.329388" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.326666" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.326432" elapsed="0.003080"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.326413" elapsed="0.003139"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.333546" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.330028" elapsed="0.003588"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.329707" elapsed="0.003960"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.329679" elapsed="0.004025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.334545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:18.333948" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.335055" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.334698" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.335875" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.335404" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.335176" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.334667" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.336775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:18.336223" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.337281" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.336917" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.337885" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.337591" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.337400" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.336891" elapsed="0.001077"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:18.338114" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:18.338933" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:18.338633" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:18.339105" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:18.325992" elapsed="0.015552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.341725" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:18.341616" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.341598" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:18.345576" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.341934" elapsed="0.003715"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:18.345705" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:18.345875" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:18.315698" elapsed="0.030204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:18.345966" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:18.346120" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:18.250299" elapsed="0.095848"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.362435" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.362066" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.363261" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.362960" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:18.363429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:18.362639" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.364018" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:18.363632" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:18.364335" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:18.364518" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:18.364197" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.364937" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:18.364693" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:18.365437" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.365128" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.365975" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:18.365680" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:18.365543" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:18.365109" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.367252" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:18.366195" elapsed="0.001087"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:18.367332" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:18.361469" elapsed="0.006011"/>
</kw>
<msg time="2026-05-01T01:00:18.367567" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:18.360650" elapsed="0.006967"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.368097" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.368615" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.369110" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.369318" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.369498" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.369865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.369730" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:18.369715" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.370072" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.370227" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.370383" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:18.369685" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.369579" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.370657" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.370734" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:18.370944" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:18.357907" elapsed="0.013064"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:18.371139" elapsed="0.003674"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:18.376838" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.375600" elapsed="0.001269"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:18.378210" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:18.377025" elapsed="0.001215"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:18.378781" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:18.379373" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.378393" elapsed="0.001084">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.375144" elapsed="0.004514">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:18.374896" elapsed="0.004857">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:18.379935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:18.379793" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:18.374877" elapsed="0.005138">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.347357" elapsed="0.032834">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.346499" elapsed="0.033864">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:18.346232" elapsed="0.034249">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:18.346215" elapsed="0.034307">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:18.380574" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:18.242777" elapsed="0.137942">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.425403" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.425013" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.426191" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.425942" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:19.426361" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:19.425617" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.427147" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:19.426561" elapsed="0.000615"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.427491" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:19.427662" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:19.427334" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.428092" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.427842" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.429100" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.428840" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.429583" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.429298" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.430326" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.429969" elapsed="0.000383"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:19.431308" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.430900" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:19.431389" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T01:00:19.431588" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:19.430553" elapsed="0.001060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.431794" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:19.429842" elapsed="0.002290"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.432716" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.432374" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:19.433626" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.433253" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:19.433703" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:19.433855" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:19.432919" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.434024" elapsed="0.000278"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:19.432249" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.434925" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.434603" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:19.435904" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.435535" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:19.435981" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:19.436134" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:19.435130" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.436302" elapsed="0.000295"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:19.434474" elapsed="0.002165"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.437202" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.436878" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:19.438113" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.437760" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:19.438191" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:19.438344" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:19.437408" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.438527" elapsed="0.000280"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:19.436753" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.439627" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.439087" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:19.440583" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.440211" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:19.440660" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:19.440814" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:19.439879" elapsed="0.000959"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.440981" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:19.438963" elapsed="0.002339"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:19.429662" elapsed="0.011674"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:19.441379" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:19.441555" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:19.428524" elapsed="0.013058"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.428214" elapsed="0.013399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.441782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.441640" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.428192" elapsed="0.013667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.442482" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:19.441993" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:19.442559" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:19.424397" elapsed="0.018287"/>
</kw>
<msg time="2026-05-01T01:00:19.442738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:19.423508" elapsed="0.019278"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.443274" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.443890" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.444387" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.444581" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.444746" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.445096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.444961" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:19.444947" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.445304" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.445479" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.445639" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:19.444919" elapsed="0.000772"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.444819" elapsed="0.000898"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.445852" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.445926" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:19.446043" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:19.419197" elapsed="0.026871"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.447274" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.447039" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:19.447430" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:19.446715" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.447852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.447583" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.448395" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.448103" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.447935" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.447564" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.451033" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:19.448638" elapsed="0.002422"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:19.451150" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:19.451312" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:19.446382" elapsed="0.004955"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.452532" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:19.452323" elapsed="0.000263"/>
</kw>
<msg time="2026-05-01T01:00:19.452671" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:19.451993" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.452903" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:19.452767" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.452748" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.453271" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:19.453405" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:19.453106" elapsed="0.000325"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:19.453828" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.453595" elapsed="0.000260"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:19.453902" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:19.454056" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:19.451661" elapsed="0.002420"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.455436" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.455190" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.455911" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.455640" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:19.463495" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:19.463688" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:19.463861" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:19.458130" elapsed="0.005758"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.456021" elapsed="0.007910"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.464105" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.463958" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.456003" elapsed="0.008224"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.468980" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.465534" elapsed="0.003529"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.465217" elapsed="0.003894"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.465191" elapsed="0.003956"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.472912" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.469548" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.469226" elapsed="0.003800"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.469202" elapsed="0.003860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.473839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:19.473282" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.474294" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.473977" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.475056" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.474641" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.474408" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.473952" elapsed="0.001222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.475960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:19.475385" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.476406" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.476095" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.476995" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.476702" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.476539" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.476071" elapsed="0.001007"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:19.477219" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:19.478021" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:19.477737" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:19.478193" elapsed="0.002518"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:19.464627" elapsed="0.016147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.480950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:19.480844" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.480826" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:19.485325" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.481154" elapsed="0.004247"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:19.485487" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:19.485844" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:19.454380" elapsed="0.031495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:19.485948" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:19.486120" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:19.395784" elapsed="0.090366"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.503590" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.503193" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.504430" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.504129" elapsed="0.000398">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:19.504624" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:19.503774" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.505194" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:19.504810" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:19.505574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:19.505725" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:19.505399" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.506148" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:19.505904" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:19.506674" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.506355" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.507199" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:19.506900" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:19.506760" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:19.506328" elapsed="0.000958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.508560" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:19.507431" elapsed="0.001167"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:19.508652" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:19.502556" elapsed="0.006229"/>
</kw>
<msg time="2026-05-01T01:00:19.508870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:19.501733" elapsed="0.007187"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.509404" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.510148" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.510673" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.510877" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.511044" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.511408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.511274" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:19.511260" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.511640" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.511821" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.512007" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:19.511229" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.511124" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.512266" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.512344" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:19.512577" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:19.499003" elapsed="0.013601"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:19.512776" elapsed="0.002293"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:19.517098" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.515883" elapsed="0.001245"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:19.518492" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:19.517278" elapsed="0.001248"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:19.519013" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:19.519644" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.518678" elapsed="0.001059">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.515425" elapsed="0.004512">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:19.515169" elapsed="0.004868">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:19.520220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:19.520077" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:19.515142" elapsed="0.005158">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.487436" elapsed="0.033059">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.486528" elapsed="0.034165">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:19.486247" elapsed="0.034559">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:19.486225" elapsed="0.034622">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:19.520899" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:19.390001" elapsed="0.131045">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.564244" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.563841" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.565058" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.564787" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:20.565230" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:20.564442" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.565820" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:20.565412" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.566179" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:20.566469" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:20.566035" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.566898" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.566653" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.567911" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.567653" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.568370" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.568106" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.569131" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.568777" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:20.570105" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.569707" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:20.570186" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:20.570346" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:20.569337" elapsed="0.001035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.570536" elapsed="0.000332"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:20.568649" elapsed="0.002261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.571493" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.571153" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:20.572603" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.572210" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:20.572682" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:20.572835" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:20.571842" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.573005" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:20.571027" elapsed="0.002299"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.573907" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.573583" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:20.574974" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.574613" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:20.575052" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:20.575206" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:20.574179" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.575376" elapsed="0.000298"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:20.573441" elapsed="0.002275"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.576283" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.575957" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:20.577203" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.576845" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:20.577280" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:20.577432" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:20.576506" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.577619" elapsed="0.000278"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:20.575831" elapsed="0.002136"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.578645" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.578210" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:20.579695" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.579286" elapsed="0.000436"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:20.579771" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:20.579922" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:20.578883" elapsed="0.001064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.580090" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:20.578083" elapsed="0.002325"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:20.568448" elapsed="0.011993"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:20.580505" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:20.580665" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:20.567322" elapsed="0.013369"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.567021" elapsed="0.013701"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.580892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.580749" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.566998" elapsed="0.013969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.581599" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:20.581103" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:20.581674" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:20.563222" elapsed="0.018577"/>
</kw>
<msg time="2026-05-01T01:00:20.581853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:20.562331" elapsed="0.019571"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.582438" elapsed="0.000085"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.583036" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.583544" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.583721" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.583886" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.584242" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.584107" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:20.584092" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.584467" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.584628" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.584784" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:20.584062" elapsed="0.000773"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.583960" elapsed="0.000901"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.584997" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.585072" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:20.585190" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:20.558114" elapsed="0.027102"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.586716" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.586410" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:20.586881" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:20.586077" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.587211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.586975" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.587761" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.587470" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.587291" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.586957" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.590191" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:20.587984" elapsed="0.002233"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:20.590301" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:20.590492" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:20.585545" elapsed="0.004973"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.591663" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:20.591469" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T01:00:20.591799" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:20.591129" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.592028" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:20.591893" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.591875" elapsed="0.000219"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.592394" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:20.592554" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:20.592230" elapsed="0.000350"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:20.592957" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.592727" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:20.593030" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:20.593185" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:20.590816" elapsed="0.002394"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.594657" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.594390" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.595083" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.594845" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:20.602144" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:20.602336" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:20.602442" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:20.597221" elapsed="0.005268"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.595191" elapsed="0.007340"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.602735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.602562" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.595173" elapsed="0.007680"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.606476" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.603850" elapsed="0.002688"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.603640" elapsed="0.002935"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.603622" elapsed="0.002994"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.610221" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.606996" elapsed="0.003291"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.606697" elapsed="0.003638"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.606674" elapsed="0.003696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.611146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:20.610614" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.611623" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.611284" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.612372" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.611953" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.611739" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.611260" elapsed="0.001253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.613248" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:20.612723" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.613775" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.613383" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.614695" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.614137" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.613890" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.613358" elapsed="0.001460"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:20.615029" elapsed="0.000462"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:20.616082" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:20.615703" elapsed="0.000412"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:20.616310" elapsed="0.003454"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:20.603200" elapsed="0.016666"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.620144" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:20.619982" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.619950" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:20.624663" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.620517" elapsed="0.004256"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:20.624834" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:20.625011" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:20.593525" elapsed="0.031513"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:20.625104" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:20.625259" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:20.535758" elapsed="0.089527"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.641707" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.641319" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.642566" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.642236" elapsed="0.000408">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:20.642739" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:20.641892" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.643300" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:20.642918" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:20.643636" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:20.643803" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:20.643493" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.644224" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:20.643978" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:20.644720" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.644415" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.645235" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:20.644940" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:20.644804" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:20.644396" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.646646" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:20.645470" elapsed="0.001205"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:20.646727" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:20.640723" elapsed="0.006133"/>
</kw>
<msg time="2026-05-01T01:00:20.646940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:20.639894" elapsed="0.007095"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.647492" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.647992" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.648494" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.648682" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.648846" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.649209" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.649074" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:20.649060" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.649417" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.649589" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.649747" elapsed="0.000056"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:20.649029" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.648923" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.650006" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.650096" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:20.650308" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:20.637084" elapsed="0.013251"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:20.650516" elapsed="0.002404"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:20.654871" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.653655" elapsed="0.001246"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:20.656258" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:20.655047" elapsed="0.001241"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:20.656804" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:20.657406" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.656440" elapsed="0.001071">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.653237" elapsed="0.004453">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:20.653003" elapsed="0.004783">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:20.657969" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:20.657827" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:20.652984" elapsed="0.005066">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.626497" elapsed="0.031768">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.625653" elapsed="0.032794">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:20.625371" elapsed="0.033200">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:20.625354" elapsed="0.033258">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:20.658665" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:20.529476" elapsed="0.129339">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.704029" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.703605" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.704877" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.704597" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:21.705055" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:21.704232" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.705665" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:21.705241" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.706001" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:21.706168" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:21.705853" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.706625" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.706350" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.707664" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.707380" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.708186" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.707874" elapsed="0.000340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.708985" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.708604" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:21.709949" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.709565" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:21.710033" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:21.710233" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:21.709198" elapsed="0.001064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.710413" elapsed="0.000340"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:21.708473" elapsed="0.002323"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.711414" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.711074" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:21.712394" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.712013" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:21.712492" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:21.712652" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:21.711644" elapsed="0.001033"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.712825" elapsed="0.000283"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:21.710916" elapsed="0.002236"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.713754" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.713404" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:21.714921" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.714555" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:21.715001" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:21.715159" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:21.713961" elapsed="0.001225"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.715337" elapsed="0.000313"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:21.713277" elapsed="0.002417"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.716362" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.715941" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:21.717327" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.716965" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:21.717406" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:21.717593" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:21.716622" elapsed="0.000998"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.717770" elapsed="0.000289"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:21.715812" elapsed="0.002290"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.718723" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.718345" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:21.719646" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.719269" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:21.719724" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:21.719881" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:21.718932" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.720080" elapsed="0.000288"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:21.718218" elapsed="0.002191"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:21.708270" elapsed="0.012174"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:21.720506" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:21.720671" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:21.707060" elapsed="0.013638"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.706765" elapsed="0.013966"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.720911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.720760" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.706740" elapsed="0.014253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.721627" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:21.721131" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:21.721705" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:21.702961" elapsed="0.018872"/>
</kw>
<msg time="2026-05-01T01:00:21.721899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:21.702061" elapsed="0.019889"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.722441" elapsed="0.000090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.723072" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.723589" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.723769" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.723937" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.724354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.724216" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:21.724202" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.724583" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.724742" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.724899" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:21.724173" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.724062" elapsed="0.000914"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.725112" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.725188" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:21.725305" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:21.696001" elapsed="0.029329"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.726603" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.726307" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:21.726763" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:21.725971" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.727094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.726857" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.727662" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.727349" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.727175" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.726839" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.730337" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:21.727886" elapsed="0.002480"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:21.730478" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:21.730659" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:21.725657" elapsed="0.005028"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.731864" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:21.731672" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T01:00:21.732048" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:21.731316" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.732302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:21.732157" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.732137" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.732703" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:21.732853" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:21.732526" elapsed="0.000356"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:21.733274" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.733034" elapsed="0.000268"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:21.733350" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:21.733527" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:21.730991" elapsed="0.002563"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.734980" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.734725" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.735419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.735173" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:21.743070" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:21.743269" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:21.743406" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:21.737667" elapsed="0.005766"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.735553" elapsed="0.007946"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.743744" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.743528" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.735533" elapsed="0.008394"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.749176" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:05","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.745433" elapsed="0.003840"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.745130" elapsed="0.004193"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.745103" elapsed="0.004257"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.753059" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.749770" elapsed="0.003336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.749442" elapsed="0.003699"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.749417" elapsed="0.003750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.753741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:21.753329" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.754066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.753840" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.754643" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.754301" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.754148" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.753821" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.755280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:21.754911" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.755624" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.755377" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.756190" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.755864" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.755710" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.755359" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:21.756416" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:21.757237" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:21.756952" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:21.757407" elapsed="0.002577"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:21.744482" elapsed="0.015608"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.760290" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:21.760172" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.760151" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:21.764148" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.760516" elapsed="0.003696"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:21.764279" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T01:00:21.764472" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:21.733868" elapsed="0.030635"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:21.764570" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:21.764729" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:21.673061" elapsed="0.091696"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.781350" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.780979" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.782148" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.781869" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:21.782308" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:21.781547" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.782892" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:21.782508" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:21.783209" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:21.783354" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:21.783073" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.783788" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:21.783544" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:21.784304" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.783977" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.784881" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:21.784541" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:21.784388" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:21.783958" elapsed="0.001008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.786131" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:21.785104" elapsed="0.001057"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:21.786211" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:21.780367" elapsed="0.005972"/>
</kw>
<msg time="2026-05-01T01:00:21.786423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:21.779579" elapsed="0.006908"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.786977" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.787688" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.788213" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.788392" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.788574" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.788938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.788801" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:21.788787" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.789176" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.789338" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.789513" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:21.788756" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.788652" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.789776" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.789856" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:21.790071" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:21.776900" elapsed="0.013199"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:21.790287" elapsed="0.002348"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:21.794635" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.793414" elapsed="0.001252"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:21.795964" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:21.794812" elapsed="0.001181"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:21.796508" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:21.797111" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.796158" elapsed="0.001042">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.793003" elapsed="0.004373">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:21.792743" elapsed="0.004745">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:21.797672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:21.797530" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:21.792717" elapsed="0.005036">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.765918" elapsed="0.032012">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.765081" elapsed="0.033026">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:21.764844" elapsed="0.033370">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:21.764827" elapsed="0.033427">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:21.798307" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:21.668528" elapsed="0.129940">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.844181" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.843788" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.845013" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.844734" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:22.845190" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:22.844382" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.845780" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:22.845372" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.846160" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:22.846350" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:22.845992" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.846805" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.846549" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.847876" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.847598" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.848437" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.848110" elapsed="0.000371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.849247" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.848863" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:22.850343" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.849955" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:22.850423" elapsed="0.000054"/>
</return>
<msg time="2026-05-01T01:00:22.850610" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:22.849537" elapsed="0.001099"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.850784" elapsed="0.000301"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:22.848731" elapsed="0.002395"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.851827" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.851370" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:22.852919" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.852557" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:22.852999" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:22.853155" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:22.852190" elapsed="0.000991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.853326" elapsed="0.000304"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:22.851244" elapsed="0.002428"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.854271" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.853943" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:22.855250" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.854890" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:22.855327" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:22.855499" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:22.854494" elapsed="0.001031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.855670" elapsed="0.000280"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:22.853788" elapsed="0.002204"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.856596" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.856234" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:22.857510" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.857138" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:22.857587" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:22.857742" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:22.856803" elapsed="0.000964"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.857967" elapsed="0.000287"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:22.856108" elapsed="0.002187"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.858883" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.858552" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:22.859793" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.859419" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:22.859870" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:22.860022" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:22.859088" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.860187" elapsed="0.000314"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:22.858411" elapsed="0.002133"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:22.848541" elapsed="0.012037"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:22.860621" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:22.860783" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:22.847235" elapsed="0.013575"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.846936" elapsed="0.013905"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.861008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.860868" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.846911" elapsed="0.014175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.861712" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:22.861221" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:22.861788" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:22.843168" elapsed="0.018775"/>
</kw>
<msg time="2026-05-01T01:00:22.861998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:22.842276" elapsed="0.019772"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.862554" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.863097" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.863610" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.863792" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.863955" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.864308" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.864172" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:22.864158" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.864584" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.864746" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.864902" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:22.864129" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.864028" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.865113" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.865187" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:22.865305" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:22.837984" elapsed="0.027346"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.866860" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.866616" elapsed="0.000311">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:22.867050" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:22.866230" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.867392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.867153" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.867949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.867656" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.867490" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.867135" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.870534" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:22.868180" elapsed="0.002381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:22.870687" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:22.870850" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:22.865667" elapsed="0.005208"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.872037" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:22.871845" elapsed="0.000246"/>
</kw>
<msg time="2026-05-01T01:00:22.872194" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:22.871510" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.872436" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:22.872296" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.872276" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.872829" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:22.872972" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:22.872661" elapsed="0.000338"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:22.873417" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.873149" elapsed="0.000296"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:22.873510" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:22.873671" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:22.871178" elapsed="0.002519"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.875112" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.874864" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.875590" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.875302" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:22.883156" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:22.884721" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:22.884879" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:22.877837" elapsed="0.007078"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.875703" elapsed="0.009270"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.885211" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.885009" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.875684" elapsed="0.009695"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.890622" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.886856" elapsed="0.003853"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.886560" elapsed="0.004199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.886534" elapsed="0.004261"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.894548" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.891201" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.890875" elapsed="0.003794"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.890851" elapsed="0.003861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.895305" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:22.894904" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.895660" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.895407" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.896239" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.895903" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.895748" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.895387" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.896881" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:22.896506" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.897208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.896980" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.897789" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.897446" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.897292" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.896962" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:22.898045" elapsed="0.000432"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:22.899029" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:22.898701" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:22.899208" elapsed="0.002324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:22.885946" elapsed="0.015654"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.901785" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:22.901672" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.901652" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:22.905656" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.902042" elapsed="0.003693"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:22.905793" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:22.905989" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:22.874045" elapsed="0.031973"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:22.906083" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:22.906241" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:22.814030" elapsed="0.092238"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.922797" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.922394" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.923696" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.923318" elapsed="0.000465">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:22.923879" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:22.922989" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.924689" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:22.924063" elapsed="0.000656"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:22.925021" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:22.925207" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:22.924877" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.925661" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:22.925391" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:22.926281" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.925876" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.926842" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:22.926532" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:22.926373" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:22.925852" elapsed="0.001078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.928182" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:22.927073" elapsed="0.001140"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:22.928268" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:22.921724" elapsed="0.006683"/>
</kw>
<msg time="2026-05-01T01:00:22.928517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:22.920866" elapsed="0.007704"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.929063" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.929581" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.930146" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.930324" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.930503" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.930873" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.930738" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:22.930724" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.931083" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.931238" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.931393" elapsed="0.000079"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:22.930694" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.930586" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.931681" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.931758" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:22.931972" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:22.918094" elapsed="0.013905"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:22.932166" elapsed="0.002327"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:22.937164" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.935485" elapsed="0.001720"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:22.939016" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:22.937411" elapsed="0.001634"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:22.939552" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:22.940167" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.939196" elapsed="0.001066">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.934900" elapsed="0.005538">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:22.934575" elapsed="0.005976">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:22.940739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:22.940592" elapsed="0.000202"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:22.934557" elapsed="0.006260">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.907423" elapsed="0.033571">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.906629" elapsed="0.034542">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:22.906367" elapsed="0.034910">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:22.906347" elapsed="0.034970">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:22.941372" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:22.807501" elapsed="0.134051">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.984419" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:23.984026" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:23.985231" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:23.984963" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:23.985403" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:23.984637" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.985990" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:23.985602" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:23.986313" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:23.986511" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:23.986170" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.986935" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:23.986686" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.987968" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:23.987706" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.988431" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.988163" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.989199" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:23.988841" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:23.990137" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.989767" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:23.990218" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:23.990381" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:23.989407" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.990569" elapsed="0.000295"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:23.988711" elapsed="0.002195"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.991745" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:23.991149" elapsed="0.000623"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:23.992671" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.992292" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:23.992750" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:23.992904" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:23.991955" elapsed="0.000974"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.993072" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:23.991024" elapsed="0.002369"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.993975" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:23.993651" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:23.994946" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.994586" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:23.995022" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:23.995174" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:23.994180" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.995340" elapsed="0.000311"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:23.993525" elapsed="0.002169"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.996255" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:23.995934" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:23.997163" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.996805" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:23.997240" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:23.997391" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:23.996472" elapsed="0.000944"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.997573" elapsed="0.000277"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:23.995809" elapsed="0.002083"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:23.998488" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:23.998131" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:23.999376" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.999027" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:23.999466" elapsed="0.000070"/>
</return>
<msg time="2026-05-01T01:00:23.999663" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:23.998695" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:23.999828" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:23.998006" elapsed="0.002142"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:23.988527" elapsed="0.011654"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:24.000225" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:24.000385" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:23.987352" elapsed="0.013059"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:23.987061" elapsed="0.013382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.000630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.000487" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:23.987036" elapsed="0.013671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.001309" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:24.000842" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:24.001384" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:23.983374" elapsed="0.018151"/>
</kw>
<msg time="2026-05-01T01:00:24.001581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:23.982507" elapsed="0.019122"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.002114" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.002713" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.003209" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.003384" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.003571" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.003926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.003790" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:24.003776" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.004136" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.004293" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.004449" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:24.003747" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.003646" elapsed="0.000898"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.004682" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.004757" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:24.004874" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:23.978285" elapsed="0.026614"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:24.007763" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.007440" elapsed="0.000389">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:24.007922" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:24.007105" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.008256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.008019" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.008814" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:24.008521" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.008339" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.008000" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.011218" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:24.009041" elapsed="0.002203"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:24.011329" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:24.011502" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:24.006783" elapsed="0.004771"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:24.012696" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:24.012507" elapsed="0.000242"/>
</kw>
<msg time="2026-05-01T01:00:24.012832" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:24.012167" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.013060" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:24.012925" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.012907" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:24.013470" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:24.013607" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:24.013292" elapsed="0.000341"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:24.014009" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:24.013777" elapsed="0.000261"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:24.014113" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:24.014280" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:24.011854" elapsed="0.002452"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.015774" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:24.015468" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.016205" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:24.015964" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:24.023189" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:24.023386" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:24.023526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:24.018350" elapsed="0.005258"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.016315" elapsed="0.007337"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.023830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.023679" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.016297" elapsed="0.007651"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.028747" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:24.025076" elapsed="0.003754"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.024755" elapsed="0.004124"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.024724" elapsed="0.004190"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.032565" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:24.029289" elapsed="0.003342"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.028992" elapsed="0.003689"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.028970" elapsed="0.003753"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.033308" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:24.032915" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.033650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.033406" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.034186" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:24.033888" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.033735" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.033388" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.034798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:24.034419" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.035118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.034894" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.035676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:24.035351" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.035199" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.034877" elapsed="0.000883"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:24.035902" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:24.036698" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:24.036400" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:24.036874" elapsed="0.002311"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:24.024291" elapsed="0.014956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.039422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:24.039317" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.039298" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:24.043184" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:24.039672" elapsed="0.003572"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:24.043299" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:24.043474" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:24.014618" elapsed="0.028885"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:24.043581" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:24.043734" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:23.955796" elapsed="0.087965"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.059896" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:24.059496" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:24.060698" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.060398" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:24.060863" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:24.060078" elapsed="0.000809"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.061421" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:24.061041" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:24.061759" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:24.062063" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:24.061624" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.062673" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:24.062244" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:24.063165" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.062878" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.063758" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:24.063385" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:24.063248" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:24.062858" elapsed="0.000986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.065022" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:24.063982" elapsed="0.001069"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:24.065101" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:24.058886" elapsed="0.006342"/>
</kw>
<msg time="2026-05-01T01:00:24.065312" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:24.058109" elapsed="0.007251"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.065857" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.066351" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.066865" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.067043" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.067206" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.067578" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.067429" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:24.067415" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.067812" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.067970" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.068126" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:24.067385" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.067282" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.068377" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.068470" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:24.068686" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:24.055435" elapsed="0.013278"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:24.068881" elapsed="0.002222"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:24.073056" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:24.071870" elapsed="0.001217"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:24.074391" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:24.073235" elapsed="0.001185"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:24.074930" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:24.075540" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.074587" elapsed="0.001061">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.071414" elapsed="0.004416">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:24.071184" elapsed="0.004741">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:24.076106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:24.075964" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:24.071166" elapsed="0.005019">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.044884" elapsed="0.031480">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:24.044074" elapsed="0.032482">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:24.043844" elapsed="0.032819">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:24.043827" elapsed="0.032875">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:24.076755" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:23.950743" elapsed="0.126159">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.123537" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.123118" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.124359" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.124094" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:25.124552" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:25.123755" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.125170" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:25.124738" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.125516" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:25.125688" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:25.125354" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.126141" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.125880" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.127208" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.126916" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.127705" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.127411" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.128544" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.128139" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:25.129596" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.129189" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:25.129678" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:25.129877" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:25.128759" elapsed="0.001147"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.130055" elapsed="0.000326"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:25.127982" elapsed="0.002441"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.131200" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.130689" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:25.132160" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.131792" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:25.132238" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:25.132409" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:25.131431" elapsed="0.001009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.132605" elapsed="0.000288"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:25.130562" elapsed="0.002374"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.133598" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.133210" elapsed="0.000420"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:25.134601" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.134215" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:25.134698" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:25.134858" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:25.133814" elapsed="0.001069"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.135027" elapsed="0.000286"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:25.133081" elapsed="0.002274"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.135970" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.135615" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:25.136920" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.136531" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:25.136998" elapsed="0.000081"/>
</return>
<msg time="2026-05-01T01:00:25.137210" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:25.136177" elapsed="0.001059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.137379" elapsed="0.000319"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:25.135489" elapsed="0.002255"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.138357" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.138031" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:25.139264" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.138912" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:25.139339" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:25.139507" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:25.138576" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.139674" elapsed="0.000278"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:25.137891" elapsed="0.002103"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:25.127787" elapsed="0.012240"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:25.140070" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:25.140230" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:25.126594" elapsed="0.013662"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.126273" elapsed="0.014014"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.140471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.140314" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.126247" elapsed="0.014303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.141176" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:25.140684" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:25.141253" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:25.122445" elapsed="0.018934"/>
</kw>
<msg time="2026-05-01T01:00:25.141433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:25.121519" elapsed="0.020021"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.142031" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.142588" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.143086" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.143263" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.143427" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.143798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.143659" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:25.143645" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.144014" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.144173" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.144332" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:25.143616" elapsed="0.000769"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.143515" elapsed="0.000897"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.144564" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.144641" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:25.144761" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:25.116830" elapsed="0.027957"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.146294" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.146057" elapsed="0.000301">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:25.146464" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:25.145724" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.146804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.146563" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.147337" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.147050" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.146885" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.146545" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.149794" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:25.147576" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:25.149928" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:25.150086" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:25.145353" elapsed="0.004759"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.151247" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:25.151063" elapsed="0.000236"/>
</kw>
<msg time="2026-05-01T01:00:25.151382" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:25.150739" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.151633" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:25.151496" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.151476" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.151997" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:25.152123" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:25.151834" elapsed="0.000315"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:25.152541" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.152294" elapsed="0.000273"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:25.152614" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:25.152767" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:25.150410" elapsed="0.002382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.154176" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.153933" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.154619" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.154362" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:25.161782" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:25.161976" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:25.162084" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:25.156853" elapsed="0.005257"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.154728" elapsed="0.007423"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.162319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.162177" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.154710" elapsed="0.007726"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.166278" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.163434" elapsed="0.002928"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.163222" elapsed="0.003189"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.163204" elapsed="0.003242"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.170296" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.166845" elapsed="0.003518"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.166546" elapsed="0.003868"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.166522" elapsed="0.003928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.171229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:25.170696" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.171704" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.171366" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.172450" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.172034" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.171823" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.171341" elapsed="0.001249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.173338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:25.172799" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.173805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.173494" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.174324" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.174034" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.173885" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.173449" elapsed="0.000957"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:25.174562" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:25.175341" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:25.175063" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:25.175529" elapsed="0.002332"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:25.162803" elapsed="0.015120"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.178098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:25.177993" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.177975" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:25.181875" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.178305" elapsed="0.003631"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:25.181991" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:25.182159" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:25.153121" elapsed="0.029066"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:25.182252" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:25.182408" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:25.092979" elapsed="0.089456"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.198517" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.198131" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.199297" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.199018" elapsed="0.000346">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:25.199477" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:25.198698" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.200202" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:25.199662" elapsed="0.000568"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:25.200539" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:25.200699" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:25.200384" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.201132" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:25.200876" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:25.201629" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.201327" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.202155" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:25.201859" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:25.201714" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:25.201308" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.203418" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:25.202380" elapsed="0.001067"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:25.203516" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:25.197535" elapsed="0.006108"/>
</kw>
<msg time="2026-05-01T01:00:25.203726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:25.196711" elapsed="0.007063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.204254" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.204769" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.205293" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.205485" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.205652" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.206006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.205872" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:25.205858" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.206215" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.206421" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.206600" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:25.205829" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.205727" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.206858" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.206935" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:25.207146" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:25.194113" elapsed="0.013060"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:25.207341" elapsed="0.002257"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:25.211478" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.210301" elapsed="0.001208"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:25.212800" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:25.211658" elapsed="0.001171"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:25.213354" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:25.213959" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.212978" elapsed="0.001068">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.209907" elapsed="0.004314">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:25.209679" elapsed="0.004637">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:25.214512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:25.214355" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:25.209661" elapsed="0.004931">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.183572" elapsed="0.031193">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.182770" elapsed="0.032167">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:25.182536" elapsed="0.032506">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:25.182519" elapsed="0.032562">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:25.215132" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:25.087035" elapsed="0.128241">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.259897" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.259372" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.260815" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.260501" elapsed="0.000396">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:26.260997" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:26.260127" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.261619" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:26.261201" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.261956" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:26.262126" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:26.261807" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.262616" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.262344" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.263685" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.263398" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.264163" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.263892" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.264942" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.264583" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:26.265902" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.265521" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:26.265984" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:26.266157" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:26.265153" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.266377" elapsed="0.000333"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:26.264432" elapsed="0.002320"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.267513" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.266999" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:26.268426" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.268062" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:26.268523" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:26.268680" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:26.267722" elapsed="0.000984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.268858" elapsed="0.000284"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:26.266870" elapsed="0.002315"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.269795" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.269427" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:26.270866" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.270502" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:26.270944" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:26.271097" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:26.270041" elapsed="0.001081"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.271267" elapsed="0.000296"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:26.269299" elapsed="0.002306"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.272171" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.271846" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:26.273258" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.272728" elapsed="0.000557"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:26.273335" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:26.273505" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:26.272376" elapsed="0.001155"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.273676" elapsed="0.000279"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:26.271720" elapsed="0.002276"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.274639" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.274237" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:26.275551" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.275181" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:26.275627" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:26.275779" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:26.274846" elapsed="0.000957"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.275944" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:26.274112" elapsed="0.002150"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:26.264246" elapsed="0.012049"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:26.276339" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:26.276518" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:26.263074" elapsed="0.013470"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.262748" elapsed="0.013829"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.276748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.276604" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.262722" elapsed="0.014103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.277444" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:26.276961" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:26.277538" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:26.258760" elapsed="0.018905"/>
</kw>
<msg time="2026-05-01T01:00:26.277721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:26.257841" elapsed="0.019929"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.278264" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.278924" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.279568" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.279748" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.279915" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.280322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.280175" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:26.280153" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.280557" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.280719" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.280876" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:26.280109" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.279988" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.281114" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.281196" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:26.281320" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:26.253532" elapsed="0.027814"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.282960" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.282691" elapsed="0.000341">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:26.283126" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:26.282240" elapsed="0.000909"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.283476" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.283219" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.284079" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.283731" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.283559" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.283201" elapsed="0.000985"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.286781" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:26.284366" elapsed="0.002443"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:26.286905" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:26.287070" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:26.281914" elapsed="0.005182"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.288304" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:26.288101" elapsed="0.000278"/>
</kw>
<msg time="2026-05-01T01:00:26.288489" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:26.287771" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.288729" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:26.288590" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.288570" elapsed="0.000230"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.289134" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:26.289357" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:26.288944" elapsed="0.000441"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:26.289827" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.289582" elapsed="0.000273"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:26.289904" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:26.290062" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:26.287429" elapsed="0.002659"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.291591" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.291319" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.292061" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.291814" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:26.299667" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:26.299877" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:26.299991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:26.294325" elapsed="0.005693"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.292172" elapsed="0.007889"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.300241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.300088" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.292154" elapsed="0.008262"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.304576" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:10","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.301547" elapsed="0.003114"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.301291" elapsed="0.003419"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.301272" elapsed="0.003476"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.308823" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.305180" elapsed="0.003710"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.304838" elapsed="0.004103"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.304807" elapsed="0.004170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.309846" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:26.309216" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.310313" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.309987" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.311237" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.310729" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.310457" elapsed="0.000870"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.309962" elapsed="0.001396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.312091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:26.311635" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.312418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.312190" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.313001" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.312690" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.312519" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.312172" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:26.313232" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:26.314087" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:26.313768" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:26.314263" elapsed="0.002653"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:26.300853" elapsed="0.016132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.317203" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:26.317059" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.317040" elapsed="0.000247"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:26.321167" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.317432" elapsed="0.003807"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:26.321295" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:26.321483" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:26.290430" elapsed="0.031083"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:26.321600" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:26.321769" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:26.230978" elapsed="0.090819"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.340566" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.340139" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.341515" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.341136" elapsed="0.000462">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:26.341697" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:26.340764" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.342273" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:26.341882" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:26.342638" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:26.342811" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:26.342459" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.343296" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:26.342990" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:26.343855" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.343526" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.344400" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:26.344086" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:26.343946" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:26.343502" elapsed="0.001023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.345796" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:26.344668" elapsed="0.001166"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:26.345905" elapsed="0.000038"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:26.339523" elapsed="0.006526"/>
</kw>
<msg time="2026-05-01T01:00:26.346135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:26.338603" elapsed="0.007581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.346695" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.347247" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.347846" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.348060" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.348233" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.348628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.348489" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:26.348458" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.348841" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.349000" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.349188" elapsed="0.000057"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:26.348423" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.348312" elapsed="0.001000"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.349460" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.349554" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:26.349770" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:26.334088" elapsed="0.015710"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:26.349972" elapsed="0.002559"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:26.354526" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.353267" elapsed="0.001290"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:26.356043" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:26.354730" elapsed="0.001344"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:26.356705" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:26.357432" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.356259" elapsed="0.001324">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.352858" elapsed="0.004914">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:26.352617" elapsed="0.005265">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:26.358098" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:26.357936" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:26.352598" elapsed="0.005619">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.322975" elapsed="0.035506">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.322125" elapsed="0.036546">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:26.321883" elapsed="0.036893">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:26.321865" elapsed="0.036959">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:26.358880" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:26.224806" elapsed="0.134240">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.403634" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.403190" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.404421" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.404168" elapsed="0.000346">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:27.404612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:27.403835" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.405184" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:27.404796" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.405534" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:27.405725" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:27.405366" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.406185" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.405905" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.407199" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.406940" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.407707" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.407423" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.408448" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.408093" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:27.409388" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.409023" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:27.409486" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T01:00:27.409675" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:27.408684" elapsed="0.001019"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.409879" elapsed="0.000319"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:27.407966" elapsed="0.002276"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.410884" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.410539" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:27.411931" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.411536" elapsed="0.000423"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:27.412012" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:27.412173" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:27.411097" elapsed="0.001103"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.412347" elapsed="0.000311"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:27.410375" elapsed="0.002326"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.413488" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.412952" elapsed="0.000565"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:27.414494" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.414103" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:27.414574" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:27.414731" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:27.413702" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.414901" elapsed="0.000281"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:27.412819" elapsed="0.002407"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.416233" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.415877" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:27.417172" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.416815" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:27.417251" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:27.417408" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:27.416447" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.417680" elapsed="0.000286"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:27.415343" elapsed="0.002666"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.418633" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.418254" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:27.419604" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.419183" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:27.419685" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:27.419844" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:27.418843" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.420016" elapsed="0.000287"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:27.418125" elapsed="0.002222"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:27.407785" elapsed="0.012597"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:27.420428" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T01:00:27.420614" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:27.406620" elapsed="0.014021"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.406307" elapsed="0.014367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.420854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.420705" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.406285" elapsed="0.014649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.421620" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:27.421075" elapsed="0.000574"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:27.421699" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:27.402587" elapsed="0.019242"/>
</kw>
<msg time="2026-05-01T01:00:27.421886" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:27.401708" elapsed="0.020232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.422454" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.423038" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.423587" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.423771" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.423974" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.424348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.424209" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:27.424193" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.424583" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.424746" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.424906" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:27.424161" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.424054" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.425278" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.425357" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:27.425517" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:27.397123" elapsed="0.028423"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.426957" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.426632" elapsed="0.000408">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:27.427138" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:27.426240" elapsed="0.000923"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.427750" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.427444" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.428311" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.428010" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.427836" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.427216" elapsed="0.001181"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.430864" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:27.428561" elapsed="0.002331"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:27.430986" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:27.431153" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:27.425898" elapsed="0.005281"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.432409" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:27.432184" elapsed="0.000298"/>
</kw>
<msg time="2026-05-01T01:00:27.432573" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:27.431847" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.432812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:27.432672" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.432652" elapsed="0.000231"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.433193" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:27.433477" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:27.433022" elapsed="0.000486"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:27.433908" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.433663" elapsed="0.000273"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:27.433985" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:27.434149" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:27.431504" elapsed="0.002671"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.435603" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.435331" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.436090" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.435832" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:27.443664" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:27.445003" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:27.445197" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:27.438361" elapsed="0.006878"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.436212" elapsed="0.009092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.445593" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.445346" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.436193" elapsed="0.009582"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.451066" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.447314" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.446993" elapsed="0.004217"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.446965" elapsed="0.004283"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.454598" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.451680" elapsed="0.002968"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.451332" elapsed="0.003360"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.451308" elapsed="0.003418"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.455433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:27.454933" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.455817" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.455576" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.456414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.456087" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.455927" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.455556" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.457058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:27.456678" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.457387" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.457158" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.457967" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.457667" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.457505" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.457140" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:27.458202" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:27.459053" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:27.458757" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:27.459243" elapsed="0.002578"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:27.446329" elapsed="0.015559"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.462070" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:27.461960" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.461941" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:27.465923" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.462283" elapsed="0.003707"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:27.466048" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:27.466217" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:27.434519" elapsed="0.031726"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:27.466309" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:27.466487" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:27.374757" elapsed="0.091760"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.482957" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.482574" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.483797" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.483498" elapsed="0.000377">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:27.483971" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:27.483154" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.484636" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:27.484195" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:27.484965" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:27.485122" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:27.484823" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.485753" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:27.485301" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:27.486241" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.485950" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.486817" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:27.486507" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:27.486329" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:27.485930" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.488111" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:27.487046" elapsed="0.001095"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:27.488225" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:27.481938" elapsed="0.006434"/>
</kw>
<msg time="2026-05-01T01:00:27.488477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:27.481138" elapsed="0.007401"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.489055" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.489591" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.490102" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.490282" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.490481" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.490871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.490731" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:27.490714" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.491092" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.491271" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.491433" elapsed="0.000070"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:27.490673" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.490564" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.491715" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.491809" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T01:00:27.492055" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:27.478445" elapsed="0.013638"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:27.492293" elapsed="0.002279"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:27.496614" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.495323" elapsed="0.001322"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:27.498004" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:27.496797" elapsed="0.001236"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:27.498576" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:27.499202" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.498188" elapsed="0.001109">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.494896" elapsed="0.004615">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:27.494657" elapsed="0.004958">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:27.499805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:27.499657" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:27.494638" elapsed="0.005249">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.467695" elapsed="0.032431">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.466847" elapsed="0.033481">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:27.466605" elapsed="0.033835">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:27.466587" elapsed="0.033915">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:27.500574" elapsed="0.000020"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:27.368595" elapsed="0.132138">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.545262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.544373" elapsed="0.000956"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.546975" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.546433" elapsed="0.000644">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:28.547216" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:28.545714" elapsed="0.001538"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.548075" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:28.547507" elapsed="0.000608"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.548566" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:28.548787" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:28.548339" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.549397" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.549042" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.550913" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.550515" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.551614" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.551201" elapsed="0.000452"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.552724" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.552208" elapsed="0.000553"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:28.554261" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.553616" elapsed="0.000691"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:28.554398" elapsed="0.000085"/>
</return>
<msg time="2026-05-01T01:00:28.554763" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:28.553014" elapsed="0.001797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.555076" elapsed="0.000535"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:28.552026" elapsed="0.003658"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.556694" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.556057" elapsed="0.000667"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:28.557761" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.557309" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:28.557840" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:28.557997" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:28.556933" elapsed="0.001090"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.558168" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:28.555885" elapsed="0.002633"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.559112" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.558790" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:28.560108" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.559747" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:28.560183" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:28.560335" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:28.559316" elapsed="0.001044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.560521" elapsed="0.000278"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:28.558634" elapsed="0.002207"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.561398" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.561080" elapsed="0.000343"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:28.562299" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.561950" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:28.562374" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:28.562564" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:28.561618" elapsed="0.000971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.562734" elapsed="0.000336"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:28.560955" elapsed="0.002157"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.563691" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.563350" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:28.564597" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.564221" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:28.564671" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:28.564821" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:28.563893" elapsed="0.000952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.564985" elapsed="0.000275"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:28.563225" elapsed="0.002077"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:28.551727" elapsed="0.013608"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:28.565378" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:28.565556" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:28.550031" elapsed="0.015551"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.549598" elapsed="0.016016"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.565785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.565642" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.549566" elapsed="0.016295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.566528" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:28.566002" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:28.566603" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:28.542959" elapsed="0.023770"/>
</kw>
<msg time="2026-05-01T01:00:28.566786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:28.541704" elapsed="0.025156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.567402" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.567961" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.568456" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.568648" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.568810" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.569163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.569027" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:28.569013" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.569372" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.569554" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.569714" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:28.568983" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.568882" elapsed="0.000910"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.569928" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.570002" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:28.570119" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:28.537430" elapsed="0.032714"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.571712" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.571447" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:28.571874" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:28.571110" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.572215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.571975" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.572774" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.572480" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.572295" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.571956" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.575230" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:28.573013" elapsed="0.002247"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:28.575377" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:28.575562" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:28.570736" elapsed="0.004852"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.576731" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:28.576543" elapsed="0.000240"/>
</kw>
<msg time="2026-05-01T01:00:28.576866" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:28.576201" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.577095" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:28.576960" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.576942" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.577474" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:28.577611" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:28.577296" elapsed="0.000341"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:28.578012" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.577783" elapsed="0.000255"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:28.578084" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:28.578236" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:28.575889" elapsed="0.002372"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.579691" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.579429" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.580114" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.579877" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:28.587250" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:28.587448" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:28.587582" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:28.582264" elapsed="0.005344"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.580221" elapsed="0.007428"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.587818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.587675" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.580203" elapsed="0.007763"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.593067" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.589347" elapsed="0.003805"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.589051" elapsed="0.004150"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.589026" elapsed="0.004212"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.596632" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.593645" elapsed="0.003033"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.593318" elapsed="0.003395"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.593294" elapsed="0.003445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.597282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:28.596898" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.597625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.597380" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.598160" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.597857" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.597707" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.597362" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.598768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:28.598391" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.599090" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.598865" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.599653" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.599343" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.599192" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.598847" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:28.599876" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:28.600669" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:28.600370" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:28.600839" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:28.588442" elapsed="0.014833"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.603450" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:28.603344" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.603326" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:28.607163" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.603673" elapsed="0.003563"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:28.607291" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:28.607453" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:28.578580" elapsed="0.028918"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:28.607562" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:28.607716" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:28.514953" elapsed="0.092789"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.623878" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.623509" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.624671" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.624377" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:28.624830" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:28.624057" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.625560" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:28.625009" elapsed="0.000579"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:28.625877" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:28.626021" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:28.625740" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.626439" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:28.626194" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:28.626928" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.626642" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.627534" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:28.627189" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:28.627012" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:28.626623" elapsed="0.000997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.628789" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:28.627758" elapsed="0.001060"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:28.628868" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:28.622887" elapsed="0.006109"/>
</kw>
<msg time="2026-05-01T01:00:28.629079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:28.622107" elapsed="0.007020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.629633" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.630133" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.630644" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.630821" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.630984" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.631339" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.631205" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:28.631191" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.631585" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.631745" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.631906" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:28.631162" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.631059" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.632161" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.632237" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:28.632447" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:28.619511" elapsed="0.012980"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:28.632659" elapsed="0.002205"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:28.636796" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.635624" elapsed="0.001201"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:28.638116" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:28.636972" elapsed="0.001173"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:28.638636" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:28.639224" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.638292" elapsed="0.001017">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.635174" elapsed="0.004336">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:28.634945" elapsed="0.004662">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:28.639788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:28.639647" elapsed="0.000197"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:28.634927" elapsed="0.004940">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.608860" elapsed="0.031180">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.608055" elapsed="0.032157">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:28.607825" elapsed="0.032491">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:28.607808" elapsed="0.032548">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:28.640407" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:28.510420" elapsed="0.130150">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.685083" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.684676" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.685955" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.685673" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:29.686131" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:29.685299" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.686725" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:29.686315" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.687049" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:29.687220" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:29.686907" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.687673" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.687395" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.688775" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.688507" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.689246" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.688977" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.690032" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.689665" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:29.690992" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.690607" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:29.691073" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:29.691242" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:29.690241" elapsed="0.001026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.691415" elapsed="0.000325"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:29.689533" elapsed="0.002249"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.692356" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.692027" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:29.748391" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.747980" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:29.748518" elapsed="0.000046"/>
</return>
<msg time="2026-05-01T01:00:29.748700" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:29.747397" elapsed="0.001329"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.748878" elapsed="0.000368"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:29.691901" elapsed="0.057388"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.749954" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.749574" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:29.750989" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.750614" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:29.751068" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:29.751228" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:29.750187" elapsed="0.001067"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.751401" elapsed="0.000305"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:29.749422" elapsed="0.002326"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.752325" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.751996" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:29.753284" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.752894" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:29.753363" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:29.753554" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:29.752552" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.753724" elapsed="0.000282"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:29.751866" elapsed="0.002181"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.754639" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.754293" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:29.755799" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.755312" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:29.755903" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T01:00:29.756102" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:29.754882" elapsed="0.001254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.756329" elapsed="0.000398"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:29.754165" elapsed="0.002618"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:29.689326" elapsed="0.067502"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:29.756905" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:29.757134" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:29.688136" elapsed="0.069029"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.687817" elapsed="0.069382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.757491" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.757230" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.687789" elapsed="0.069795"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.758502" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:29.757769" elapsed="0.000769"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:29.758596" elapsed="0.000037"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:29.683982" elapsed="0.074776"/>
</kw>
<msg time="2026-05-01T01:00:29.758835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:29.683060" elapsed="0.075850"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.759579" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.760296" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.761131" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.761319" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.761587" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.761967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.761827" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:29.761812" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.762181" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.762340" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.762533" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:29.761780" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.761671" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.762757" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.762834" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:29.762959" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:29.678645" elapsed="0.084340"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.764297" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.764019" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:29.764500" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:29.763669" elapsed="0.000859"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.764849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.764601" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.765458" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.765149" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.764932" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.764582" elapsed="0.001003"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.768010" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:29.765731" elapsed="0.002306"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:29.768126" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:29.768291" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:29.763307" elapsed="0.005009"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.769604" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:29.769345" elapsed="0.000328"/>
</kw>
<msg time="2026-05-01T01:00:29.769775" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:29.768978" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.770054" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:29.769890" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.769867" elapsed="0.000269"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.770534" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:29.770718" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:29.770312" elapsed="0.000439"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:29.771152" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.770904" elapsed="0.000275"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:29.771226" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:29.771386" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:29.768648" elapsed="0.002765"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.772842" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.772589" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.773392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.773074" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:29.784153" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:29.784579" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:29.784858" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:29.775848" elapsed="0.009054"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.773531" elapsed="0.011461"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.785438" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.785051" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.773511" elapsed="0.012221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.791047" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.787427" elapsed="0.003688"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.787088" elapsed="0.004082"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.787056" elapsed="0.004157"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.793894" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.791533" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.791285" elapsed="0.002700"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.791266" elapsed="0.002745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.794666" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:29.794209" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.795001" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.794766" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.795585" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.795244" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.795084" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.794748" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.796206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:29.795829" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.796554" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.796306" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.797102" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.796793" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.796639" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.796287" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:29.797397" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:29.798267" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:29.797945" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:29.798444" elapsed="0.002505"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:29.786349" elapsed="0.014696"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.801324" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:29.801164" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.801130" elapsed="0.000346"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:29.806323" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.801691" elapsed="0.004789"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:29.806576" elapsed="0.000077"/>
</return>
<msg time="2026-05-01T01:00:29.806853" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:29.771752" elapsed="0.035130"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:29.806980" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:29.807213" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:29.655991" elapsed="0.151262"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.825345" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.824855" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.826414" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.826027" elapsed="0.000510">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:29.826649" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:29.825669" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.827249" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:29.826847" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:29.827706" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:29.827937" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:29.827512" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.828506" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:29.828180" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:29.829105" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.828761" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.829729" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:29.829337" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:29.829197" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:29.828725" elapsed="0.001093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.831336" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:29.829997" elapsed="0.001370"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:29.831424" elapsed="0.000059"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:29.824202" elapsed="0.007395"/>
</kw>
<msg time="2026-05-01T01:00:29.831686" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:29.823076" elapsed="0.008666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.832273" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.832802" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.833321" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.833523" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.833714" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.834111" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.833971" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:29.833956" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.834326" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.834520" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.834683" elapsed="0.000057"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:29.833923" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.833800" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.834947" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.835024" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:29.835244" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:29.820269" elapsed="0.015002"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:29.835473" elapsed="0.002784"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:29.840370" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.839083" elapsed="0.001317"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:29.841845" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:29.840571" elapsed="0.001309"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:29.842419" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:29.843044" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.842064" elapsed="0.001087">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.838606" elapsed="0.004730">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:29.838345" elapsed="0.005088">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:29.843637" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:29.843491" elapsed="0.000203"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:29.838326" elapsed="0.005392">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.808785" elapsed="0.035124">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.807811" elapsed="0.036281">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:29.807393" elapsed="0.036811">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:29.807362" elapsed="0.036896">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:29.844316" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:29.650696" elapsed="0.193798">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.887150" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.886764" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.887949" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.887699" elapsed="0.000324">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:30.888117" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:30.887347" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.888701" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:30.888300" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.889029" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:30.889191" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:30.888883" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.889648" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.889369" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.890660" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.890381" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.891124" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.890860" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.891885" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.891529" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:30.892817" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.892424" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:30.892896" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:30.893058" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:30.892089" elapsed="0.000995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.893232" elapsed="0.000351"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:30.891384" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.894189" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.893869" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:30.895108" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.894751" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:30.895185" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:30.895336" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:30.894391" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.895548" elapsed="0.000289"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:30.893743" elapsed="0.002135"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.896623" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.896122" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:30.897619" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.897220" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:30.897695" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:30.897847" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:30.896830" elapsed="0.001042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.898014" elapsed="0.000273"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:30.895997" elapsed="0.002332"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.898906" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.898586" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:30.899829" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.899443" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:30.899906" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:30.900056" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:30.899114" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.900224" elapsed="0.000295"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:30.898443" elapsed="0.002118"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.901120" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.900801" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:30.902128" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.901764" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:30.902206" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:30.902358" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:30.901323" elapsed="0.001060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.902545" elapsed="0.000278"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:30.900676" elapsed="0.002189"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:30.891203" elapsed="0.011695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:30.902942" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:30.903102" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:30.890065" elapsed="0.013063"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.889771" elapsed="0.013389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.903327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.903186" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.889748" elapsed="0.013655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.904058" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:30.903576" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:30.904132" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:30.886141" elapsed="0.018114"/>
</kw>
<msg time="2026-05-01T01:00:30.904310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:30.885180" elapsed="0.019178"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.904865" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.905406" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.905963" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.906142" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.906306" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.906682" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.906543" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:30.906529" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.906893" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.907053" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.907210" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:30.906498" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.906380" elapsed="0.000908"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.907425" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.907569" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:30.907690" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:30.880951" elapsed="0.026765"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.908941" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.908701" elapsed="0.000306">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:30.909098" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:30.908350" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.909669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.909393" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.910213" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.909921" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.909752" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.909371" elapsed="0.000926"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.912673" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:30.910440" elapsed="0.002260"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:30.912786" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:30.912946" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:30.908037" elapsed="0.004934"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.914147" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:30.913961" elapsed="0.000238"/>
</kw>
<msg time="2026-05-01T01:00:30.914282" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:30.913632" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.914529" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:30.914376" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.914358" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.914896" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:30.915025" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:30.914733" elapsed="0.000319"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:30.915429" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.915199" elapsed="0.000275"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:30.915523" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:30.915679" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:30.913270" elapsed="0.002434"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.917060" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.916813" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.917505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.917248" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:30.924755" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:30.924954" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:30.925067" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:30.919713" elapsed="0.005379"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.917643" elapsed="0.007491"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.925306" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.925160" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.917596" elapsed="0.007829"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.929076" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:15","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.926483" elapsed="0.002653"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.926249" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.926230" elapsed="0.002967"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.931822" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.929483" elapsed="0.002386"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.929253" elapsed="0.002650"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.929236" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.932489" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:30.932087" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.932820" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.932589" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.933351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.933056" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.932902" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.932571" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.934005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:30.933605" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.934326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.934102" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.934865" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.934574" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.934406" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.934084" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:30.935091" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:30.935889" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:30.935608" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:30.936061" elapsed="0.002346"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:30.925819" elapsed="0.012668"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.938666" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:30.938559" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.938540" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:30.942432" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.938874" elapsed="0.003645"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:30.942576" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:30.942740" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:30.916002" elapsed="0.026765"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:30.942831" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:30.942984" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:30.858347" elapsed="0.084663"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.959732" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.959331" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.960604" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.960251" elapsed="0.000428">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:30.960774" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:30.959924" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.961344" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:30.960959" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:30.961685" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:30.961851" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:30.961545" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.962325" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:30.962080" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:30.962855" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.962557" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.963375" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:30.963078" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:30.962940" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:30.962534" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.964664" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:30.963618" elapsed="0.001076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:30.964746" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:30.958724" elapsed="0.006156"/>
</kw>
<msg time="2026-05-01T01:00:30.964966" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:30.957712" elapsed="0.007303"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.965530" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.966056" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.966577" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.966756" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.966922" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.967286" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.967150" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:30.967135" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.967516" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.967676" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.967835" elapsed="0.000059"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:30.967104" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.966998" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.968100" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.968177" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:30.968389" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:30.954871" elapsed="0.013545"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:30.968610" elapsed="0.002481"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:30.973516" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.971875" elapsed="0.001684"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:30.975355" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:30.973753" elapsed="0.001642"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:30.975959" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:30.976598" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.975608" elapsed="0.001081">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.971448" elapsed="0.005420">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:30.971204" elapsed="0.005763">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:30.977152" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:30.977008" elapsed="0.000202"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:30.971178" elapsed="0.006055">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.944135" elapsed="0.033278">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.943327" elapsed="0.034298">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:30.943093" elapsed="0.034640">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:30.943076" elapsed="0.034698">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:30.977830" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:30.853966" elapsed="0.124021">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.023201" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.022811" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.024020" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.023747" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:32.024192" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:32.023397" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.024802" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:32.024377" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.025127" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:32.025290" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:32.024986" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.025795" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.025479" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.027072" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.026743" elapsed="0.000386"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.027622" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.027298" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.028390" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.028026" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:32.029412" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.029035" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:32.029513" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:32.029685" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:32.028633" elapsed="0.001079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.029880" elapsed="0.000310"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:32.027895" elapsed="0.002337"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.030836" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.030498" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:32.031775" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.031396" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:32.031855" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:32.032029" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:32.031055" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.032201" elapsed="0.000303"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:32.030352" elapsed="0.002195"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.034644" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.032800" elapsed="0.001879"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:32.035813" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.035406" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:32.035893" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:32.036053" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:32.034916" elapsed="0.001163"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.036225" elapsed="0.000323"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:32.032664" elapsed="0.003929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.037233" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.036894" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:32.038202" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.037839" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:32.038281" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:32.038475" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:32.037495" elapsed="0.001016"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.038683" elapsed="0.000293"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:32.036716" elapsed="0.002303"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.039617" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.039262" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:32.040539" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.040162" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:32.040616" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:32.040787" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:32.039825" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.040991" elapsed="0.000290"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:32.039136" elapsed="0.002189"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:32.027708" elapsed="0.013651"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:32.041404" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:32.041614" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:32.026326" elapsed="0.015315"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.025955" elapsed="0.015720"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.041848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.041703" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.025927" elapsed="0.016000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.042673" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:32.042098" elapsed="0.000603"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:32.042750" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:32.022183" elapsed="0.020705"/>
</kw>
<msg time="2026-05-01T01:00:32.042961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:32.021280" elapsed="0.021744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.043715" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.044379" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.045014" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.045204" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.045377" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.045820" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.045679" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:32.045663" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.046087" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.046265" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.046425" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:32.045631" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.045519" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.046667" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.046744" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:32.046866" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:32.016667" elapsed="0.030225"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.048434" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.048173" elapsed="0.000356">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:32.048625" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:32.047780" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.049010" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.048729" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.049895" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.049308" elapsed="0.000615"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.049127" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.048705" elapsed="0.001279"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.052491" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:32.050138" elapsed="0.002383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:32.052655" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:32.052837" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:32.047318" elapsed="0.005545"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.054102" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:32.053911" elapsed="0.000245"/>
</kw>
<msg time="2026-05-01T01:00:32.054242" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:32.053575" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.054497" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:32.054340" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.054321" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.054872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:32.055025" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:32.054706" elapsed="0.000345"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:32.055438" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.055202" elapsed="0.000281"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:32.055533" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:32.055693" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:32.053234" elapsed="0.002485"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.057156" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.056876" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.057610" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.057349" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:32.064844" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:32.066115" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:32.066253" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:32.059805" elapsed="0.006476"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.057723" elapsed="0.008602"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.066523" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.066354" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.057704" elapsed="0.008950"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.070345" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.067693" elapsed="0.002741"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.067472" elapsed="0.003035"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.067437" elapsed="0.003109"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.074471" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.070946" elapsed="0.003596"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.070630" elapsed="0.003963"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.070606" elapsed="0.004024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.075484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:32.074878" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.075971" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.075631" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.076789" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.076319" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.076091" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.075604" elapsed="0.001310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.077748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:32.077188" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.078147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.077892" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.078690" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.078378" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.078227" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.077866" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:32.078918" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:32.079746" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:32.079427" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:32.079919" elapsed="0.002713"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:32.067018" elapsed="0.015681"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.082881" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:32.082770" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.082751" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:32.086705" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.083092" elapsed="0.003682"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:32.086831" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:32.087002" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:32.056021" elapsed="0.031009"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:32.087095" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:32.087253" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:31.993787" elapsed="0.093493"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.103730" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.103339" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.104581" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.104244" elapsed="0.000415">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:32.104753" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:32.103915" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.105343" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:32.104935" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:32.105680" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:32.105845" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:32.105541" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.106262" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:32.106021" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:32.106762" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.106470" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.107284" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:32.106986" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:32.106847" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:32.106434" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.108572" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:32.107528" elapsed="0.001074"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:32.108653" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:32.102600" elapsed="0.006183"/>
</kw>
<msg time="2026-05-01T01:00:32.108867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:32.101796" elapsed="0.007120"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.109445" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.110176" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.110697" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.110878" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.111044" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.111414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.111275" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:32.111260" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.111648" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.111809" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.111970" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:32.111230" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.111122" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.112233" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.112312" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:32.112542" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:32.099106" elapsed="0.013464"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:32.112740" elapsed="0.002265"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:32.116924" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.115731" elapsed="0.001223"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:32.118283" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:32.117101" elapsed="0.001211"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:32.118815" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:32.119418" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.118477" elapsed="0.001046">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.115314" elapsed="0.004385">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:32.115086" elapsed="0.004708">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:32.119975" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:32.119834" elapsed="0.000197"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:32.115068" elapsed="0.004986">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.088421" elapsed="0.031807">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:32.087626" elapsed="0.032777">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:32.087365" elapsed="0.033161">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:32.087348" elapsed="0.033218">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:32.120618" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:31.989121" elapsed="0.131643">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.164772" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.164359" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.165581" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.165302" elapsed="0.000358">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:33.165759" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:33.164973" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.166339" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:33.165944" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.166686" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:33.166862" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:33.166543" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.167329" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.167039" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.168358" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.168096" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.168845" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.168575" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.169628" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.169243" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:33.170560" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.170173" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:33.170640" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:33.170803" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:33.169835" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.170978" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:33.169113" elapsed="0.002235"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.172011" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.171612" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:33.173098" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.172739" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:33.173176" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:33.173331" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:33.172375" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.173518" elapsed="0.000283"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:33.171484" elapsed="0.002358"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.174406" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.174083" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:33.175414" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.175025" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:33.175507" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:33.175663" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:33.174636" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.175832" elapsed="0.000279"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:33.173958" elapsed="0.002195"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.176735" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.176391" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:33.177644" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.177270" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:33.177722" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:33.177876" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:33.176940" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.178042" elapsed="0.000280"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:33.176267" elapsed="0.002097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.178966" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.178643" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:33.179910" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.179558" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:33.179986" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:33.180138" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:33.179169" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.180303" elapsed="0.000294"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:33.178517" elapsed="0.002122"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:33.168924" elapsed="0.011748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:33.180715" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:33.180875" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:33.167775" elapsed="0.013126"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.167474" elapsed="0.013459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.181100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.180959" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.167433" elapsed="0.013745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.181806" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:33.181314" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:33.181881" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:33.163753" elapsed="0.018253"/>
</kw>
<msg time="2026-05-01T01:00:33.182060" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:33.162818" elapsed="0.019291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.182668" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.183211" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.183763" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.183945" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.184111" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.184484" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.184329" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:33.184315" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.184697" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.184856" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.185011" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:33.184286" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.184186" elapsed="0.000908"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.185229" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.185305" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:33.185423" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:33.158536" elapsed="0.026912"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.186925" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.186676" elapsed="0.000316">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:33.187086" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:33.186299" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.187446" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.187180" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.188003" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.187712" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.187546" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.187161" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.190425" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:33.188232" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:33.190641" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:33.190808" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:33.185780" elapsed="0.005053"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.192009" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:33.191824" elapsed="0.000239"/>
</kw>
<msg time="2026-05-01T01:00:33.192148" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:33.191494" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.192378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:33.192242" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.192224" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.192764" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:33.192897" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:33.192599" elapsed="0.000324"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:33.193300" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.193070" elapsed="0.000256"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:33.193374" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:33.193548" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:33.191139" elapsed="0.002435"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.194938" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.194692" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.195366" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.195126" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:33.202566" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:33.202762" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:33.202871" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:33.197579" elapsed="0.005318"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.195523" elapsed="0.007415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.203106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.202964" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.195504" elapsed="0.007722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.208065" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.204356" elapsed="0.003795"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.204055" elapsed="0.004145"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.204034" elapsed="0.004201"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.211928" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.208641" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.208315" elapsed="0.003726"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.208291" elapsed="0.003782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.212650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:33.212238" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.212976" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.212749" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.213530" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.213211" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.213058" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.212731" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.214134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:33.213769" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.214473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.214232" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.215005" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.214710" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.214557" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.214214" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:33.215230" elapsed="0.000402"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:33.216077" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:33.215791" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:33.216253" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:33.203630" elapsed="0.015025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.218832" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:33.218725" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.218707" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:33.222634" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.219040" elapsed="0.003659"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:33.222754" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:33.222920" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:33.193877" elapsed="0.029069"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:33.223011" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:33.223164" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:33.136021" elapsed="0.087170"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.242672" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.242264" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.243567" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.243197" elapsed="0.000447">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:33.243770" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:33.242868" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.244587" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:33.243954" elapsed="0.000661"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:33.244918" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:33.245092" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:33.244773" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.245538" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:33.245269" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:33.246065" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.245758" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.246616" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:33.246297" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:33.246155" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:33.245735" elapsed="0.000968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.247913" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:33.246847" elapsed="0.001096"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:33.247997" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:33.241657" elapsed="0.006477"/>
</kw>
<msg time="2026-05-01T01:00:33.248220" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:33.240725" elapsed="0.007544"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.248790" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.249293" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.249806" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.249985" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.250152" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.250536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.250382" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:33.250368" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.250752" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.250911" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.251067" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:33.250337" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.250230" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.251324" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.251403" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:33.251632" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:33.237897" elapsed="0.013762"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:33.251866" elapsed="0.002478"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:33.256323" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.255081" elapsed="0.001272"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:33.257679" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:33.256521" elapsed="0.001187"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:33.258200" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:33.258823" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.257861" elapsed="0.001056">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.254676" elapsed="0.004417">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:33.254426" elapsed="0.004765">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:33.259375" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:33.259232" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:33.254408" elapsed="0.005063">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.224381" elapsed="0.035268">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.223534" elapsed="0.036430">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:33.223276" elapsed="0.036887">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:33.223259" elapsed="0.036974">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:33.260315" elapsed="0.000026"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:33.130301" elapsed="0.130279">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.303445" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.303044" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.304268" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.304001" elapsed="0.000346">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:34.304444" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:34.303666" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.305089" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:34.304648" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.305418" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:34.305605" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:34.305273" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.306028" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.305782" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.307045" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.306784" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.307533" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.307246" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.308285" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.307926" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:34.309300" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.308862" elapsed="0.000465"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:34.309381" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:34.309565" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:34.308520" elapsed="0.001071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.309739" elapsed="0.000300"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:34.307795" elapsed="0.002286"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.310835" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.310324" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:34.311789" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.311412" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:34.311868" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:34.312021" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:34.311068" elapsed="0.000978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.312190" elapsed="0.000296"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:34.310199" elapsed="0.002329"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.313168" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.312767" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:34.314147" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.313785" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:34.314224" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:34.314377" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:34.313375" elapsed="0.001027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.314561" elapsed="0.000278"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:34.312643" elapsed="0.002239"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.315445" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.315121" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:34.316359" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.316002" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:34.316436" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T01:00:34.316607" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:34.315669" elapsed="0.000963"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.316774" elapsed="0.000332"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:34.314997" elapsed="0.002159"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.317763" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.317402" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:34.318663" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.318296" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:34.318738" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:34.318889" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:34.317967" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.319054" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:34.317276" elapsed="0.002098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:34.307612" elapsed="0.011795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:34.319453" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T01:00:34.319627" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:34.306449" elapsed="0.013204"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.306154" elapsed="0.013530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.319854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.319712" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.306129" elapsed="0.013802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.320569" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:34.320067" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:34.320645" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:34.302422" elapsed="0.018347"/>
</kw>
<msg time="2026-05-01T01:00:34.320825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:34.301542" elapsed="0.019331"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.321421" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.322032" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.322545" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.322724" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.322889" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.323248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.323111" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:34.323095" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.323475" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.323637" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.323793" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:34.323064" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.322962" elapsed="0.000908"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.324007" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.324082" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:34.324200" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:34.297141" elapsed="0.027085"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.325804" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.325561" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:34.325965" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:34.325158" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.326299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.326060" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.326857" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.326564" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.326379" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.326041" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.329536" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:34.327082" elapsed="0.002481"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:34.329648" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:34.329809" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:34.324777" elapsed="0.005057"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.330981" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:34.330792" elapsed="0.000242"/>
</kw>
<msg time="2026-05-01T01:00:34.331118" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:34.330449" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.331348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:34.331212" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.331193" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.331733" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:34.331873" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:34.331567" elapsed="0.000332"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:34.332277" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.332045" elapsed="0.000258"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:34.332350" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:34.332521" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:34.330134" elapsed="0.002413"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.333995" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.333746" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.334422" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.334183" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:34.341636" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:34.341886" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:34.342011" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:34.336598" elapsed="0.005440"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.334552" elapsed="0.007528"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.342262" elapsed="0.000175"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.342111" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.334533" elapsed="0.008023"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.347691" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.343571" elapsed="0.004182"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.343340" elapsed="0.004448"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.343323" elapsed="0.004491"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.350424" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.348088" elapsed="0.002399"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.347870" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.347854" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.351129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:34.350720" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.351475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.351227" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.352014" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.351713" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.351558" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.351209" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.352633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:34.352250" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.352955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.352730" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.353543" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.353231" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.353036" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.352712" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:34.353771" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:34.354591" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:34.354278" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:34.354766" elapsed="0.002329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:34.342915" elapsed="0.014274"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.357369" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:34.357259" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.357241" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:34.361133" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.357598" elapsed="0.003655"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:34.361311" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:34.361506" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:34.332849" elapsed="0.028685"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:34.361600" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:34.361753" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:34.274443" elapsed="0.087336"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.378271" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.377891" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.379135" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.378806" elapsed="0.000404">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:34.379305" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:34.378482" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.379904" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:34.379513" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:34.380232" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:34.380401" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:34.380087" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.381061" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:34.380597" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:34.381619" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.381300" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.382153" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:34.381846" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:34.381705" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:34.381278" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.383437" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:34.382380" elapsed="0.001104"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:34.383539" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:34.377274" elapsed="0.006400"/>
</kw>
<msg time="2026-05-01T01:00:34.383760" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:34.376358" elapsed="0.007451"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.384297" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.384820" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.385358" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.385554" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.385721" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.386087" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.385949" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:34.385935" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.386367" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.386551" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.386715" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:34.385905" elapsed="0.000897"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.385799" elapsed="0.001031"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.386970" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.387049" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:34.387263" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:34.373634" elapsed="0.013656"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:34.387479" elapsed="0.002276"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:34.391691" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.390482" elapsed="0.001240"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:34.393030" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:34.391870" elapsed="0.001189"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:34.393602" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:34.394208" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.393207" elapsed="0.001088">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.390067" elapsed="0.004418">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:34.389836" elapsed="0.004747">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:34.394765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:34.394623" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:34.389818" elapsed="0.005025">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.362936" elapsed="0.032082">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.362109" elapsed="0.033089">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:34.361863" elapsed="0.033441">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:34.361846" elapsed="0.033497">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:34.395396" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:34.268632" elapsed="0.126929">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.439142" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.438750" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.439948" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.439697" elapsed="0.000327">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:35.440121" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:35.439346" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.440723" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:35.440309" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.441051" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:35.441203" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:35.440908" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.441649" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.441381" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.442705" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.442421" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.443176" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.442907" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.443945" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.443582" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:35.444891" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.444517" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:35.444973" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:35.445135" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:35.444154" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.445310" elapsed="0.000317"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:35.443434" elapsed="0.002235"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.446468" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.445945" elapsed="0.000552"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:35.447379" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.447021" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:35.447474" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:35.447635" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:35.446682" elapsed="0.000979"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.447806" elapsed="0.000282"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:35.445815" elapsed="0.002315"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.448724" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.448375" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:35.449711" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.449330" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:35.449806" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:35.449963" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:35.448931" elapsed="0.001058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.450134" elapsed="0.000282"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:35.448248" elapsed="0.002228"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.451049" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.450722" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:35.451969" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.451607" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:35.452047" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:35.452201" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:35.451255" elapsed="0.000971"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.452371" elapsed="0.000298"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:35.450595" elapsed="0.002117"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.453283" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.452956" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:35.454258" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.453901" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:35.454335" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:35.454508" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:35.453523" elapsed="0.001011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.454678" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:35.452829" elapsed="0.002168"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:35.443254" elapsed="0.011777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:35.455074" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:35.455236" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:35.442104" elapsed="0.013158"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.441805" elapsed="0.013489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.455479" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.455320" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.441780" elapsed="0.013779"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.456174" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:35.455697" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:35.456250" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:35.438125" elapsed="0.018251"/>
</kw>
<msg time="2026-05-01T01:00:35.456430" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:35.437204" elapsed="0.019291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.456991" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.457602" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.458116" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.458297" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.458477" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.458837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.458699" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:35.458685" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.459050" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.459209" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.459364" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:35.458655" elapsed="0.000761"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.458553" elapsed="0.000889"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.459602" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.459679" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:35.459796" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:35.432915" elapsed="0.026906"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.461274" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.461036" elapsed="0.000303">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:35.461432" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:35.460703" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.461874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.461596" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.462424" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.462129" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.461958" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.461577" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.464892" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:35.462676" elapsed="0.002243"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:35.465005" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:35.465166" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:35.460363" elapsed="0.004828"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.466360" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:35.466172" elapsed="0.000241"/>
</kw>
<msg time="2026-05-01T01:00:35.466517" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:35.465830" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.466749" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:35.466612" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.466594" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.467121" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:35.467252" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:35.466955" elapsed="0.000324"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:35.467677" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.467426" elapsed="0.000277"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:35.467751" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:35.467907" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:35.465514" elapsed="0.002418"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.469299" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.469054" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.469743" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.469502" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:35.477095" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:35.477291" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:35.477399" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:35.471948" elapsed="0.005477"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.469880" elapsed="0.007608"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.477662" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.477515" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.469834" elapsed="0.007946"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.482893" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.479163" elapsed="0.003814"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.478867" elapsed="0.004159"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.478841" elapsed="0.004222"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.486634" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.483444" elapsed="0.003237"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.483142" elapsed="0.003575"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.483119" elapsed="0.003624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.487302" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:35.486903" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.487654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.487403" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.488188" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.487890" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.487737" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.487384" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.488806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:35.488424" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.489126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.488903" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.489668" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.489357" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.489207" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.488885" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:35.489894" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:35.490719" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:35.490415" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:35.490892" elapsed="0.002334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:35.478222" elapsed="0.015069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.493485" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:35.493361" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.493343" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:35.497308" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.493698" elapsed="0.003677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:35.497431" elapsed="0.000051"/>
</return>
<msg time="2026-05-01T01:00:35.497619" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:35.468234" elapsed="0.029413"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:35.497713" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:35.497870" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:35.410474" elapsed="0.087424"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.514102" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.513714" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.514913" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.514621" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:35.515078" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:35.514284" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.515828" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:35.515258" elapsed="0.000599"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:35.516158" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:35.516312" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:35.516014" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.516753" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:35.516506" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:35.517236" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.516946" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.517775" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:35.517477" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:35.517321" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:35.516926" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.519102" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:35.517998" elapsed="0.001133"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:35.519182" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:35.513101" elapsed="0.006210"/>
</kw>
<msg time="2026-05-01T01:00:35.519396" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:35.512310" elapsed="0.007135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.519953" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.520470" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.520968" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.521146" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.521310" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.521689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.521554" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:35.521540" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.521898" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.522079" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.522239" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:35.521509" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.521387" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.522511" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.522591" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:35.522802" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:35.509614" elapsed="0.013215"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:35.522999" elapsed="0.002236"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:35.527181" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.525966" elapsed="0.001244"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:35.528518" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:35.527357" elapsed="0.001190"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:35.529030" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:35.529642" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.528696" elapsed="0.001032">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.525566" elapsed="0.004338">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:35.525318" elapsed="0.004682">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:35.530201" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:35.530039" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:35.525299" elapsed="0.004983">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.499068" elapsed="0.031409">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.498252" elapsed="0.032402">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:35.498010" elapsed="0.032749">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:35.497992" elapsed="0.032807">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:35.530852" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:35.405668" elapsed="0.125333">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.577849" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.577424" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.578828" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.578548" elapsed="0.000360">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:36.579005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:36.578134" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.579599" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:36.579189" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.579927" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:36.580095" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:36.579782" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.580538" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.580272" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.581591" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.581309" elapsed="0.000328"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.582147" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.581793" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.582945" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.582579" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:36.583903" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.583526" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:36.583984" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:36.584153" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:36.583156" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.584325" elapsed="0.000327"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:36.582428" elapsed="0.002266"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.585474" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.584937" elapsed="0.000566"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:36.586427" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.586025" elapsed="0.000443"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:36.586522" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:36.586678" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:36.585686" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.586848" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:36.584811" elapsed="0.002359"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.587970" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.587520" elapsed="0.000486"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:36.589316" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.588829" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:36.589423" elapsed="0.000065"/>
</return>
<msg time="2026-05-01T01:00:36.589666" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:36.588255" elapsed="0.001446"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.589902" elapsed="0.000416"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:36.587320" elapsed="0.003057"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.591184" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.590735" elapsed="0.000485"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:36.592512" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.591968" elapsed="0.000583"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:36.592622" elapsed="0.000043"/>
</return>
<msg time="2026-05-01T01:00:36.592836" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:36.591497" elapsed="0.001373"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.593070" elapsed="0.000408"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:36.590559" elapsed="0.002979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.594363" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.593872" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:36.595522" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.595141" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:36.595599" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:36.595753" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:36.594678" elapsed="0.001100"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.595920" elapsed="0.000277"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:36.593698" elapsed="0.002541"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:36.582241" elapsed="0.014032"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:36.596316" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:36.596547" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:36.580984" elapsed="0.015591"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.580666" elapsed="0.015940"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.596777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.596633" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.580641" elapsed="0.016213"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.597487" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:36.596991" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:36.597564" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:36.576634" elapsed="0.021056"/>
</kw>
<msg time="2026-05-01T01:00:36.597746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:36.575650" elapsed="0.022146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.598319" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.598886" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.599413" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.599607" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.599772" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.600132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.599994" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:36.599980" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.600344" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.600546" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.600708" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:36.599949" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.599848" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.600924" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.600999" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:36.601120" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:36.571056" elapsed="0.030089"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.602671" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.602394" elapsed="0.000347">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:36.602833" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:36.602020" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.603166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.602928" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.603720" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.603412" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.603246" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.602909" elapsed="0.000895"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.606199" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:36.603945" elapsed="0.002280"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:36.606316" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:36.606492" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:36.601699" elapsed="0.004820"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.607674" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:36.607478" elapsed="0.000250"/>
</kw>
<msg time="2026-05-01T01:00:36.607813" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:36.607133" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.608046" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:36.607909" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.607891" elapsed="0.000222"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.608413" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:36.608675" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:36.608249" elapsed="0.000453"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:36.609089" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.608854" elapsed="0.000262"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:36.609163" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:36.609317" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:36.606817" elapsed="0.002524"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.610774" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.610525" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.611204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.610965" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:36.618397" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:36.618615" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:36.618725" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:36.613370" elapsed="0.005381"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.611313" elapsed="0.007480"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.618966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.618820" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.611295" elapsed="0.007790"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.624139" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:20","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.620443" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.620138" elapsed="0.004137"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.620114" elapsed="0.004196"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.627773" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.624717" elapsed="0.003102"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.624387" elapsed="0.003466"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.624365" elapsed="0.003513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.628430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:36.628039" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.628778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.628547" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.629317" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.629016" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.628860" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.628529" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.629937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:36.629571" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.630280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.630034" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.630822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.630528" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.630362" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.630017" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:36.631048" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:36.631851" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:36.631566" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:36.632023" elapsed="0.002357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:36.619550" elapsed="0.014894"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.634636" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:36.634530" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.634511" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:36.638367" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.634841" elapsed="0.003588"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:36.638501" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:36.638664" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:36.609664" elapsed="0.029027"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:36.638755" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:36.638908" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:36.547536" elapsed="0.091399"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.655176" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.654808" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.655975" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.655695" elapsed="0.000348">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:36.656136" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:36.655356" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.656722" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:36.656318" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:36.657038" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:36.657181" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:36.656902" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.657620" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:36.657354" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:36.658093" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.657809" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.658661" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:36.658348" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:36.658176" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:36.657790" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.659903" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:36.658881" elapsed="0.001051"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:36.659982" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:36.654171" elapsed="0.005938"/>
</kw>
<msg time="2026-05-01T01:00:36.660192" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:36.653387" elapsed="0.006854"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.660740" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.661239" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.661889" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.662066" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.662230" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.662634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.662495" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:36.662479" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.662850" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.663010" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.663168" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:36.662436" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.662330" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.663420" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.663514" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:36.663727" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:36.650658" elapsed="0.013095"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:36.663920" elapsed="0.003627"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:36.669442" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.668271" elapsed="0.001226"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:36.670819" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:36.669648" elapsed="0.001201"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:36.671335" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:36.671941" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.671000" elapsed="0.001028">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.667866" elapsed="0.004336">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:36.667631" elapsed="0.004666">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:36.672496" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:36.672337" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:36.667612" elapsed="0.004966">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.640060" elapsed="0.032715">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.639251" elapsed="0.033700">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:36.639019" elapsed="0.034037">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:36.639002" elapsed="0.034093">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:36.673147" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:36.540366" elapsed="0.132928">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.718284" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.717890" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.719093" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.718831" elapsed="0.000336">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:37.719263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:37.718499" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.720064" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:37.719449" elapsed="0.000643"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.720402" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:37.720636" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:37.720257" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.721070" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.720820" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.722128" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.721862" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.722618" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.722332" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.723369" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.723008" elapsed="0.000387"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:37.724307" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.723940" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:37.724387" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:37.724569" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:37.723602" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.724742" elapsed="0.000298"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:37.722878" elapsed="0.002204"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.725670" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.725324" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:37.726612" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.726231" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:37.726690" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:37.726846" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:37.725894" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.727017" elapsed="0.000278"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:37.725198" elapsed="0.002139"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.727922" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.727595" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:37.728898" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.728539" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:37.728975" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:37.729127" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:37.728127" elapsed="0.001026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.729296" elapsed="0.000299"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:37.727467" elapsed="0.002172"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.730267" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.729936" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:37.731186" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.730824" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:37.731265" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:37.731418" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:37.730489" elapsed="0.000955"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.731606" elapsed="0.000281"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:37.729755" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.732724" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.732172" elapsed="0.000578"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:37.733639" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.733266" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:37.733717" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:37.733902" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:37.732931" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.734073" elapsed="0.000279"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:37.732046" elapsed="0.002348"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:37.722697" elapsed="0.011731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:37.734487" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:37.734649" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:37.721508" elapsed="0.013168"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.721190" elapsed="0.013518"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.734877" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.734734" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.721168" elapsed="0.013787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.735587" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:37.735090" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:37.735664" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:37.717237" elapsed="0.018552"/>
</kw>
<msg time="2026-05-01T01:00:37.735845" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:37.716354" elapsed="0.019539"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.736378" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.736986" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.737500" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.737678" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.737842" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.738224" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.738088" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:37.738074" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.738440" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.738618" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.738775" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:37.738045" elapsed="0.000781"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.737944" elapsed="0.000909"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.738989" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.739064" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:37.739181" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:37.712033" elapsed="0.027174"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.740425" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.740186" elapsed="0.000361">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:37.740640" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:37.739856" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.740975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.740736" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.741536" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.741224" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.741058" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.740716" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.744188" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:37.741763" elapsed="0.002453"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:37.744305" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:37.744493" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:37.739539" elapsed="0.004981"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.745687" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:37.745498" elapsed="0.000243"/>
</kw>
<msg time="2026-05-01T01:00:37.745828" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:37.745146" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.746117" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:37.745975" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.745955" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.746511" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:37.746641" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:37.746326" elapsed="0.000342"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:37.747050" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.746817" elapsed="0.000259"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:37.747125" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:37.747286" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:37.744825" elapsed="0.002487"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.748701" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.748434" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.749132" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.748892" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:37.755744" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:37.756976" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:37.757102" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:37.751336" elapsed="0.005793"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.749242" elapsed="0.007930"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.757350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.757198" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.749224" elapsed="0.008262"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.761025" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.758516" elapsed="0.002569"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.758286" elapsed="0.002833"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.758268" elapsed="0.002877"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.764437" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.761417" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.761201" elapsed="0.003373"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.761184" elapsed="0.003425"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.765368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:37.764829" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.765848" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.765527" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.766655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.766215" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.765998" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.765501" elapsed="0.001272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.767515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:37.766985" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.767970" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.767653" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.768734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.768300" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.768085" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.767628" elapsed="0.001223"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:37.769050" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:37.770210" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:37.769777" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:37.770390" elapsed="0.002521"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:37.757841" elapsed="0.015138"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.773184" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:37.773070" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.773046" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:37.776991" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.773397" elapsed="0.003656"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:37.777109" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:37.777271" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:37.747632" elapsed="0.029666"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:37.777362" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:37.777533" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:37.689692" elapsed="0.087868"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.793950" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.793577" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.794798" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.794521" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:37.794960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:37.794180" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.795549" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:37.795141" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:37.795866" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:37.796008" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:37.795731" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.796426" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:37.796184" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:37.796968" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.796648" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.797512" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:37.797195" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:37.797055" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:37.796623" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.798955" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:37.797737" elapsed="0.001248"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:37.799036" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:37.792961" elapsed="0.006203"/>
</kw>
<msg time="2026-05-01T01:00:37.799262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:37.792132" elapsed="0.007190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.799839" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.800546" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.801086" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.801292" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.801482" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.801880" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.801743" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:37.801729" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.802200" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.802382" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.802563" elapsed="0.000054"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:37.801698" elapsed="0.000957"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.801577" elapsed="0.001106"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.802824" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.802903" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:37.803118" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:37.789356" elapsed="0.013789"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:37.803314" elapsed="0.002264"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:37.807667" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.806351" elapsed="0.001346"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:37.808990" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:37.807846" elapsed="0.001174"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:37.809521" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:37.810149" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.809170" elapsed="0.001069">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.805894" elapsed="0.004519">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:37.805661" elapsed="0.004864">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:37.810708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:37.810566" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:37.805642" elapsed="0.005146">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.778736" elapsed="0.032228">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.777877" elapsed="0.033262">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:37.777644" elapsed="0.033603">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:37.777627" elapsed="0.033662">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:37.811341" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:37.683822" elapsed="0.127681">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.854993" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.854601" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.855797" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.855536" elapsed="0.000338">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:38.855969" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:38.855193" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.856557" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:38.856152" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.856879" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:38.857043" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:38.856739" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.857496" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.857235" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.858511" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.858237" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.858975" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.858710" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.859743" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.859368" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:38.860679" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.860286" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:38.860760" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:38.860922" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:38.859948" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.861092" elapsed="0.000334"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:38.859235" elapsed="0.002248"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.862048" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.861726" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:38.863118" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.862760" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:38.863196" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:38.863350" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:38.862406" elapsed="0.000969"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.863535" elapsed="0.000278"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:38.861602" elapsed="0.002251"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.864419" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.864094" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:38.865396" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.865028" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:38.865501" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:38.865658" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:38.864641" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.865827" elapsed="0.000276"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:38.863969" elapsed="0.002175"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.866724" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.866382" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:38.867637" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.867262" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:38.867714" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:38.867865" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:38.866930" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.868031" elapsed="0.000276"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:38.866259" elapsed="0.002089"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.868923" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.868604" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:38.869870" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.869522" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:38.869946" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:38.870098" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:38.869124" elapsed="0.000998"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.870264" elapsed="0.000291"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:38.868478" elapsed="0.002119"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:38.859054" elapsed="0.011576"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:38.870674" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:38.870832" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:38.857920" elapsed="0.012939"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.857622" elapsed="0.013268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.871055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.870916" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.857599" elapsed="0.013533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.871751" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:38.871266" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:38.871826" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:38.853979" elapsed="0.017970"/>
</kw>
<msg time="2026-05-01T01:00:38.872003" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:38.853039" elapsed="0.019012"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.872556" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.873094" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.873680" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.873861" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.874034" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.874391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.874255" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:38.874240" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.874620" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.874779" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.874935" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:38.874210" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.874110" elapsed="0.000904"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.875149" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.875223" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:38.875343" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:38.848748" elapsed="0.026621"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.876832" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.876583" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:38.876990" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:38.876229" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.877364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.877085" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.877971" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.877680" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.877445" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.877067" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.880418" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:38.878197" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:38.880546" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:38.880707" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:38.875699" elapsed="0.005034"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.881895" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:38.881708" elapsed="0.000241"/>
</kw>
<msg time="2026-05-01T01:00:38.882033" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:38.881363" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.882263" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:38.882128" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.882109" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.882648" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:38.882785" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:38.882481" elapsed="0.000330"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:38.883188" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.882958" elapsed="0.000257"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:38.883262" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:38.883415" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:38.881030" elapsed="0.002410"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.884816" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.884569" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.885275" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.885005" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:38.892703" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:38.892893" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:38.893002" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:38.887442" elapsed="0.005586"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.885386" elapsed="0.007685"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.893294" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.893097" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.885367" elapsed="0.008051"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.897072" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.894428" elapsed="0.002704"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.894215" elapsed="0.002952"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.894197" elapsed="0.002995"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.899807" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.897492" elapsed="0.002360"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.897260" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.897243" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.900488" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:38.900083" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.900819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.900589" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.901392" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.901054" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.900901" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.900571" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.902007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:38.901645" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.902326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.902104" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.902868" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.902576" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.902407" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.902086" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:38.903093" elapsed="0.000502"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:38.904037" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:38.903755" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:38.904208" elapsed="0.002370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:38.893791" elapsed="0.012850"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.906818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:38.906711" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.906693" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:38.910598" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.907024" elapsed="0.003636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:38.910717" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:38.910878" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:38.883755" elapsed="0.027149"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:38.910969" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:38.911119" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:38.826191" elapsed="0.084954"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.927379" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.927009" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.928182" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.927900" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:38.928343" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:38.927579" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.928925" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:38.928543" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:38.929239" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:38.929558" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:38.929105" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.929978" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:38.929736" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:38.930475" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.930167" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.930991" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:38.930699" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:38.930561" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:38.930149" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.932239" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:38.931209" elapsed="0.001061"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:38.932323" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:38.926391" elapsed="0.006058"/>
</kw>
<msg time="2026-05-01T01:00:38.932551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:38.925627" elapsed="0.006974"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.933082" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.933639" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.934128" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.934304" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.934482" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.934837" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.934705" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:38.934691" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.935046" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.935203" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.935360" elapsed="0.000055"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:38.934661" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.934560" elapsed="0.000934"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.935634" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.935711" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:38.935922" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:38.922844" elapsed="0.013105"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:38.936117" elapsed="0.002498"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:38.940639" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.939380" elapsed="0.001290"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:38.942060" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:38.940836" elapsed="0.001253"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:38.942589" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:38.943180" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.942240" elapsed="0.001026">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.938953" elapsed="0.004486">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:38.938708" elapsed="0.004846">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:38.943736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:38.943594" elapsed="0.000198"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:38.938683" elapsed="0.005132">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.912265" elapsed="0.031725">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.911479" elapsed="0.032683">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:38.911228" elapsed="0.033039">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:38.911212" elapsed="0.033099">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:38.944363" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:38.819863" elapsed="0.124664">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.994809" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:39.994399" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:39.995617" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:39.995338" elapsed="0.000354">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:39.995788" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:39.995008" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.996446" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:39.995988" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:39.996792" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:39.996956" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:39.996648" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.997377" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:39.997130" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.998393" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:39.998134" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.998879" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:39.998609" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:39.999695" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:39.999268" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:40.000869" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.000405" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:40.000964" elapsed="0.000041"/>
</return>
<msg time="2026-05-01T01:00:40.001156" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:39.999942" elapsed="0.001244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.001363" elapsed="0.000372"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:39.999140" elapsed="0.002644"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.002425" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.002075" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:40.003353" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.002996" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:40.003430" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T01:00:40.003602" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:40.002651" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.003771" elapsed="0.000279"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:40.001921" elapsed="0.002206"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.004783" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.004409" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:40.006046" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.005646" elapsed="0.000428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:40.006126" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:40.006280" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:40.005008" elapsed="0.001300"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.006484" elapsed="0.000286"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:40.004269" elapsed="0.002553"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.007467" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.007110" elapsed="0.000385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:40.008498" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.008033" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:40.008581" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:40.008736" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:40.007680" elapsed="0.001080"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.008907" elapsed="0.000278"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:40.006970" elapsed="0.002257"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.009836" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.009508" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:40.010755" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.010376" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:40.010831" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:40.010983" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:40.010043" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.011150" elapsed="0.000280"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:40.009346" elapsed="0.002141"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:39.998960" elapsed="0.012561"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:40.011565" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:40.011724" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:39.997818" elapsed="0.013932"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:39.997521" elapsed="0.014261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.011951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.011809" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:39.997494" elapsed="0.014533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.012681" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:40.012187" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:40.012758" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:39.993791" elapsed="0.019092"/>
</kw>
<msg time="2026-05-01T01:00:40.012937" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:39.992859" elapsed="0.020127"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.013542" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.014089" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.014603" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.014782" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.014947" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.015307" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.015169" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:40.015154" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.015538" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.015699" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.015854" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:40.015125" elapsed="0.000781"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.015022" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.016069" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.016176" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:40.016298" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:39.986371" elapsed="0.029953"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:40.017599" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.017298" elapsed="0.000372">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:40.017762" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:40.016968" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.018094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.017858" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.018652" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:40.018342" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.018175" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.017839" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.021347" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:40.018876" elapsed="0.002499"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:40.021493" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:40.021657" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:40.016654" elapsed="0.005027"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:40.022845" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:40.022652" elapsed="0.000247"/>
</kw>
<msg time="2026-05-01T01:00:40.022983" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:40.022304" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.023215" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:40.023078" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.023060" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:40.023602" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:40.023756" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:40.023419" elapsed="0.000364"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:40.024202" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.023931" elapsed="0.000299"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:40.024279" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:40.024437" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:40.021985" elapsed="0.002493"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.025871" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:40.025618" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.026302" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:40.026061" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:40.035190" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:40.035401" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:40.035584" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:40.028551" elapsed="0.007062"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.026410" elapsed="0.009254"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.035881" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.035697" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.026392" elapsed="0.009643"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.039746" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:40.037168" elapsed="0.002638"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.036941" elapsed="0.002900"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.036921" elapsed="0.002945"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.042512" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:40.040138" elapsed="0.002422"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.039923" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.039907" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.043208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:40.042793" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.043552" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.043307" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.044091" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:40.043790" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.043636" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.043289" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.044731" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:40.044349" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.045052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.044827" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.045598" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:40.045286" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.045134" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.044809" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:40.045830" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:40.046658" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:40.046338" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:40.046831" elapsed="0.002580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:40.036468" elapsed="0.013026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.049676" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:40.049566" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.049548" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:40.053436" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.049887" elapsed="0.003639"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:40.053583" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:40.053754" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:40.024791" elapsed="0.028990"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:40.053846" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:40.054001" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:39.958038" elapsed="0.095990"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.070266" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:40.069895" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:40.071089" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.070788" elapsed="0.000378">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:40.071261" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:40.070448" elapsed="0.000838"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.071853" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:40.071444" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:40.072173" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:40.072370" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:40.072035" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.072813" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:40.072565" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:40.073296" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.073004" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.073839" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:40.073542" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:40.073386" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:40.072985" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.075103" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:40.074062" elapsed="0.001071"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:40.075183" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:40.069277" elapsed="0.006035"/>
</kw>
<msg time="2026-05-01T01:00:40.075396" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:40.068503" elapsed="0.006943"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.075951" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.076695" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.077207" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.077388" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.077570" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.077941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.077803" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:40.077788" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.078157" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.078320" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.078496" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:40.077757" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.077649" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.078752" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.078830" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:40.079043" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:40.065833" elapsed="0.013237"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:40.079239" elapsed="0.002405"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:40.083562" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.082361" elapsed="0.001231"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:40.084934" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:40.083739" elapsed="0.001224"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:40.085468" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:40.086064" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.085113" elapsed="0.001038">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.081959" elapsed="0.004371">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:40.081726" elapsed="0.004700">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:40.086626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:40.086482" elapsed="0.000201"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:40.081707" elapsed="0.005000">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.055170" elapsed="0.031713">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:40.054353" elapsed="0.032705">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:40.054113" elapsed="0.033052">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:40.054095" elapsed="0.033109">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:40.087256" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:39.953129" elapsed="0.134275">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.132532" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.132117" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.133340" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.133070" elapsed="0.000351">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:41.133538" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:41.132737" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.134119" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:41.133724" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.134723" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:41.134908" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:41.134322" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.135344" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.135091" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.136418" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.136154" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.136908" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.136637" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.137686" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.137303" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:41.138641" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.138234" elapsed="0.000434"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:41.138759" elapsed="0.000047"/>
</return>
<msg time="2026-05-01T01:00:41.138960" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:41.137893" elapsed="0.001098"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.139147" elapsed="0.000318"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:41.137174" elapsed="0.002334"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.140079" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.139754" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:41.141314" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.140949" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:41.141393" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:41.141566" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:41.140599" elapsed="0.000993"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.141737" elapsed="0.000280"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:41.139627" elapsed="0.002431"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.142640" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.142298" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:41.143725" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.143332" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:41.143804" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:41.143982" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:41.142919" elapsed="0.001091"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.144157" elapsed="0.000289"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:41.142172" elapsed="0.002334"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.145104" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.144753" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:41.146040" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.145677" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:41.146135" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:41.146297" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:41.145316" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.146501" elapsed="0.000355"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:41.144625" elapsed="0.002281"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.147559" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.147172" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:41.148515" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.148113" elapsed="0.000431"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:41.148595" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:41.148752" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:41.147773" elapsed="0.001004"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.148920" elapsed="0.000285"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:41.147038" elapsed="0.002209"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:41.136989" elapsed="0.012292"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:41.149327" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:41.149532" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:41.135825" elapsed="0.013736"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.135503" elapsed="0.014091"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.149769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.149623" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.135448" elapsed="0.014399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.150543" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:41.149987" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:41.150624" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:41.131509" elapsed="0.019287"/>
</kw>
<msg time="2026-05-01T01:00:41.150868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:41.130522" elapsed="0.020408"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.151440" elapsed="0.000096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.152095" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.152667" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.152889" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.153060" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.153419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.153283" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:41.153268" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.153654" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.153849" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.154024" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:41.153239" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.153134" elapsed="0.000971"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.154246" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.154322" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:41.154445" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:41.126177" elapsed="0.028311"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.156118" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.155832" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:41.156295" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:41.155424" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.156658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.156393" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.157302" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.156949" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.156771" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.156373" elapsed="0.001022"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.159906" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:41.157573" elapsed="0.002361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:41.160021" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:41.160183" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:41.154867" elapsed="0.005342"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.161361" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:41.161175" elapsed="0.000239"/>
</kw>
<msg time="2026-05-01T01:00:41.161515" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:41.160845" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.161750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:41.161611" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.161593" elapsed="0.000226"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.162121" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:41.162252" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:41.161956" elapsed="0.000323"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:41.162676" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.162426" elapsed="0.000277"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:41.162789" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:41.162958" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:41.160529" elapsed="0.002455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.164351" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.164103" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.164838" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.164564" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:41.173679" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:41.173957" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1852'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:41.174118" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:41.167155" elapsed="0.007000"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.164961" elapsed="0.009252"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.174502" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.174249" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.164941" elapsed="0.009765"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.180599" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:25","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":0,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":2,"sent-msg-count":0,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.176281" elapsed="0.004407"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.175975" elapsed="0.004776"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.175948" elapsed="0.004848"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.184537" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.181201" elapsed="0.003404"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.180881" elapsed="0.003773"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.180856" elapsed="0.003834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.185586" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:41.184986" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.186069" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.185738" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.186912" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.186404" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.186185" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.185711" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.187692" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:41.187267" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.188023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.187792" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.188576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.188255" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.188105" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.187773" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:41.188822" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:41.189647" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:41.189336" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:41.189823" elapsed="0.002363"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:41.175271" elapsed="0.016979"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.192432" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:41.192322" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.192303" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:41.196282" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.192664" elapsed="0.003685"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:41.196406" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:41.196593" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:41.163284" elapsed="0.033337"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:41.196687" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:41.196869" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:41.103177" elapsed="0.093720"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.213483" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.213045" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.214314" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.213997" elapsed="0.000403">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:41.214550" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:41.213672" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.215442" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:41.214781" elapsed="0.000708"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:41.215793" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:41.215951" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:41.215652" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.216383" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:41.216129" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:41.216952" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.216629" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.217513" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:41.217182" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:41.217040" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:41.216608" elapsed="0.001013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.218932" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:41.217767" elapsed="0.001197"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:41.219016" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:41.212402" elapsed="0.006747"/>
</kw>
<msg time="2026-05-01T01:00:41.219251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:41.211553" elapsed="0.007751"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.219845" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.220350" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.220946" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.221133" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.221302" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.221694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.221556" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:41.221541" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.221928" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.222104" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.222265" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:41.221510" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.221384" elapsed="0.001000"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.222541" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.222622" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:41.222838" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:41.208778" elapsed="0.014088"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:41.223087" elapsed="0.002444"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:41.227557" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.226261" elapsed="0.001326"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:41.228889" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:41.227737" elapsed="0.001181"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:41.229403" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 0,
       "received-msg-count": 2,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 0,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:41.230012" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
+       "sent-init-msg-count": 0,
        "sent-msg-count": 0,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.229068" elapsed="0.001032">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.225853" elapsed="0.004425">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:41.225615" elapsed="0.004759">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:41.230574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:41.230414" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:41.225596" elapsed="0.005058">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.198064" elapsed="0.032768">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.197233" elapsed="0.033810">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:41.196986" elapsed="0.034165">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:41.196967" elapsed="0.034223">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:41.231243" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:41.097089" elapsed="0.134302">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
+       "last-received-rpt-msg-timestamp": 1777597211,
        "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
        "received-msg-count": 2,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.276399" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.276003" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.277257" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.276959" elapsed="0.000375">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.277434" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.276622" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.278064" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.277643" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.278420" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.278607" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.278254" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.279046" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.278794" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.280099" level="INFO">mapping: {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.279830" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.280605" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.280307" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.281429" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.281004" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.282432" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.282038" elapsed="0.000439"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.282533" elapsed="0.000040"/>
</return>
<msg time="2026-05-01T01:00:42.282704" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.281674" elapsed="0.001056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.282878" elapsed="0.000307"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:42.280873" elapsed="0.002354"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.284042" level="INFO">${value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.283499" elapsed="0.000577"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.284996" level="INFO">${encoded} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.284633" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.285102" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:42.285272" level="INFO">${encoded_value} = cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.284271" elapsed="0.001028"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.285465" elapsed="0.000324"/>
</kw>
<var name="${key}">CODE</var>
<var name="${value}">cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=</var>
<status status="PASS" start="2026-05-01T01:00:42.283345" elapsed="0.002487"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.286420" level="INFO">${value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.286076" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.287418" level="INFO">${encoded} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.287053" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.287516" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:42.287675" level="INFO">${encoded_value} = pcc_10.30.170.157_tunnel_1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.286655" elapsed="0.001046"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.287845" elapsed="0.000286"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">pcc_10.30.170.157_tunnel_1</var>
<status status="PASS" start="2026-05-01T01:00:42.285950" elapsed="0.002225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.288767" level="INFO">${value} = 10.30.170.185</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.288418" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.289756" level="INFO">${encoded} = 10.30.170.185</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.289364" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.289836" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:42.289991" level="INFO">${encoded_value} = 10.30.170.185</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.288973" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.290159" elapsed="0.000336"/>
</kw>
<var name="${key}">IP_ODL</var>
<var name="${value}">10.30.170.185</var>
<status status="PASS" start="2026-05-01T01:00:42.288292" elapsed="0.002249"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.291114" level="INFO">${value} = </msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.290784" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.292039" level="INFO">${encoded} = </msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.291679" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.292117" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:42.292271" level="INFO">${encoded_value} = </msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.291322" elapsed="0.000974"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.292443" elapsed="0.000300"/>
</kw>
<var name="${key}">ERRORS</var>
<var name="${value}"/>
<status status="PASS" start="2026-05-01T01:00:42.290658" elapsed="0.002128"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:42.280688" elapsed="0.012131"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:42.292863" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:42.293026" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:42.279502" elapsed="0.013551"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.279176" elapsed="0.013930"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.293281" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.293136" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.279153" elapsed="0.014207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.293999" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.293513" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.294078" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.275372" elapsed="0.018834"/>
</kw>
<msg time="2026-05-01T01:00:42.294261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.274423" elapsed="0.019890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.294886" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.295428" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.295954" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.296135" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.296303" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.296689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.296549" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.296534" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.296908" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.297071" elapsed="0.000067"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.297282" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.296501" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.296380" elapsed="0.000983"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.297515" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.297593" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:42.297715" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.269757" elapsed="0.027984"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.300776" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.300509" elapsed="0.000342">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.300947" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.300149" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.301321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.301047" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.301888" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.301590" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.301405" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.301027" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.304327" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.302119" elapsed="0.002236"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:42.304446" elapsed="0.000048"/>
</return>
<msg time="2026-05-01T01:00:42.304626" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:42.299815" elapsed="0.004837"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.305875" level="INFO" html="true">File '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;' exists.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.305681" elapsed="0.000250"/>
</kw>
<msg time="2026-05-01T01:00:42.306018" level="INFO">${read_volatiles_file} = True</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.305331" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.306253" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:42.306114" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.306096" elapsed="0.000227"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.306684" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/volatiles.list&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.306836" level="INFO">${volatiles} = odl-pcep-stateful-stats:last-received-rpt-msg-timestamp
session-duration
session-id
</msg>
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.306508" elapsed="0.000355"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-05-01T01:00:42.307251" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.307013" elapsed="0.000265"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-05-01T01:00:42.307336" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:42.307543" level="INFO">${volatiles_list} = ['odl-pcep-stateful-stats:last-received-rpt-msg-timestamp', 'session-duration', 'session-id', '']</msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:42.304956" elapsed="0.002615"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.308953" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.308705" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.309401" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.309159" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:42.316741" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:42.318001" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1861'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:30","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":1777597241,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":3,"sent-msg-count":1,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:42.318132" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:42.311632" elapsed="0.006528"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.309528" elapsed="0.008675"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.318402" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.318230" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.309510" elapsed="0.009041"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.322775" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]},"network-pcep-topology-stats:pcep-session-state":{"synchronized":true,"peer-pref":{"session-id":0,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.157"},"delegated-lsps-count":1,"local-pref":{"session-id":2,"keepalive":30,"deadtimer":120,"ip-address":"10.30.170.185"},"session-duration":"0:00:00:30","messages":{"last-received-rpt-msg-timestamp":1777597211,"reply-time":{"average-time":0,"min-time":0,"max-time":0},"unknown-msg-received":0,"sent-upd-msg-count":0,"sent-init-msg-count":0,"last-sent-msg-timestamp":1777597241,"error-messages":{"received-error-msg-count":0,"sent-error-msg-count":0},"received-msg-count":3,"sent-msg-count":1,"received-rpt-msg-count":2},"peer-capabilities":{"stateful":true,"instantiation":true,"active":true}}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.319576" elapsed="0.003290"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.319339" elapsed="0.003579"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.319321" elapsed="0.003636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.326798" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.323360" elapsed="0.003504"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.323040" elapsed="0.003873"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.323016" elapsed="0.003933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.327734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.327173" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.328191" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.327873" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.328957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.328539" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.328306" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.327847" elapsed="0.001228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.329750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.329354" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.330072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.329847" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.330612" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.330303" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.330153" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.329829" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.330837" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:42.331638" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.331335" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.331807" elapsed="0.002410"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:42.318908" elapsed="0.015373"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.334474" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:42.334352" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.334333" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.338288" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.334685" elapsed="0.003667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:42.338408" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:42.338590" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:42.307880" elapsed="0.030738"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.338684" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:42.338838" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:42.246298" elapsed="0.092567"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.355660" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.355208" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.356583" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.356228" elapsed="0.000435">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.356760" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.355887" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.357370" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.356946" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.357715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_on_state/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.357880" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.357572" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.358544" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-count": 1,
                        "local-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP_ODL",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "messages": {
                            "error-messages": {$ERRORS
                                "received-error-msg-count": 0,
                                "sent-error-msg-count": 0
                            },
                            "last-sent-msg-timestamp": 0,
                            "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
                            "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
                            "odl-pcep-stateful-stats:sent-init-msg-count": 0,
                            "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
                            "received-msg-count": 2,
                            "reply-time": {
                                "average-time": 0,
                                "max-time": 0,
                                "min-time": 0
                            },
                            "sent-msg-count": 0,
                            "unknown-msg-received": 0
                        },
                        "peer-capabilities": {
                            "odl-pcep-stateful-stats:active": true,
                            "odl-pcep-stateful-stats:instantiation": true,
                            "odl-pcep-stateful-stats:stateful": true
                        },
                        "peer-pref": {
                            "deadtimer": 120,
                            "ip-address": "$IP",
                            "keepalive": 30,
                            "session-id": "*"
                        },
                        "session-duration": "*",
                        "synchronized": true
                    },
                    "network-topology-pcep:path-computation-client": {
                        "ip-address": "$IP",
                        "reported-lsp": [
                            {
                                "name": "$NAME",
                                "path": [
                                    {
                                        "ero": {
                                            "ignore": false,
                                            "processing-rule": false,
                                            "subobject": [
                                                {
                                                    "ip-prefix": {
                                                        "ip-prefix": "1.1.1.1/32"
                                                    },
                                                    "loose": false
                                                }
                                            ]
                                        },
                                        "lsp-id": 1,
                                        "odl-pcep-ietf-stateful:lsp": {
                                            "administrative": true,
                                            "delegate": true,
                                            "ignore": false,
                                            "odl-pcep-ietf-initiated:create": false,
                                            "operational": "up",
                                            "pce-allocation": false,
                                            "plsp-id": 1,
                                            "processing-rule": false,
                                            "remove": false,
                                            "sync": true,
                                            "tlvs": {
                                                "lsp-identifiers": {
                                                    "ipv4": {
                                                        "ipv4-extended-tunnel-id": "$IP",
                                                        "ipv4-tunnel-endpoint-address": "1.1.1.1",
                                                        "ipv4-tunnel-sender-address": "$IP"
                                                    },
                                                    "lsp-id": 1,
                                                    "tunnel-id": 1
                                                },
                                                "symbolic-path-name": {
                                                    "path-name": "$CODE"
                                                }
                                            }
                                        }
                                    }
                                ]
                            }
                        ],
                        "state-sync": "synchronized",
                        "stateful-tlv": {
                            "odl-pcep-ietf-stateful:stateful": {
                                "lsp-update-capability": true,
                                "odl-pcep-ietf-initiated:initiation": true
                            }
                        }
                    },
                    "node-id": "pcc://$IP"
                }
            ],
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.358058" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:42.359052" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.358753" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.359597" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157', 'CODE': 'cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE=', 'NAME': 'pcc_10.30.170.157_tunnel_1', 'IP_ODL': '10.30.170.185', 'ERRORS': ''}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.359279" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.359138" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.358731" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.360877" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.359824" elapsed="0.001082"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.360959" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.354567" elapsed="0.006526"/>
</kw>
<msg time="2026-05-01T01:00:42.361178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.353700" elapsed="0.007581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.361835" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.362337" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_on_state/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.362849" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.363027" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.363191" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.363580" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.363426" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.363412" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.363794" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.363952" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.364109" elapsed="0.000054"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.363380" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.363271" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.364370" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.364465" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:42.364682" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "network-pcep-topology-stats:pcep-session-state": {
                        "delegated-lsps-c...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.350849" elapsed="0.013860"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.364879" elapsed="0.002371"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.369272" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.367995" elapsed="0.001313"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.370658" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
      ...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.369474" elapsed="0.001213"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.371177" level="INFO">{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-sent-msg-timestamp": 0,
       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
       "received-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "odl-pcep-stateful-stats:active": true,
       "odl-pcep-stateful-stats:instantiation": true,
       "odl-pcep-stateful-stats:stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp-id": 1,
          "odl-pcep-ietf-stateful:lsp": {
           "administrative": true,
           "delegate": true,
           "ignore": false,
           "odl-pcep-ietf-initiated:create": false,
           "operational": "up",
           "pce-allocation": false,
           "plsp-id": 1,
           "processing-rule": false,
           "remove": false,
           "sync": true,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          }
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-tlv": {
       "odl-pcep-ietf-stateful:stateful": {
        "lsp-update-capability": true,
        "odl-pcep-ietf-initiated:initiation": true
       }
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-pcep-topology-stats:pcep-session-state": {
      "delegated-lsps-count": 1,
      "local-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.185",
       "keepalive": 30,
       "session-id": "*"
      },
      "messages": {
       "error-messages": {
        "received-error-msg-count": 0,
        "sent-error-msg-count": 0
       },
       "last-received-rpt-msg-timestamp": 1777597211,
       "last-sent-msg-timestamp": 1777597241,
       "received-msg-count": 3,
       "received-rpt-msg-count": 2,
       "reply-time": {
        "average-time": 0,
        "max-time": 0,
        "min-time": 0
       },
       "sent-init-msg-count": 0,
       "sent-msg-count": 1,
       "sent-upd-msg-count": 0,
       "unknown-msg-received": 0
      },
      "peer-capabilities": {
       "active": true,
       "instantiation": true,
       "stateful": true
      },
      "peer-pref": {
       "deadtimer": 120,
       "ip-address": "10.30.170.157",
       "keepalive": 30,
       "session-id": "*"
      },
      "session-duration": "*",
      "synchronized": true
     },
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:42.371792" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
         "min-time": 0
        },
-       "sent-msg-count": 0,
+       "sent-init-msg-count": 0,
+       "sent-msg-count": 1,
+       "sent-upd-msg-count": 0,
        "unknown-msg-received": 0
       },
       "peer-capabilities": {
-       "odl-pcep-stateful-stats:active": true,
-       "odl-pcep-stateful-stats:instantiation": true,
-       "odl-pcep-stateful-stats:stateful": true
+       "active": true,
+       "instantiation": true,
+       "stateful": true
       },
       "peer-pref": {
        "deadtimer": 120,
@@ -63,18 +63,19 @@
             }
            ]
           },
-          "lsp-id": 1,
-          "odl-pcep-ietf-stateful:lsp": {
-           "administrative": true,
-           "delegate": true,
+          "lsp": {
            "ignore": false,
-           "odl-pcep-ietf-initiated:create": false,
-           "operational": "up",
-           "pce-allocation": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
            "plsp-id": 1,
            "processing-rule": false,
-           "remove": false,
-           "sync": true,
            "tlvs": {
             "lsp-identifiers": {
              "ipv4": {
@@ -89,17 +90,20 @@
              "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
             }
            }
-          }
+          },
+          "lsp-id": 1
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.370836" elapsed="0.001047">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.367588" elapsed="0.004473">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.367334" elapsed="0.004824">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.372341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.372198" elapsed="0.000200"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.367315" elapsed="0.005106">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.340010" elapsed="0.032603">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.339184" elapsed="0.033609">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.338949" elapsed="0.033952">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.338932" elapsed="0.034008">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.372993" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.241829" elapsed="0.131313">Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<msg time="2026-05-01T01:00:42.373361" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
         "max-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>TemplatedRequests.Get_As_Json_Templated</arg>
<arg>${DIR_WITH_TEMPLATES}${/}default_on_state</arg>
<arg>${mapping}</arg>
<arg>${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.434405" elapsed="30.939165">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.375116" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:42.374616" elapsed="0.000544"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.374239" elapsed="0.000973"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.373937" elapsed="0.001333"/>
</kw>
<doc>Compare pcep-topology/path-computation-client to filled one, which includes a tunnel from pcc-mock.</doc>
<status status="FAIL" start="2026-05-01T01:00:11.432108" elapsed="30.943202">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 30 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -16,24 +16,24 @@
         "received-error-msg-count": 0,
         "sent-error-msg-count": 0
        },
-       "last-sent-msg-timestamp": 0,
-       "odl-pcep-stateful-stats:last-received-rpt-msg-timestamp": "*",
-       "odl-pcep-stateful-stats:received-rpt-msg-count": 2,
-       "odl-pcep-stateful-stats:sent-init-msg-count": 0,
-       "odl-pcep-stateful-stats:sent-upd-msg-count": 0,
-       "received-msg-count": 2,
+       "last-received-rpt-msg-timestamp": 1777597211,
+       "last-sent-msg-timestamp": 1777597241,
+       "received-msg-count": 3,
+       "received-rpt-msg-count": 2,
        "reply-time": {
         "average-time": 0,
    [ Message content over the limit has been removed. ]
          }
         ]
        }
       ],
       "state-sync": "synchronized",
-      "stateful-tlv": {
-       "odl-pcep-ietf-stateful:stateful": {
-        "lsp-update-capability": true,
-        "odl-pcep-ietf-initiated:initiation": true
-       }
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
       }
      },
      "node-id": "pcc://10.30.170.157"</status>
</test>
<test id="s1-s21-t14" name="Update_Delegated" line="146">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.376943" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.376665" elapsed="0.000339">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.376435" elapsed="0.000633">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.376416" elapsed="0.000685">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.376241" elapsed="0.000945">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.378538" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:42.378212" elapsed="0.000370"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.377863" elapsed="0.000771"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.377563" elapsed="0.001127"/>
</kw>
<doc>Perform update-lsp on the mocked tunnel, check response is success.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.375693" elapsed="0.003035">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s21-t15" name="Topology_Updated" line="156">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.380316" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.380046" elapsed="0.000331">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.379838" elapsed="0.000602">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.379820" elapsed="0.000671">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.379648" elapsed="0.000930">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.381878" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:42.381564" elapsed="0.000356"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.381134" elapsed="0.000837"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:42.380840" elapsed="0.001187"/>
</kw>
<doc>Compare pcep-topology/path-computation-client to default_on_updated, which includes the updated tunnel.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T01:00:42.379038" elapsed="0.003026">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<test id="s1-s21-t16" name="Unset_Password" line="174">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast" type="SETUP">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T01:00:42.383146" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T01:00:42.382859" elapsed="0.000557"/>
</kw>
<kw name="Unset_Password_On_Pcep_Node">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.384229" level="INFO">&amp;{mapping} = { IP=10.30.170.157 }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.383836" elapsed="0.000420"/>
</kw>
<kw name="Put_As_Xml_Templated" owner="TemplatedRequests">
<kw name="Put_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.406761" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.406349" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.407579" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.407284" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.407753" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.406958" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.408327" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.407938" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.408671" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.408873" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.408524" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.409346" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=$IP
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.409052" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.410439" level="INFO">mapping: {'IP': '10.30.170.157'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.410181" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.410924" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.410655" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.411629" level="INFO">${value} = 10.30.170.157</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.411310" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-05-01T01:00:42.412674" level="INFO">${encoded} = 10.30.170.157</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.412151" elapsed="0.000550"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-05-01T01:00:42.412812" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T01:00:42.412981" level="INFO">${encoded_value} = 10.30.170.157</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-05-01T01:00:42.411836" elapsed="0.001170"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.413153" elapsed="0.000293"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.157</var>
<status status="PASS" start="2026-05-01T01:00:42.411182" elapsed="0.002332"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-05-01T01:00:42.411004" elapsed="0.002557"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:42.413611" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:42.413773" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:42.409855" elapsed="0.003943"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.409523" elapsed="0.004307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.414001" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.413858" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.409493" elapsed="0.004586"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.414816" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.414217" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.414894" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.405715" elapsed="0.009308"/>
</kw>
<msg time="2026-05-01T01:00:42.415079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.404692" elapsed="0.010437"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.415868" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.416374" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.416890" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.417070" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.417236" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.417682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.417542" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.417527" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.417937" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.418098" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.418257" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.417493" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.417349" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.418497" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.418576" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:42.418696" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.400251" elapsed="0.018470"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.433654" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.433207" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.434412" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/data.xml' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.434164" elapsed="0.000339">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.434598" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.433840" elapsed="0.000782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.435161" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/data.xml</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.434779" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.435490" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.435657" level="INFO">${template} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
&lt;/node&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.435337" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.436080" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;$IP&lt;/node-id&gt;
&lt;/node&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.435832" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:42.436516" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.436203" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.437028" level="INFO">${mapping_to_use} = {'IP': '10.30.170.157'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.436738" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.436602" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.436181" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.437891" level="INFO">${final_text} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
&lt;/node&gt;</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.437247" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.437973" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.432610" elapsed="0.005497"/>
</kw>
<msg time="2026-05-01T01:00:42.438225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.431789" elapsed="0.006487"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.438791" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.439291" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.439805" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.439984" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.440150" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.440742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.440596" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.440366" elapsed="0.000457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.440959" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.441117" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.441273" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.440336" elapsed="0.000989"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.440228" elapsed="0.001178"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.441595" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.441677" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:42.441796" level="INFO">${data} = &lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
&lt;/node&gt;</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.429054" elapsed="0.012770"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.443072" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.442819" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/pcep_topology_node_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.443264" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.442488" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.443615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.443361" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.444171" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.443879" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.443697" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.443343" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.446703" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.444398" elapsed="0.002333"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:42.446783" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:42.446939" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/pcep_topology_node_empty/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:42.442153" elapsed="0.004811"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.448330" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.448084" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.448772" level="INFO">&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
&lt;/node&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.448535" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.449200" level="INFO">{'Content-Type': 'application/xml'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.448960" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.449704" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.449441" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-05-01T01:00:42.450552" level="INFO">${accumulator} = {'Content-Type': 'application/xml'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-05-01T01:00:42.450336" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-05-01T01:00:42.450896" level="INFO">${items_to_add} = ['Accept', 'application/xml']</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-01T01:00:42.450723" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.451062" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.451685" level="INFO">{'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.451417" elapsed="0.000312"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-05-01T01:00:42.451771" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:42.451928" level="INFO">${headers} = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-05-01T01:00:42.449941" elapsed="0.002012"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:42.495201" level="INFO">PUT Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01wa4zqh2fkawd1hp4tf4uaepnl31.node0', 'Content-Length': '103', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;node xmlns="urn:TBD:params:xml:ns:yang:network-topology"&gt;
    &lt;node-id&gt;10.30.170.157&lt;/node-id&gt;
&lt;/node&gt; 
 </msg>
<msg time="2026-05-01T01:00:42.495273" level="INFO">PUT Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology/node=10.30.170.157 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:42.495395" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:42.454302" elapsed="0.041122"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.452022" elapsed="0.043481"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.495718" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.495535" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.452005" elapsed="0.043805"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.499362" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.496868" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.496611" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.496592" elapsed="0.002957"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.502156" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.499825" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.499607" elapsed="0.002630"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.499590" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.502846" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.502433" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.503171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.502944" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.503723" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.503407" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.503253" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.502926" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.504316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.503958" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.504652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.504412" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.505173" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.504882" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.504734" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.504394" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.505400" elapsed="0.000448"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:42.506308" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.506008" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.506499" elapsed="0.002360"/>
</kw>
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:42.496206" elapsed="0.012717"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-05-01T01:00:42.509101" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T01:00:42.508991" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.508972" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.509338" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.509410" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:42.511750" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:42.447286" elapsed="0.064492"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.511844" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:42.512004" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:42.389157" elapsed="0.122872"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.512361" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.512128" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.512110" elapsed="0.000362"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.512507" elapsed="0.000027"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}pcep_topology_node_empty</arg>
<arg>mapping=${mapping}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="PASS" start="2026-05-01T01:00:42.384527" elapsed="0.128107"/>
</kw>
<doc>Send restconf PUT to unset the config module.</doc>
<status status="PASS" start="2026-05-01T01:00:42.383573" elapsed="0.129175"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.513672" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:42.513258" elapsed="0.000461"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T01:00:42.512979" elapsed="0.000801"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T01:00:42.514319" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T01:00:42.514037" elapsed="0.000557"/>
</kw>
<doc>De-configure password for pcep dispatcher for client with Mininet IP address.</doc>
<status status="PASS" start="2026-05-01T01:00:42.382349" elapsed="0.132285"/>
</test>
<test id="s1-s21-t17" name="Topology_Unauthorized_5" line="182">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.516923" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.516693" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.516675" elapsed="0.000338"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:42.516492" elapsed="0.000587"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.557320" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.556929" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.558279" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.557985" elapsed="0.000376">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.558474" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.557562" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.559044" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.558660" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.559365" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.559564" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.559223" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.559982" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.559739" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.561050" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.560734" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.561541" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.561248" elapsed="0.000533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.562140" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.562340" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.562524" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.562011" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.561846" elapsed="0.000770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:42.562664" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:42.562836" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:42.560402" elapsed="0.002459"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.560107" elapsed="0.002785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.563059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.562919" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.560082" elapsed="0.003120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.563812" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.563342" elapsed="0.000498"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.563889" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.556304" elapsed="0.007710"/>
</kw>
<msg time="2026-05-01T01:00:42.564068" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.555385" elapsed="0.008731"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.564615" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.565109" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.565863" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.566058" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.566227" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.566607" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.566446" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.566432" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.566820" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.566979" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.567137" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.566403" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.566302" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.567352" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.567427" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:42.567563" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.550940" elapsed="0.016691"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.568942" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.568691" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.569098" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.568299" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.569495" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.569193" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.570085" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.569791" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.569604" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.569175" elapsed="0.000993"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.572518" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.570308" elapsed="0.002237"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:42.572596" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:42.572750" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:42.567980" elapsed="0.004794"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.574167" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.573786" elapsed="0.000446">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.574325" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.573382" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:42.574581" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:42.574421" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.574402" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.574806" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.574967" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.575031" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:42.576941" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:42.573069" elapsed="0.003899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.578428" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.578179" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.579013" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.578774" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:42.586296" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:42.586489" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:42.586633" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:42.581312" elapsed="0.005348"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.579121" elapsed="0.007582"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.586878" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.586730" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.579103" elapsed="0.007861"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.591073" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.588002" elapsed="0.003169"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.587767" elapsed="0.003470"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.587748" elapsed="0.003538"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.595923" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.591837" elapsed="0.004176"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.591393" elapsed="0.004683"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.591360" elapsed="0.004767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.597140" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.596490" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.597627" elapsed="0.000111"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.597281" elapsed="0.000517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.598492" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.598071" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.597835" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.597255" elapsed="0.001322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.599090" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.598728" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.599410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.599187" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.599949" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.599658" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.599506" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.599169" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.600175" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:42.600995" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.600692" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:42.601166" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:42.587327" elapsed="0.016316"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.603824" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:42.603715" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.603696" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.607641" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.604033" elapsed="0.003650"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:42.607826" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T01:00:42.608061" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:42.577271" elapsed="0.030827"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.608186" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:42.608403" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:42.528263" elapsed="0.080177"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.627614" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.627082" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.628522" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.628161" elapsed="0.000512">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:42.628891" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:42.627815" elapsed="0.001101"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.629556" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:42.629076" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:42.629948" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:42.630121" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:42.629772" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.630602" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:42.630297" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:42.631176" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.630732" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.632035" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:42.631408" elapsed="0.000655"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:42.631269" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:42.630706" elapsed="0.001420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.632821" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:42.632300" elapsed="0.000551"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:42.632905" elapsed="0.000038"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:42.626437" elapsed="0.006611"/>
</kw>
<msg time="2026-05-01T01:00:42.633162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.625441" elapsed="0.007776"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.633796" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.634301" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.634840" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.635023" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.635191" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.635608" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.635446" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:42.635426" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.635824" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.635986" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.636147" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:42.635387" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.635275" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.636368" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.636448" elapsed="0.000083"/>
</return>
<msg time="2026-05-01T01:00:42.636657" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:42.622586" elapsed="0.014100"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:42.636857" elapsed="0.004506"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.642870" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.642377" elapsed="0.000617"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:42.644586" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:42.643217" elapsed="0.001413"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:42.645362" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:42.645934" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.644850" elapsed="0.001239">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.641868" elapsed="0.004482">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.641502" elapsed="0.004970">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:42.646695" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:42.646542" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.641472" elapsed="0.005303">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.610119" elapsed="0.036808">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.608924" elapsed="0.038174">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:42.608585" elapsed="0.038617">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:42.608560" elapsed="0.038678">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:42.647293" elapsed="0.000021"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.522137" elapsed="0.125309">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:42.517959" elapsed="0.129683">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.695382" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.694886" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.696477" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.696138" elapsed="0.000613">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:43.696878" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:43.695706" elapsed="0.001198"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.697470" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:43.697066" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.697836" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:43.698032" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:43.697654" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.698769" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.698264" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.700269" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.699874" elapsed="0.000453"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.700911" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:43.700564" elapsed="0.000380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.701371" elapsed="0.000028"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.701648" elapsed="0.000027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.701821" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:43.701201" elapsed="0.000678"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.701015" elapsed="0.000895"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:43.701959" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:43.702135" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:43.699375" elapsed="0.002786"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.698936" elapsed="0.003257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.702360" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.702219" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.698902" elapsed="0.003533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.703077" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:43.702591" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:43.703155" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:43.694089" elapsed="0.009198"/>
</kw>
<msg time="2026-05-01T01:00:43.703416" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:43.692922" elapsed="0.010566"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.704057" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.704583" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.705074" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.705259" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.705428" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.705838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.705698" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:43.705681" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.706083" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.706300" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.706543" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:43.705647" elapsed="0.000972"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.705536" elapsed="0.001118"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.706847" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.706946" elapsed="0.000024"/>
</return>
<msg time="2026-05-01T01:00:43.707125" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:43.688498" elapsed="0.018662"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.709012" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.708705" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:43.709200" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:43.708032" elapsed="0.001202"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.709658" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.709323" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.710368" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.709993" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.709766" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.709299" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.713200" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:43.710693" elapsed="0.002536"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:43.713282" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:43.713446" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:43.707548" elapsed="0.005942"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.714690" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.714437" elapsed="0.000317">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:43.714846" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:43.714111" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:43.715078" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T01:00:43.714942" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.714923" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.715303" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.715481" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.715557" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T01:00:43.717593" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:43.713794" elapsed="0.003826"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.719029" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.718774" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.719478" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.719221" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:43.727061" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:43.727242" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:43.727417" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:43.721698" elapsed="0.005750"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.719596" elapsed="0.007920"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.727725" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.727543" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.719577" elapsed="0.008237"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.731514" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.728855" elapsed="0.002717"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.728623" elapsed="0.002985"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.728604" elapsed="0.003030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.735085" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.731997" elapsed="0.003155"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.731771" elapsed="0.003430"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.731748" elapsed="0.003489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.736048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:43.735476" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.736531" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.736187" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.737277" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.736863" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.736648" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.736161" elapsed="0.001235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.738137" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:43.737635" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.738604" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.738272" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.739339" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.738930" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.738718" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.738247" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:43.739709" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:43.740791" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:43.740417" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:43.740965" elapsed="0.002337"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:43.728174" elapsed="0.015193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.743562" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:43.743437" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.743418" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:43.747011" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:43.743799" elapsed="0.003242"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:43.747138" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:43.747302" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:43.717937" elapsed="0.029393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:43.747393" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:43.747564" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:43.663815" elapsed="0.083776"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.763940" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.763463" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.764792" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.764471" elapsed="0.000465">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:43.765133" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:43.764126" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.765818" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:43.765341" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:43.766164" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:43.766322" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:43.766002" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.766966" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:43.766515" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:43.767520" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.767083" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.768329" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:43.767769" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:43.767607" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:43.767063" elapsed="0.001353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.769073" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:43.768577" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:43.769154" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:43.762855" elapsed="0.006430"/>
</kw>
<msg time="2026-05-01T01:00:43.769383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:43.762059" elapsed="0.007377"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.769955" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.770481" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.770986" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.771165" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.771333" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.771772" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.771589" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:43.771574" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.771991" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.772154" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.772314" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:43.771542" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.771415" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.772552" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.772632" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:43.772764" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:43.759393" elapsed="0.013405"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:43.772970" elapsed="0.002666"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:43.776717" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:43.776386" elapsed="0.000401"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:43.777917" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:43.776942" elapsed="0.001004"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:43.778427" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:43.778739" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.778096" elapsed="0.000725">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.775977" elapsed="0.003023">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:43.775721" elapsed="0.003374">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:43.779309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:43.779160" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:43.775702" elapsed="0.003688">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.748816" elapsed="0.030745">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.747978" elapsed="0.031803">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:43.747720" elapsed="0.032174">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:43.747659" elapsed="0.032273">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:43.779985" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:43.655968" elapsed="0.124166">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:43.648295" elapsed="0.132033">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.827477" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.827064" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.828295" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.828012" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:44.828482" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:44.827683" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.829063" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:44.828667" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.829385" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:44.829629" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:44.829243" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.830056" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.829810" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.831155" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.830834" elapsed="0.000366"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.831649" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:44.831353" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.832003" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.832204" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.832370" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:44.831877" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.831731" elapsed="0.000744"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:44.832526" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:44.832698" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:44.830517" elapsed="0.002206"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.830182" elapsed="0.002573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.832919" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.832781" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.830157" elapsed="0.002837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.833613" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:44.833129" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:44.833690" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:44.826430" elapsed="0.007387"/>
</kw>
<msg time="2026-05-01T01:00:44.833937" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:44.825501" elapsed="0.008488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.834510" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.835012" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.835773" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.835959" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.836131" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.836522" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.836357" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:44.836342" elapsed="0.000285"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.836774" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.836939" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.837103" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:44.836312" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.836206" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.837326" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.837403" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:44.837669" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:44.820699" elapsed="0.016996"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.839057" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.838774" elapsed="0.000390">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:44.839273" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:44.838405" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.839665" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.839374" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.840268" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.839941" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.839754" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.839355" elapsed="0.000998"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.842893" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:44.840514" elapsed="0.002406"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:44.842974" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:44.843141" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:44.838020" elapsed="0.005146"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.844517" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.844239" elapsed="0.000350">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:44.844708" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:44.843829" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:44.844975" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T01:00:44.844834" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.844813" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.845205" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.845369" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.845481" elapsed="0.000022"/>
</return>
<msg time="2026-05-01T01:00:44.847430" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:44.843502" elapsed="0.003967"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.848947" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.848677" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.849396" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.849152" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:44.856791" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:44.856965" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:44.857128" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:44.851812" elapsed="0.005345"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.849543" elapsed="0.007657"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.857377" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.857228" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.849524" elapsed="0.008058"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.861095" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.858656" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.858416" elapsed="0.002767"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.858396" elapsed="0.002813"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.864359" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.861540" elapsed="0.002886"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.861265" elapsed="0.003243"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.861248" elapsed="0.003299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.865322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:44.864777" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.865820" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.865493" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.866587" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.866150" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.865936" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.865433" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.867418" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:44.866915" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.867885" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.867576" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.868630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.868202" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.867996" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.867550" elapsed="0.001194"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:44.868940" elapsed="0.000475"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:44.870146" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:44.869728" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:44.870385" elapsed="0.002383"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:44.857952" elapsed="0.014880"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.873010" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:44.872902" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.872884" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:44.876472" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:44.873219" elapsed="0.003285"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:44.876594" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:44.876763" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:44.847801" elapsed="0.028988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:44.876855" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:44.877011" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:44.797562" elapsed="0.079475"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.893820" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.893250" elapsed="0.000600"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.894688" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.894339" elapsed="0.000499">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:44.895031" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:44.894011" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.895680" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:44.895213" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:44.896022" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:44.896188" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:44.895859" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.896653" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:44.896360" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:44.897182" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.896767" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.897993" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:44.897406" elapsed="0.000613"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:44.897268" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:44.896748" elapsed="0.001329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.898706" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:44.898216" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:44.898784" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:44.892654" elapsed="0.006260"/>
</kw>
<msg time="2026-05-01T01:00:44.899019" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:44.891844" elapsed="0.007226"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.899584" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.900091" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.900608" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.900786" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.900950" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.901322" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.901187" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:44.901172" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.901569" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.901730" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.901889" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:44.901142" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.901031" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.902109" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.902187" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:44.902304" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:44.889123" elapsed="0.013208"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:44.902556" elapsed="0.002432"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:44.906062" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:44.905765" elapsed="0.000356"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:44.907205" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:44.906271" elapsed="0.000963"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:44.907726" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:44.908009" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.907385" elapsed="0.000703">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.905309" elapsed="0.002951">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:44.905071" elapsed="0.003283">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:44.908583" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:44.908415" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:44.905052" elapsed="0.003613">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.878278" elapsed="0.030537">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.877359" elapsed="0.031628">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:44.877123" elapsed="0.031967">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:44.877106" elapsed="0.032021">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:44.909178" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:44.791140" elapsed="0.118186">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:44.781007" elapsed="0.128516">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.957675" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:45.957265" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:45.958471" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:45.958198" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:45.958644" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:45.957874" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.959221" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:45.958824" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:45.959557" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:45.959722" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:45.959400" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.960140" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.959895" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.961188" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.960882" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.961676" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:45.961383" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.962027" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.962224" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.962388" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:45.961901" elapsed="0.000544"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:45.961757" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:45.962542" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:45.962711" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:45.960569" elapsed="0.002167"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.960262" elapsed="0.002506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.962936" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.962793" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.960239" elapsed="0.002775"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.963640" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:45.963179" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:45.963716" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:45.956666" elapsed="0.007175"/>
</kw>
<msg time="2026-05-01T01:00:45.963949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:45.955784" elapsed="0.008216"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.964503" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.965003" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.965509" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.965686" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.965852" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.966208" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.966072" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:45.966057" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.966421" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.966604" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.966763" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:45.966027" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:45.965926" elapsed="0.000916"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.966979" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:45.967056" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T01:00:45.967206" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:45.951472" elapsed="0.015761"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:45.968794" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:45.968492" elapsed="0.000393">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:45.968985" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:45.968134" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.969355" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.969082" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.969917" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:45.969627" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.969439" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.969064" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.972371" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:45.970143" elapsed="0.002265"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:45.972481" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:45.972668" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:45.967591" elapsed="0.005113"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:45.973928" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:45.973693" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:45.974085" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:45.973343" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:45.974314" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:45.974179" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.974161" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.974556" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.974719" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:45.974785" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:45.976693" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:45.973027" elapsed="0.003692"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.978081" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.977836" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.978525" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.978270" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:45.985632" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:45.985813" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:45.985952" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:45.980881" elapsed="0.005097"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.978634" elapsed="0.007388"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.986194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.986048" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.978616" elapsed="0.007663"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.992807" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.987394" elapsed="0.005492"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.987083" elapsed="0.005854"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.987063" elapsed="0.005911"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.996664" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:45.993359" elapsed="0.003371"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.993053" elapsed="0.003727"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.993029" elapsed="0.003786"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.997626" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:45.997053" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:45.998082" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.997764" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.998856" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:45.998411" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:45.998197" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.997739" elapsed="0.001238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:45.999760" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:45.999250" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.000083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:45.999858" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.000624" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:46.000314" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:46.000163" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:45.999840" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:46.000853" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:46.001674" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:46.001355" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:46.001846" elapsed="0.002360"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:45.986660" elapsed="0.017616"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:46.004473" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:46.004347" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:46.004328" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:46.007978" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:46.004689" elapsed="0.003319"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:46.008156" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:46.008328" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:45.977025" elapsed="0.031330"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:46.008420" elapsed="0.000026"/>
</return>
<msg time="2026-05-01T01:00:46.008592" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:45.928600" elapsed="0.080019"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.024859" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:46.024389" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:46.025696" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:46.025369" elapsed="0.000464">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:46.026023" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:46.025044" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.026673" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:46.026206" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:46.027018" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:46.027204" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:46.026855" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.027849" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:46.027386" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:46.028380" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:46.027966" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.029159" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:46.028624" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:46.028483" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:46.027947" elapsed="0.001297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.029880" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:46.029383" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:46.029960" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:46.023794" elapsed="0.006296"/>
</kw>
<msg time="2026-05-01T01:00:46.030183" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:46.022972" elapsed="0.007262"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.030756" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.031288" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.031809" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.031989" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.032156" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.032541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:46.032390" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:46.032376" elapsed="0.000245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.032755" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.032913" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.033071" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:46.032345" elapsed="0.000779"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:46.032236" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.033289" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:46.033365" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:46.033497" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:46.020322" elapsed="0.013203"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:46.033693" elapsed="0.002262"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:46.036975" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:46.036687" elapsed="0.000347"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:46.038061" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:46.037182" elapsed="0.000908"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:46.038633" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:46.038919" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:46.038239" elapsed="0.000758">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:46.036266" elapsed="0.002931">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:46.036036" elapsed="0.003259">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:46.039517" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:46.039357" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:46.036018" elapsed="0.003581">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:46.009778" elapsed="0.029971">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:46.008946" elapsed="0.030975">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:46.008702" elapsed="0.031322">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:46.008686" elapsed="0.031374">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:46.040111" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:45.919920" elapsed="0.120336">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:45.910204" elapsed="0.130231">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.087756" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.087271" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.088642" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.088333" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:47.088822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:47.087995" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.089393" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:47.089006" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.089739" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:47.089909" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:47.089594" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.090341" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.090089" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.091425" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.091106" elapsed="0.000389"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.091925" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:47.091654" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.092285" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.092504" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.092702" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:47.092156" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.092007" elapsed="0.000789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:47.092844" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:47.093028" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:47.090788" elapsed="0.002268"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.090483" elapsed="0.002606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.093257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.093115" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.090444" elapsed="0.002890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.093996" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:47.093514" elapsed="0.000511"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:47.094075" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:47.086618" elapsed="0.007598"/>
</kw>
<msg time="2026-05-01T01:00:47.094327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:47.085713" elapsed="0.008666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.094907" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.095516" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.096327" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.096532" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.096732" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.097087" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.096952" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:47.096938" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.097299" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.097474" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.097634" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:47.096909" elapsed="0.000779"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.096807" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.097852" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.097927" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:47.098045" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:47.080946" elapsed="0.017125"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.099536" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.099267" elapsed="0.000345">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:47.099720" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:47.098880" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.100105" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.099830" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.100789" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.100397" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.100200" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.099809" elapsed="0.001076"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.103420" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:47.101030" elapsed="0.002418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:47.103516" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:47.103677" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:47.098443" elapsed="0.005260"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.104997" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.104753" elapsed="0.000309">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:47.105158" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:47.104364" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:47.105393" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-05-01T01:00:47.105256" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.105237" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.105640" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.105804" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.105871" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:47.107799" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:47.104026" elapsed="0.003799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.109244" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.108995" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.109688" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.109433" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:47.117437" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:47.117661" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:47.117820" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:47.112180" elapsed="0.005667"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.109798" elapsed="0.008098"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.118097" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.117927" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.109780" elapsed="0.008405"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.121926" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.119283" elapsed="0.002731"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.119068" elapsed="0.002999"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.119048" elapsed="0.003055"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.126468" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.122503" elapsed="0.004035"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.122182" elapsed="0.004404"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.122158" elapsed="0.004465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.127439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:47.126853" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.127944" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.127604" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.128819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.128269" elapsed="0.000590"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.128058" elapsed="0.000854"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.127576" elapsed="0.001367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.129715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:47.129160" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.130041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.129814" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.130585" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.130271" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.130122" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.129796" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:47.130811" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:47.131649" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:47.131316" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:47.131822" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:47.118616" elapsed="0.015628"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.134421" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:47.134315" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.134296" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:47.137863" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:47.134649" elapsed="0.003243"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:47.137977" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:47.138141" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:47.108138" elapsed="0.030029"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:47.138230" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:47.138382" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:47.056430" elapsed="0.081978"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.155150" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.154709" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.155949" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.155674" elapsed="0.000401">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:47.156263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:47.155331" elapsed="0.000957"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.156937" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:47.156444" elapsed="0.000521"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:47.157278" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:47.157422" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:47.157118" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.157880" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:47.157612" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:47.158398" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.157993" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.159175" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:47.158640" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:47.158500" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:47.157974" elapsed="0.001286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.159890" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:47.159396" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:47.159969" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:47.154096" elapsed="0.005999"/>
</kw>
<msg time="2026-05-01T01:00:47.160189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:47.153315" elapsed="0.006924"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.160788" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.161301" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.161818" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.161995" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.162160" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.162538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.162388" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:47.162373" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.162754" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.162913" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.163070" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:47.162343" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.162237" elapsed="0.000912"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.163286" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.163362" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:47.163493" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:47.150666" elapsed="0.012855"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:47.163691" elapsed="0.002488"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:47.167337" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:47.167034" elapsed="0.000370"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:47.168440" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:47.167574" elapsed="0.000914"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:47.169012" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:47.169298" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.168639" elapsed="0.000741">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.166608" elapsed="0.002961">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:47.166269" elapsed="0.003402">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:47.169879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:47.169733" elapsed="0.000204"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:47.166249" elapsed="0.003712">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.139694" elapsed="0.030419">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.138882" elapsed="0.031406">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:47.138509" elapsed="0.031884">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:47.138492" elapsed="0.031938">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:47.170499" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:47.050257" elapsed="0.120393">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:47.041083" elapsed="0.129749">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.216969" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.216441" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.217955" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.217666" elapsed="0.000374">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:48.218138" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:48.217233" elapsed="0.000929"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.218755" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:48.218327" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.219104" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:48.219339" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:48.218943" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.219792" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.219535" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.220909" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.220597" elapsed="0.000358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.221414" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:48.221110" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.221807" elapsed="0.000029"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.222059" elapsed="0.000027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.222233" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:48.221668" elapsed="0.000624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.221521" elapsed="0.000809"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:48.222396" elapsed="0.000045"/>
</return>
<msg time="2026-05-01T01:00:48.222604" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:48.220248" elapsed="0.002382"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.219918" elapsed="0.002745"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.222979" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.222689" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.219895" elapsed="0.003160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.223699" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:48.223198" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:48.223778" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:48.215838" elapsed="0.008071"/>
</kw>
<msg time="2026-05-01T01:00:48.224020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:48.214956" elapsed="0.009114"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.224593" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.225120" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.225645" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.225825" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.226026" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.226409" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.226258" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:48.226243" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.226648" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.226806" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.226964" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:48.226207" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.226105" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.227178" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.227255" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:48.227375" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:48.210600" elapsed="0.016801"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.228879" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.228638" elapsed="0.000305">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:48.229036" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:48.228272" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.229374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.229133" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.229942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.229647" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.229473" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.229114" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.232440" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:48.230226" elapsed="0.002254"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:48.232533" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:48.232692" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:48.227744" elapsed="0.004974"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.233988" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.233707" elapsed="0.000362">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:48.234188" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:48.233356" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:48.234511" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-05-01T01:00:48.234314" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.234290" elapsed="0.000337"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.234804" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.235005" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.235084" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:48.237259" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:48.233018" elapsed="0.004269"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.238815" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.238544" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.239253" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.239008" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:48.246445" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:48.246639" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:48.246832" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:48.241520" elapsed="0.005350"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.239364" elapsed="0.007568"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.247192" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.246969" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.239346" elapsed="0.007970"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.252670" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.248798" elapsed="0.003952"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.248482" elapsed="0.004319"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.248433" elapsed="0.004404"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.256606" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.253229" elapsed="0.003444"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.252918" elapsed="0.003807"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.252893" elapsed="0.003884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.257590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:48.257014" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.258125" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.257734" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.258885" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.258514" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.258248" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.257708" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.259549" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:48.259155" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.259876" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.259648" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.260447" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.260143" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.259959" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.259630" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:48.260697" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:48.261575" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:48.261238" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:48.261752" elapsed="0.002377"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:48.247829" elapsed="0.016365"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.264374" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:48.264266" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.264247" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:48.267990" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:48.264619" elapsed="0.003402"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:48.268114" elapsed="0.000033"/>
</return>
<msg time="2026-05-01T01:00:48.268280" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:48.237652" elapsed="0.030655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:48.268370" elapsed="0.000028"/>
</return>
<msg time="2026-05-01T01:00:48.268543" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:48.187974" elapsed="0.080596"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.285349" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.284896" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.286231" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.285906" elapsed="0.000459">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:48.286576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:48.285554" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.287244" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:48.286785" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:48.287607" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:48.287750" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:48.287427" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.288197" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:48.287924" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:48.288755" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.288313" elapsed="0.000520"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.289570" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:48.289002" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:48.288859" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:48.288294" elapsed="0.001361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.290378" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:48.289795" elapsed="0.000614"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:48.290483" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:48.284250" elapsed="0.006367"/>
</kw>
<msg time="2026-05-01T01:00:48.290703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:48.283469" elapsed="0.007286"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.291267" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.291790" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.292303" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.292500" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.292669" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.293026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.292892" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:48.292878" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.293249" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.293468" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.293637" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:48.292848" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.292744" elapsed="0.000974"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.293880" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.293969" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:48.294106" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:48.280570" elapsed="0.013563"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:48.294309" elapsed="0.002456"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:48.297814" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:48.297508" elapsed="0.000367"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:48.299031" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:48.298027" elapsed="0.001034"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:48.299554" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:48.299850" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.299213" elapsed="0.000723">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.297086" elapsed="0.003026">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:48.296850" elapsed="0.003355">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:48.300419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:48.300274" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:48.296830" elapsed="0.003688">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.269731" elapsed="0.030938">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.268891" elapsed="0.031950">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:48.268655" elapsed="0.032309">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:48.268637" elapsed="0.032368">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:48.301057" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:48.180720" elapsed="0.120485">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:48.171448" elapsed="0.129946">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.351647" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.351186" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.352440" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.352179" elapsed="0.000352">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:49.352629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:49.351847" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.353207" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:49.352813" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.353553" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:49.353724" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:49.353391" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.354155" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.353903" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.355308" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.354953" elapsed="0.000402"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.355812" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:49.355536" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.356169" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.356374" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.356558" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:49.356040" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.355893" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:49.356698" elapsed="0.000036"/>
</return>
<msg time="2026-05-01T01:00:49.356870" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:49.354626" elapsed="0.002270"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.354283" elapsed="0.002645"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.357097" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.356953" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.354258" elapsed="0.002917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.357793" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:49.357313" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:49.357871" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:49.350554" elapsed="0.007447"/>
</kw>
<msg time="2026-05-01T01:00:49.358123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:49.349616" elapsed="0.008570"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.358707" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.359212" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.359756" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.359936" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.360102" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.360486" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.360328" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:49.360312" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.360704" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.360863" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.361020" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:49.360282" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.360177" elapsed="0.000922"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.361236" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.361313" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:49.361438" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:49.345136" elapsed="0.016344"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.363038" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.362536" elapsed="0.000577">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:49.363209" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:49.362178" elapsed="0.001091"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.363615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.363349" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.364175" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.363876" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.363703" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.363325" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.366651" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:49.364401" elapsed="0.002277"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:49.366736" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:49.366896" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:49.361806" elapsed="0.005116"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.368158" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.367921" elapsed="0.000313">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:49.368338" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:49.367589" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:49.368594" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-05-01T01:00:49.368437" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.368418" elapsed="0.000266"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.368824" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.368989" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.369069" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:49.371000" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:49.367245" elapsed="0.003782"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.372488" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.372222" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.372920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.372678" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:49.380239" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:49.380416" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:49.380622" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:49.375085" elapsed="0.005566"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.373028" elapsed="0.007691"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.381003" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.380763" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.373010" elapsed="0.008127"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.386740" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.382773" elapsed="0.004050"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.382410" elapsed="0.004467"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.382380" elapsed="0.004536"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.390894" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.387365" elapsed="0.003599"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.387003" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.386977" elapsed="0.004081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.391882" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:49.391373" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.392208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.391981" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.392758" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.392443" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.392290" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.391963" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.393350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:49.392992" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.393684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.393445" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.394215" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.393913" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.393764" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.393427" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:49.394440" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:49.395251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:49.394954" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:49.395466" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:49.381712" elapsed="0.016180"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.398069" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:49.397962" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.397944" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:49.401598" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:49.398276" elapsed="0.003357"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:49.401740" elapsed="0.000038"/>
</return>
<msg time="2026-05-01T01:00:49.401914" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:49.371396" elapsed="0.030544"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:49.402004" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:49.402155" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:49.318402" elapsed="0.083778"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.418820" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.418331" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.419723" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.419377" elapsed="0.000488">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:49.420060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:49.419008" elapsed="0.001077"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.420721" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:49.420244" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:49.421077" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:49.421430" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:49.420909" elapsed="0.000566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.421906" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:49.421628" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:49.422466" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.422028" elapsed="0.000503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.423252" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:49.422701" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:49.422557" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:49.422006" elapsed="0.001365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.424026" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:49.423528" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:49.424106" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:49.417710" elapsed="0.006533"/>
</kw>
<msg time="2026-05-01T01:00:49.424345" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:49.416865" elapsed="0.007531"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.424917" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.425444" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.425965" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.426145" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.426314" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.426712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.426569" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:49.426554" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.426933" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.427095" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.427254" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:49.426522" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.426395" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.427519" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.427608" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:49.427732" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:49.414119" elapsed="0.013641"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:49.427931" elapsed="0.002337"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:49.431388" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:49.431036" elapsed="0.000455"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:49.432627" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:49.431653" elapsed="0.001004"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:49.433279" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:49.433638" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.432844" elapsed="0.000888">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.430609" elapsed="0.003300">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:49.430351" elapsed="0.003654">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:49.434236" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:49.434080" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:49.430331" elapsed="0.003992">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.403539" elapsed="0.030972">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.402528" elapsed="0.032164">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:49.402264" elapsed="0.032535">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:49.402247" elapsed="0.032591">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:49.434892" elapsed="0.000018"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:49.312058" elapsed="0.122986">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:49.302039" elapsed="0.133211">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.485234" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.484838" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.486091" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.485788" elapsed="0.000382">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:50.486266" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:50.485432" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.486873" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:50.486471" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.487207" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:50.487378" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:50.487064" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.487824" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.487573" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.488934" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.488626" elapsed="0.000354"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.489403" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:50.489133" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.489790" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.489992" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.490159" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:50.489657" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.489512" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:50.490294" elapsed="0.000034"/>
</return>
<msg time="2026-05-01T01:00:50.490481" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:50.488242" elapsed="0.002266"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.487948" elapsed="0.002594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.490709" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.490567" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.487926" elapsed="0.002862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.491368" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:50.490924" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:50.491444" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:50.484077" elapsed="0.007511"/>
</kw>
<msg time="2026-05-01T01:00:50.491709" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:50.483190" elapsed="0.008571"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.492254" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.492788" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.493495" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.493678" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.493845" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.494200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.494064" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:50.494050" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.494412" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.494595" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.494754" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:50.494020" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.493919" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.494973" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.495050" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:50.495185" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:50.478923" elapsed="0.016289"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.496544" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.496245" elapsed="0.000365">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:50.496703" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:50.495912" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.497042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.496798" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.497608" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.497299" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.497124" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.496780" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.500050" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:50.497839" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:50.500130" elapsed="0.000030"/>
</return>
<msg time="2026-05-01T01:00:50.500287" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:50.495550" elapsed="0.004762"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.501540" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.501291" elapsed="0.000314">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:50.501698" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:50.500965" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:50.501929" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:50.501794" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.501775" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.502153" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.502314" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.502379" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:50.504308" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:50.500645" elapsed="0.003689"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.505783" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.505535" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.506210" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.505971" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:50.513390" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:50.513578" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:50.513729" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:50.508559" elapsed="0.005212"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.506318" elapsed="0.007514"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.514074" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.513870" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.506300" elapsed="0.007895"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.519033" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.515632" elapsed="0.003476"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.515313" elapsed="0.003865"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.515287" elapsed="0.003927"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.522917" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.519619" elapsed="0.003362"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.519291" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.519268" elapsed="0.003797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.523845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:50.523281" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.524294" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.523980" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.524993" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.524683" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.524408" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.523955" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.525604" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:50.525226" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.525924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.525701" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.526444" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.526152" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.526003" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.525683" elapsed="0.000860"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:50.526684" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:50.527496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:50.527182" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:50.527670" elapsed="0.002368"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:50.514717" elapsed="0.015385"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.530290" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:50.530172" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.530154" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:50.533771" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:50.530523" elapsed="0.003280"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:50.533905" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:50.534079" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:50.504715" elapsed="0.029392"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:50.534172" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:50.534344" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:50.454164" elapsed="0.080207"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.550964" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.550515" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.551793" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.551490" elapsed="0.000437">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:50.552119" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:50.551146" elapsed="0.000998"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.552783" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:50.552300" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:50.553133" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:50.553282" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:50.552971" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.553741" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:50.553470" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:50.554291" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.553856" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.555066" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:50.554529" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:50.554376" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:50.553836" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.555766" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:50.555285" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:50.555850" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:50.549908" elapsed="0.006070"/>
</kw>
<msg time="2026-05-01T01:00:50.556069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:50.549114" elapsed="0.007005"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.556680" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.557191" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.557698" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.557879" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.558042" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.558404" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.558271" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:50.558257" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.558633" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.558794" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.558949" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:50.558227" elapsed="0.000775"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.558120" elapsed="0.000909"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.559165" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.559240" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:50.559357" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:50.546316" elapsed="0.013072"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:50.559571" elapsed="0.002399"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:50.562994" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:50.562703" elapsed="0.000350"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:50.564087" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:50.563201" elapsed="0.000915"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:50.564800" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:50.565092" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.564263" elapsed="0.000907">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.562284" elapsed="0.003059">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:50.562053" elapsed="0.003383">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:50.565658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:50.565512" elapsed="0.000204"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:50.562034" elapsed="0.003705">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.535569" elapsed="0.030319">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.534749" elapsed="0.031309">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:50.534485" elapsed="0.031675">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:50.534440" elapsed="0.031756">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:50.566248" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:50.446883" elapsed="0.119511">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:50.435927" elapsed="0.130672">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.612343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.611950" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.613151" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.612884" elapsed="0.000343">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:51.613321" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:51.612558" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.613927" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:51.613539" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.614247" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:51.614409" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:51.614107" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.614852" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.614607" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.615921" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.615617" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.616389" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:51.616122" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.616765" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.616966" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.617133" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:51.616637" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.616493" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:51.617276" elapsed="0.000035"/>
</return>
<msg time="2026-05-01T01:00:51.617449" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:51.615278" elapsed="0.002223"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.614976" elapsed="0.002558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.617701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.617560" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.614953" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.618365" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:51.617918" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:51.618442" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:51.611329" elapsed="0.007256"/>
</kw>
<msg time="2026-05-01T01:00:51.618696" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:51.610396" elapsed="0.008350"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.619231" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.619754" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.620253" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.620431" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.620613" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.620967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.620832" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:51.620818" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.621177" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.621333" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.621538" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:51.620790" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.620686" elapsed="0.000933"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.621756" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.621831" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:51.621947" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:51.606050" elapsed="0.015923"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.623399" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.623164" elapsed="0.000312">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:51.623570" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:51.622831" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.623904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.623666" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.624445" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.624156" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.623985" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.623648" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.626878" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:51.624686" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:51.626957" elapsed="0.000029"/>
</return>
<msg time="2026-05-01T01:00:51.627112" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:51.622298" elapsed="0.004840"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.628319" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.628089" elapsed="0.000292">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:51.628489" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:51.627765" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:51.628721" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:51.628587" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.628569" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.628944" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.629106" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.629172" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:51.631128" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:51.627434" elapsed="0.003722"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.632569" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.632305" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.633005" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.632757" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:51.640032" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:51.640251" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:51.640435" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:51.635180" elapsed="0.005321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.633115" elapsed="0.007447"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.640805" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.640599" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.633097" elapsed="0.007828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.645969" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.642351" elapsed="0.003694"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.642042" elapsed="0.004053"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.642016" elapsed="0.004114"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.649752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.646530" elapsed="0.003273"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.646209" elapsed="0.003629"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.646186" elapsed="0.003678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.650402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:51.650019" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.650743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.650516" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.651269" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.650975" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.650824" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.650498" elapsed="0.000855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.651873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:51.651516" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.652188" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.651968" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.652721" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.652416" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.652268" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.651950" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:51.652976" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:51.653813" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:51.653517" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:51.653984" elapsed="0.002435"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:51.641410" elapsed="0.015094"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.656679" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:51.656575" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.656556" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:51.660144" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:51.656884" elapsed="0.003290"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:51.660259" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:51.660419" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:51.631492" elapsed="0.028953"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:51.660530" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:51.660682" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:51.583398" elapsed="0.077310"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.678145" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.677692" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.678961" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.678672" elapsed="0.000417">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:51.679282" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:51.678327" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.679924" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:51.679478" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:51.680270" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:51.680416" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:51.680103" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.680877" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:51.680605" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:51.681402" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.680991" elapsed="0.000486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.682204" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:51.681668" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:51.681504" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:51.680971" elapsed="0.001317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.682908" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:51.682423" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:51.682986" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:51.677022" elapsed="0.006090"/>
</kw>
<msg time="2026-05-01T01:00:51.683199" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:51.676225" elapsed="0.007023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.683756" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.684256" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.684763" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.684940" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.685105" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.685479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.685330" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:51.685315" elapsed="0.000256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.685703" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.685861" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.686017" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:51.685286" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.685181" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.686232" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.686307" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:51.686423" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:51.672256" elapsed="0.014193"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:51.686630" elapsed="0.002362"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:51.690054" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:51.689757" elapsed="0.000356"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:51.691135" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:51.690262" elapsed="0.000901"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:51.691709" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:51.691990" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.691310" elapsed="0.000759">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.689305" elapsed="0.002938">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:51.689073" elapsed="0.003264">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:51.692566" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:51.692406" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:51.689054" elapsed="0.003593">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.661841" elapsed="0.030955">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.661020" elapsed="0.031947">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:51.660791" elapsed="0.032280">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:51.660774" elapsed="0.032333">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:51.693157" elapsed="0.000016"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:51.576622" elapsed="0.116676">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:51.567277" elapsed="0.126225">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.742774" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.742150" elapsed="0.000668"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.743687" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.743398" elapsed="0.000366">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.743862" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.743041" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.744487" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.744047" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.744889" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:52.745069" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:52.744700" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.745549" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.745250" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.746881" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.746533" elapsed="0.000404"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.747370" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:52.747095" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.747782" elapsed="0.000027"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.748012" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.748183" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.747649" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.747493" elapsed="0.000782"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:52.748326" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:52.748532" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:52.746155" elapsed="0.002405"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.745685" elapsed="0.002908"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.748764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.748619" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.745658" elapsed="0.003187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.749464" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.748985" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.749548" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:52.741263" elapsed="0.008415"/>
</kw>
<msg time="2026-05-01T01:00:52.749789" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.739860" elapsed="0.009982"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.750342" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.750909" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.751408" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.751605" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.751772" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.752128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.751992" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:52.751978" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.752339" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.752525" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.752686" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.751948" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.751845" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.752901" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.752978" elapsed="0.000018"/>
</return>
<msg time="2026-05-01T01:00:52.753104" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:52.733992" elapsed="0.019138"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.754659" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.754365" elapsed="0.000364">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.754827" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.754020" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.755169" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.754926" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.755744" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.755428" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.755254" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.754907" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.758277" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.755976" elapsed="0.002329"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:52.758360" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:52.758573" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:52.753471" elapsed="0.005131"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.759862" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.759606" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.760025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.759249" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:52.760266" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:52.760125" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.760105" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.760514" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.760683" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.760751" elapsed="0.000017"/>
</return>
<msg time="2026-05-01T01:00:52.762771" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:52.758930" elapsed="0.003869"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.764226" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.763962" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.764676" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.764416" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:52.771857" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:52.772028" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:52.772210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:52.767071" elapsed="0.005167"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.764787" elapsed="0.007496"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.772481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.772311" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.764769" elapsed="0.007802"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.776951" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.773604" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.773373" elapsed="0.003707"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.773354" elapsed="0.003763"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.780779" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.777520" elapsed="0.003325"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.777195" elapsed="0.003700"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.777172" elapsed="0.003760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.781768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.781174" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.782227" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.781906" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.783222" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.782693" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.782364" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.781880" elapsed="0.001475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.784206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.783643" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.784717" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.784353" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.785527" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.785063" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.784838" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.784326" elapsed="0.001327"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.785874" elapsed="0.000520"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:52.787582" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.786886" elapsed="0.000746"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:52.787888" elapsed="0.003587"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:52.772942" elapsed="0.018640"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.791882" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:52.791704" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.791670" elapsed="0.000315"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.796782" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.792187" elapsed="0.004638"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:52.796989" elapsed="0.000050"/>
</return>
<msg time="2026-05-01T01:00:52.797234" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:52.763120" elapsed="0.034153"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.797365" elapsed="0.000039"/>
</return>
<msg time="2026-05-01T01:00:52.797613" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:52.710409" elapsed="0.087242"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.814498" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.814028" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.815345" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.815035" elapsed="0.000462">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.815691" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.814706" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.816330" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.815879" elapsed="0.000478"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.816882" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:52.817049" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:52.816531" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.817518" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.817227" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:52.818055" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.817634" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.818879" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.818282" elapsed="0.000624"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.818142" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.817615" elapsed="0.001350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.819609" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.819105" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.819689" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:52.813416" elapsed="0.006401"/>
</kw>
<msg time="2026-05-01T01:00:52.819907" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.812589" elapsed="0.007369"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.820470" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.820977" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.821486" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.821665" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.821835" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.822209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.822072" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:52.822056" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.822420" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.822613" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.822779" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.822025" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.821915" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.822998" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.823074" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:52.823190" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:52.809937" elapsed="0.013280"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.823382" elapsed="0.002265"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.826694" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.826359" elapsed="0.000401"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.827857" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.826911" elapsed="0.000975"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.828365" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:52.828675" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.828036" elapsed="0.000721">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.825960" elapsed="0.002974">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:52.825727" elapsed="0.003301">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.829241" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.829092" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:52.825708" elapsed="0.003619">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.799235" elapsed="0.030261">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.798144" elapsed="0.031527">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:52.797771" elapsed="0.032002">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:52.797747" elapsed="0.032064">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.829862" elapsed="0.000017"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.701926" elapsed="0.128085">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:52.694139" elapsed="0.136060">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<msg time="2026-05-01T01:00:52.830345" level="FAIL">Keyword 'Test_Unauthorized' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-05-01T01:00:42.517329" elapsed="10.313157">Keyword 'Test_Unauthorized' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.832100" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:52.831584" elapsed="0.000559"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.831208" elapsed="0.000994"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.830895" elapsed="0.001364"/>
</kw>
<doc>Wait for pcep-topology to become empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T01:00:42.515804" elapsed="10.316497">Keyword 'Test_Unauthorized' failed after retrying for 10 seconds. The last error was: Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</test>
<test id="s1-s21-t18" name="Stop_Pcc_Mock_2" line="187">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast" type="SETUP">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T01:00:52.833627" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-05-01T01:00:52.833349" elapsed="0.000563"/>
</kw>
<kw name="Stop_Pcc_Mock_Tool">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.835179" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.834838" elapsed="0.000369"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-05-01T01:00:52.835364" elapsed="0.000416"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-05-01T01:00:52.834361" elapsed="0.001490"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-01T01:00:52.845626" level="INFO">00:59:30.076 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone
00:59:30.076 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix
00:59:30.077 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone
00:59:30.080 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix
^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-05-01T01:00:52.845796" level="INFO">${output} = 00:59:30.076 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.x...</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-05-01T01:00:52.835998" elapsed="0.009826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.846410" level="INFO">00:59:30.076 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone
00:59:30.076 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix
00:59:30.077 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone
00:59:30.080 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix
^C
[?2004h[jenkins@releng-26932-215-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.846131" elapsed="0.000353"/>
</kw>
<doc>Send ctrl+c to pcc-mock, fails if no prompt is seen
after 3 seconds (the default for SSHLibrary)</doc>
<status status="PASS" start="2026-05-01T01:00:52.834056" elapsed="0.012487"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.847404" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:52.847075" elapsed="0.000371"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-01T01:00:52.846779" elapsed="0.000743"/>
</kw>
<kw name="Do_Not_Start_Failing_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-05-01T01:00:52.848076" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-05-01T01:00:52.847775" elapsed="0.000560"/>
</kw>
<doc>Stops second instance of pcc-mock</doc>
<status status="PASS" start="2026-05-01T01:00:52.832914" elapsed="0.015460"/>
</test>
<test id="s1-s21-t19" name="Topology_Postcondition" line="195">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.850468" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.850215" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.850189" elapsed="0.000365"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-05-01T01:00:52.849894" elapsed="0.000987"/>
</kw>
<kw name="Verify_Keyword_Does_Not_Fail_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Confirm_Keyword_Fails_Within_Timeout" owner="WaitForFailure">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Test_Unauthorized">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.908003" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.907598" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.908815" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.908536" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.908990" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.908194" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.909580" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.909171" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.909912" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:52.910082" level="INFO">${template} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:52.909761" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.910532" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.910265" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.911547" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.911278" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.912147" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-01T01:00:52.911821" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.912665" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.912882" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.913059" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.912387" elapsed="0.000730"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.912234" elapsed="0.000917"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-05-01T01:00:52.913201" elapsed="0.000037"/>
</return>
<msg time="2026-05-01T01:00:52.913375" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-05-01T01:00:52.910969" elapsed="0.002431"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.910676" elapsed="0.002755"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.913615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.913473" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.910648" elapsed="0.003044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.914269" level="INFO">${final_text} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.913827" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.914344" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:52.906975" elapsed="0.007516"/>
</kw>
<msg time="2026-05-01T01:00:52.914545" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.906112" elapsed="0.008484"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.915109" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.915618" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.916109" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.916285" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.916449" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.916854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.916683" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:52.916669" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.917069" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.917230" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.917388" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.916639" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.916538" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.917621" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.917697" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:52.917820" level="INFO">${uri} = rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:52.901914" elapsed="0.015931"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.919095" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.918852" elapsed="0.000308">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.919252" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.918511" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.919611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.919346" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.920155" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.919861" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.919692" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.919328" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.922606" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.920374" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-05-01T01:00:52.922714" elapsed="0.000031"/>
</return>
<msg time="2026-05-01T01:00:52.922869" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:52.918181" elapsed="0.004712"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.924268" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.924033" elapsed="0.000296">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.924439" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.923689" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-05-01T01:00:52.924706" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:52.924565" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.924536" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.924936" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.925109" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.925175" elapsed="0.000016"/>
</return>
<msg time="2026-05-01T01:00:52.927308" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-05-01T01:00:52.923326" elapsed="0.004009"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.928752" level="INFO">rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.928503" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.929180" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.928940" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:52.935758" level="INFO">GET Request : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0t9wm88vmik1stbq64ohyrhl430.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-05-01T01:00:52.935931" level="INFO">GET Response : url=http://10.30.170.185:8181/rests/data/network-topology:network-topology/topology=pcep-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1114'} 
 body={"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]} 
 </msg>
<msg time="2026-05-01T01:00:52.936032" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-01T01:00:52.931396" elapsed="0.004662"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.929287" elapsed="0.006812"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.936270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.936125" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.929269" elapsed="0.007086"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.939864" level="INFO">{"network-topology:topology":[{"topology-id":"pcep-topology","node":[{"node-id":"pcc://10.30.170.157","network-topology-pcep:path-computation-client":{"stateful-capability":{"include-db-version":false,"lsp-update-capability":true,"triggered-resync":false,"initiation":true,"triggered-initial-sync":false,"delta-lsp-sync-capability":false},"state-sync":"synchronized","ip-address":"10.30.170.157","reported-lsp":[{"name":"pcc_10.30.170.157_tunnel_1","path":[{"lsp-id":1,"ero":{"ignore":false,"processing-rule":false,"subobject":[{"loose":false,"ip-prefix":{"ip-prefix":"1.1.1.1/32"}}]},"lsp":{"ignore":false,"tlvs":{"lsp-identifiers":{"ipv4":{"ipv4-tunnel-sender-address":"10.30.170.157","ipv4-extended-tunnel-id":"10.30.170.157","ipv4-tunnel-endpoint-address":"1.1.1.1"},"tunnel-id":1,"lsp-id":1},"symbolic-path-name":{"path-name":"cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="}},"processing-rule":false,"plsp-id":1,"lsp-flags":{"create":false,"sync":true,"operational":"up","remove":false,"administrative":true,"delegate":true,"pce-allocation":false}}}]}]}}],"topology-types":{"network-topology-pcep:topology-pcep":{}}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.937369" elapsed="0.002571"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.937151" elapsed="0.002836"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.937132" elapsed="0.002890"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.943654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.940404" elapsed="0.003313"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.940100" elapsed="0.003663"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.940077" elapsed="0.003720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.944558" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.944010" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.945007" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.944692" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.945780" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.945328" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.945119" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.944667" elapsed="0.001233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.946640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.946106" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.947166" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.946851" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.947888" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.947509" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.947278" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.946823" elapsed="0.001148"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.948112" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-05-01T01:00:52.948933" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.948632" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-05-01T01:00:52.949103" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-05-01T01:00:52.936725" elapsed="0.014869"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.951770" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:52.951666" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.951646" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.955253" level="INFO">${text_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.951973" elapsed="0.003310"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-05-01T01:00:52.955334" elapsed="0.000032"/>
</return>
<msg time="2026-05-01T01:00:52.955510" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-05-01T01:00:52.927658" elapsed="0.027879"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.955600" elapsed="0.000027"/>
</return>
<msg time="2026-05-01T01:00:52.955928" level="INFO">${response_text} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-05-01T01:00:52.879433" elapsed="0.076534"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.972302" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.971937" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.973044" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.972818" elapsed="0.000292">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-05-01T01:00:52.973202" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-01T01:00:52.972498" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.973780" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-01T01:00:52.973380" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-01T01:00:52.974091" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/tcpmd5user/vanadium/default_off/data.json&lt;/a&gt;'.</msg>
<msg time="2026-05-01T01:00:52.974346" level="INFO">${template} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-01T01:00:52.973957" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.974798" level="INFO">{
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:52.974541" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-05-01T01:00:52.975204" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.974911" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.975733" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-01T01:00:52.975423" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-01T01:00:52.975288" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.974891" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.976369" level="INFO">${final_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-01T01:00:52.975951" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-05-01T01:00:52.976445" elapsed="0.000047"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="PASS" start="2026-05-01T01:00:52.971313" elapsed="0.005277"/>
</kw>
<msg time="2026-05-01T01:00:52.976643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.970523" elapsed="0.006169"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.977170" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.977853" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off.vanadium/pcep-pcc-mock-1.0.1-executable.jar,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/tcpmd5user/../../../variables/tcpmd5user/vanadium/default_off/pcep-pcc-mock-1.0.1-executable.jar.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.978358" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.978552" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.978743" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.979112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.978977" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-05-01T01:00:52.978962" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.979323" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.979536" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.979696" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-05-01T01:00:52.978926" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.978821" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.979910" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.979987" elapsed="0.000015"/>
</return>
<msg time="2026-05-01T01:00:52.980103" level="INFO">${expected_text} = {
    "network-topology:topology": [
        {
            "topology-id": "pcep-topology",
            "topology-types": {
                "network-topology-pcep:topology-pcep": {}
            }
     ...</msg>
<var>${expected_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-05-01T01:00:52.967900" elapsed="0.012230"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.980297" elapsed="0.002199"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.983518" level="INFO">${expected_normalized} = {
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}
</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.983215" elapsed="0.000331"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-05-01T01:00:52.984433" level="INFO">${actual_normalized} = {
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.983690" elapsed="0.000787"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.984944" level="INFO">{
 "network-topology:topology": [
  {
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}

!=

{
 "network-topology:topology": [
  {
   "node": [
    {
     "network-topology-pcep:path-computation-client": {
      "ip-address": "10.30.170.157",
      "reported-lsp": [
       {
        "name": "pcc_10.30.170.157_tunnel_1",
        "path": [
         {
          "ero": {
           "ignore": false,
           "processing-rule": false,
           "subobject": [
            {
             "ip-prefix": {
              "ip-prefix": "1.1.1.1/32"
             },
             "loose": false
            }
           ]
          },
          "lsp": {
           "ignore": false,
           "lsp-flags": {
            "administrative": true,
            "create": false,
            "delegate": true,
            "operational": "up",
            "pce-allocation": false,
            "remove": false,
            "sync": true
           },
           "plsp-id": 1,
           "processing-rule": false,
           "tlvs": {
            "lsp-identifiers": {
             "ipv4": {
              "ipv4-extended-tunnel-id": "10.30.170.157",
              "ipv4-tunnel-endpoint-address": "1.1.1.1",
              "ipv4-tunnel-sender-address": "10.30.170.157"
             },
             "lsp-id": 1,
             "tunnel-id": 1
            },
            "symbolic-path-name": {
             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
            }
           }
          },
          "lsp-id": 1
         }
        ]
       }
      ],
      "state-sync": "synchronized",
      "stateful-capability": {
       "delta-lsp-sync-capability": false,
       "include-db-version": false,
       "initiation": true,
       "lsp-update-capability": true,
       "triggered-initial-sync": false,
       "triggered-resync": false
      }
     },
     "node-id": "pcc://10.30.170.157"
    }
   ],
   "topology-id": "pcep-topology",
   "topology-types": {
    "network-topology-pcep:topology-pcep": {}
   }
  }
 ]
}</msg>
<msg time="2026-05-01T01:00:52.985245" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
+            {
+             "ip-prefix": {
+              "ip-prefix": "1.1.1.1/32"
+             },
+             "loose": false
+            }
+           ]
+          },
+          "lsp": {
+           "ignore": false,
+           "lsp-flags": {
+            "administrative": true,
+            "create": false,
+            "delegate": true,
+            "operational": "up",
+            "pce-allocation": false,
+            "remove": false,
+            "sync": true
+           },
+           "plsp-id": 1,
+           "processing-rule": false,
+           "tlvs": {
+            "lsp-identifiers": {
+             "ipv4": {
+              "ipv4-extended-tunnel-id": "10.30.170.157",
+              "ipv4-tunnel-endpoint-address": "1.1.1.1",
+              "ipv4-tunnel-sender-address": "10.30.170.157"
+             },
+             "lsp-id": 1,
+             "tunnel-id": 1
+            },
+            "symbolic-path-name": {
+             "path-name": "cGNjXzEwLjMwLjE3MC4xNTdfdHVubmVsXzE="
+            }
+           }
+          },
+          "lsp-id": 1
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.984625" elapsed="0.000735">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>expected_raw=${expected_text}</arg>
<arg>actual_raw=${response}</arg>
<doc>Use norm_json to normalize both JSON arguments, call Should_Be_Equal.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.982817" elapsed="0.002743">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:52.982578" elapsed="0.003080">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_text}</arg>
<arg>${response}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.985836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-01T01:00:52.985695" elapsed="0.000197"/>
</branch>
<status status="FAIL" start="2026-05-01T01:00:52.982559" elapsed="0.003356">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<arg>response=${response}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=json</arg>
<arg>mapping=${mapping}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected text from template, provided response shuld be equal.
If ${normalize_json}, perform normalization before comparison.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.957295" elapsed="0.028774">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.956498" elapsed="0.029748">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:52.956098" elapsed="0.030722">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:52.956064" elapsed="0.030842">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.986996" elapsed="0.000071"/>
</return>
<arg>${DIR_WITH_TEMPLATES}${/}default_off</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.871164" elapsed="0.116101">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<doc>Try to access pcep topology with wrong password, should get empty topology</doc>
<status status="FAIL" start="2026-05-01T01:00:52.860191" elapsed="0.127363">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<msg time="2026-05-01T01:00:52.987667" level="INFO">${status} = FAIL</msg>
<msg time="2026-05-01T01:00:52.987713" level="INFO">${output} = Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:52.859825" elapsed="0.127912"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-01T01:00:52.987925" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-05-01T01:00:52.987810" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.987792" elapsed="0.000218"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.988148" elapsed="0.000022"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-01T01:00:52.988308" elapsed="0.000020"/>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.859082" elapsed="0.129345"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-05-01T01:00:52.857169" elapsed="0.131326"/>
</kw>
<msg time="2026-05-01T01:00:52.988546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-01T01:00:52.856332" elapsed="0.132261"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some Keywords need several tries to finally fail, this keyword passes if and only if the failure ultimately happens.</doc>
<status status="PASS" start="2026-05-01T01:00:52.855589" elapsed="0.133090"/>
</kw>
<msg time="2026-05-01T01:00:52.988774" level="INFO">${status} = PASS</msg>
<msg time="2026-05-01T01:00:52.988817" level="INFO">${output} = Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-01T01:00:52.854672" elapsed="0.134169"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-05-01T01:00:52.989048" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-05-01T01:00:52.988940" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-01T01:00:52.988921" elapsed="0.000195"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.989580" level="INFO">${output} = Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip...</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-01T01:00:52.989250" elapsed="0.000358"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.990131" level="FAIL">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.989752" elapsed="0.000492">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.853717" elapsed="0.136726">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<msg time="2026-05-01T01:00:52.990540" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.852564" elapsed="0.138026"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Test_Unauthorized</arg>
<doc>Some positive checks report false success for a short time. This keyword verifies no failure does happen within timeout period.
This implementation needs more complicated logic than, Verify_Keyword_Never_Passes_Within_Timeout,
so use that keyword in case you have a negative check handy.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.851650" elapsed="0.139110">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.992098" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:52.991785" elapsed="0.000355"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.991417" elapsed="0.000781"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.991109" elapsed="0.001147"/>
</kw>
<doc>Verify that pcep-topology stays empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-01T01:00:52.849004" elapsed="0.143294">Multiline strings are different:
--- first
+++ second
@@ -1,6 +1,73 @@
 {
  "network-topology:topology": [
   {
+   "node": [
+    {
+     "network-topology-pcep:path-computation-client": {
+      "ip-address": "10.30.170.157",
+      "reported-lsp": [
+       {
+        "name": "pcc_10.30.170.157_tunnel_1",
+        "path": [
+         {
+          "ero": {
+           "ignore": false,
+           "processing-rule": false,
+           "subobject": [
    [ Message content over the limit has been removed. ]
+         }
+        ]
+       }
+      ],
+      "state-sync": "synchronized",
+      "stateful-capability": {
+       "delta-lsp-sync-capability": false,
+       "include-db-version": false,
+       "initiation": true,
+       "lsp-update-capability": true,
+       "triggered-initial-sync": false,
+       "triggered-resync": false
+      }
+     },
+     "node-id": "pcc://10.30.170.157"
+    }
+   ],
    "topology-id": "pcep-topology",
    "topology-types": {
     "network-topology-pcep:topology-pcep": {}</status>
</test>
<test id="s1-s21-t20" name="Delete_Pcep_Client_Module" line="200">
<kw name="Fail_This_Fast_On_Previous_Error" owner="FailFast" type="SETUP">
<if>
<branch type="IF" condition="'''${SuiteFastFail}'''=='True'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.996307" level="FAIL">SKIPPED due to a failure in a previous fundamental test case.</msg>
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.994003" elapsed="0.002374">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<status status="FAIL" start="2026-05-01T01:00:52.993780" elapsed="0.002693">SKIPPED due to a failure in a previous fundamental test case.</status>
</branch>
<status status="FAIL" start="2026-05-01T01:00:52.993761" elapsed="0.002759">SKIPPED due to a failure in a previous fundamental test case.</status>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.993569" elapsed="0.003040">SKIPPED due to a failure in a previous fundamental test case.</status>
</kw>
<kw name="Start_Failing_Fast_If_This_Failed" owner="FailFast" type="TEARDOWN">
<kw name="Run Keyword If Test Failed" owner="BuiltIn">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-01T01:00:52.997880" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-01T01:00:52.997560" elapsed="0.000362"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.997188" elapsed="0.000786"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-05-01T01:00:52.996891" elapsed="0.001140"/>
</kw>
<doc>Delete Pcep client module.</doc>
<status status="FAIL" start="2026-05-01T01:00:52.993034" elapsed="0.005035">Setup failed:
SKIPPED due to a failure in a previous fundamental test case.</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-05-01T01:00:53.020235" level="INFO">[chan 7] Opened sftp connection (server version 3)</msg>
<msg time="2026-05-01T01:00:53.034233" level="INFO">'pccmock.log' -&gt; '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/pccmock.log'</msg>
<arg>pccmock.log</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-05-01T01:00:52.998840" elapsed="0.035562"/>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-05-01T01:00:53.036129" level="INFO">Running command 'cat pccmock.log 2&gt;&amp;1'.</msg>
<msg time="2026-05-01T01:00:53.039624" level="INFO">${pccmocklog} = 01:00:11.470 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0x0f980374, L:/10.30.170...</msg>
<var>${pccmocklog}</var>
<arg>cat pccmock.log</arg>
<doc>_This keyword is considered deprecated. Use the
[http://robotframework.org/robotframework/latest/libraries/Process.html|
Process] library instead._</doc>
<status status="PASS" start="2026-05-01T01:00:53.034968" elapsed="0.004700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-01T01:00:53.040309" level="INFO">01:00:11.470 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiatorFactory -- Replacing bootstrap negotiator for channel [id: 0x0f980374, L:/10.30.170.157:42187 - R:10.30.170.185/10.30.170.185:4189]
01:00:11.622 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP session with [id: 0x0f980374, L:/10.30.170.157:42187 - R:10.30.170.185/10.30.170.185:4189] started, sent proposal Open{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}
01:00:11.642 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.parser.object.PCEPOpenObjectParser -- Add Path Setup Type Capability TLV: PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}
01:00:11.644 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.AbstractPCEPSessionNegotiator -- PCEP peer [id: 0x0f980374, L:/10.30.170.157:42187 - R:10.30.170.185/10.30.170.185:4189] completed negotiation
01:00:11.646 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Session /10.30.170.157:42187[0] &lt;-&gt; 10.30.170.185/10.30.170.185:4189[2] started
01:00:11.676 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone
01:00:11.677 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix
01:00:11.678 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone
01:00:11.679 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.yangtools.binding.reflect.StringValueObjectFactory -- Instantiated factory for class org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix
01:00:42.504 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Closing PCEP session: PCEPSessionImpl{channel=[id: 0x0f980374, L:/10.30.170.157:42187 - R:10.30.170.185/10.30.170.185:4189], localOpen=Open{deadTimer=120, keepalive=30, sessionId=0, tlvs=Tlvs{lspDbVersion=LspDbVersion{lspDbVersionValue=1}, statefulCapability=StatefulCapability{deltaLspSyncCapability=false, includeDbVersion=false, initiation=true, lspUpdateCapability=true, triggeredInitialSync=false, triggeredResync=false}}}, remoteOpen=Open{deadTimer=120, ignore=false, keepalive=30, processingRule=false, sessionId=2, tlvs=Tlvs{associationTypeList=AssociationTypeList{associationType=[PathProtection, Disjoint, Policy, SingleSideLsp, DoubleSideLsp, SrPolicy]}, pathSetupTypeCapability=PathSetupTypeCapability{psts=[RsvpTe, SrMpls, Srv6], srPceCapability=SrPceCapability{msd=0, nFlag=true, xFlag=true}, srv6PceCapability=Srv6PceCapability{nFlag=true}}, statefulCapability=StatefulCapability{deltaLspSyncCapability=true, includeDbVersion=true, initiation=true, lspUpdateCapability=true, triggeredInitialSync=true, triggeredResync=true}}, version=ProtocolVersion{value=1}}}
01:00:42.505 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.impl.PCEPSessionImpl -- Closing PCEP session channel: [id: 0x0f980374, L:/10.30.170.157:42187 - R:10.30.170.185/10.30.170.185:4189]
01:00:42.508 [multiThreadIoEventLoopGroup-2-4] INFO org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCSessionListener -- Session terminated. Cause : PCEPCloseTermination{reason=UNKNOWN}</msg>
<arg>${pccmocklog}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-01T01:00:53.039893" elapsed="0.000526"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-01T01:00:53.040746" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-01T01:00:53.040642" elapsed="0.000383"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-01T01:00:53.041284" elapsed="0.000531"/>
</kw>
<doc>Download pccmock.log and Log its contents.
Compute and Log the diff between expected and actual normalized responses.
Close both HTTP client session and SSH connection to Mininet.</doc>
<status status="PASS" start="2026-05-01T01:00:52.998610" elapsed="0.043297"/>
</kw>
<doc>TCPMD5 user-facing feature system tests, using PCEP.

Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
and is available at http://www.eclipse.org/legal/epl-v10.html

Test suite performs basic pcep md5 password authorization test cases:
(Run entire basic PCEP suite without passwords.)
Start pcc-mock (reconnecting mode): 1 pcc, 1 lsp, password set, check pcep-topology stays empty.
Use restconf to change PCEP configuration to use a wrong password, check pcep-topology stays empty.
Change ODL PCEP configuration to use the correct password, check pcep-topology shows the lsp.
Stop pcc-mock, check pcep-topology stays empty.
Start pcc-mock with new password, check pcep-topology stays empty.
Change ODL PCEP configuration to use the correct password, check pcep-topology shows the lsp.
Update the lsp, check a change in pcep-topology.
Change ODL PCEP configuration to not use password, pcep-topology empties, kill pcep-pcc-mock.

Test cases no longer need netconf-connector-ssh, and they include comparison of
pcep-session-state.</doc>
<status status="FAIL" start="2026-05-01T00:59:05.395267" elapsed="107.646690"/>
</suite>
<status status="FAIL" start="2026-05-01T00:39:13.454169" elapsed="1299.590425"/>
</suite>
<statistics>
<total>
<stat pass="337" fail="55" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="116" fail="33" skip="0">critical</stat>
<stat pass="0" fail="1" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=4834</stat>
<stat pass="0" fail="1" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=4835</stat>
<stat pass="1" fail="0" skip="0">local_run</stat>
</tag>
<suite>
<stat name="bgpcep-userfeatures.txt" id="s1" pass="337" fail="55" skip="0">bgpcep-userfeatures.txt</stat>
<stat name="050 Bmp Basic" id="s1-s1" pass="4" fail="0" skip="0">bgpcep-userfeatures.txt.050 Bmp Basic</stat>
<stat name="Pcepuser" id="s1-s2" pass="6" fail="10" skip="0">bgpcep-userfeatures.txt.Pcepuser</stat>
<stat name="Bgp Functional Md5" id="s1-s3" pass="2" fail="0" skip="0">bgpcep-userfeatures.txt.Bgp Functional Md5</stat>
<stat name="Basic" id="s1-s4" pass="16" fail="22" skip="0">bgpcep-userfeatures.txt.Basic</stat>
<stat name="Bgp Ipv6 Basic" id="s1-s5" pass="36" fail="0" skip="0">bgpcep-userfeatures.txt.Bgp Ipv6 Basic</stat>
<stat name="Bgp Llgr Basic" id="s1-s6" pass="4" fail="0" skip="0">bgpcep-userfeatures.txt.Bgp Llgr Basic</stat>
<stat name="Bgp App Peer Basic" id="s1-s7" pass="28" fail="0" skip="0">bgpcep-userfeatures.txt.Bgp App Peer Basic</stat>
<stat name="Ibgp Peers Basic" id="s1-s8" pass="36" fail="0" skip="0">bgpcep-userfeatures.txt.Ibgp Peers Basic</stat>
<stat name="Ebgp Peers Basic" id="s1-s9" pass="15" fail="7" skip="0">bgpcep-userfeatures.txt.Ebgp Peers Basic</stat>
<stat name="010 Bgp Flowspec" id="s1-s10" pass="5" fail="0" skip="0">bgpcep-userfeatures.txt.010 Bgp Flowspec</stat>
<stat name="Ibgp Peer Lsp" id="s1-s11" pass="11" fail="1" skip="0">bgpcep-userfeatures.txt.Ibgp Peer Lsp</stat>
<stat name="010 Bgp Functional L3Vpn" id="s1-s12" pass="9" fail="0" skip="0">bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn</stat>
<stat name="030 Bgp Functional Evpn" id="s1-s13" pass="78" fail="0" skip="0">bgpcep-userfeatures.txt.030 Bgp Functional Evpn</stat>
<stat name="040 Bgp Functional Route Ref" id="s1-s14" pass="4" fail="2" skip="0">bgpcep-userfeatures.txt.040 Bgp Functional Route Ref</stat>
<stat name="020 Bgp Functional Multipath" id="s1-s15" pass="2" fail="2" skip="0">bgpcep-userfeatures.txt.020 Bgp Functional Multipath</stat>
<stat name="060 Bgp Functional Mvpn" id="s1-s16" pass="29" fail="0" skip="0">bgpcep-userfeatures.txt.060 Bgp Functional Mvpn</stat>
<stat name="070 Bgp Functional L3Vpn Mcast" id="s1-s17" pass="10" fail="0" skip="0">bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast</stat>
<stat name="080 Bgp Functional Rt Constrain" id="s1-s18" pass="14" fail="0" skip="0">bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain</stat>
<stat name="090 Bgp Functional Rt Constrain Validation" id="s1-s19" pass="8" fail="3" skip="0">bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation</stat>
<stat name="Bgp Policies Default" id="s1-s20" pass="7" fail="1" skip="0">bgpcep-userfeatures.txt.Bgp Policies Default</stat>
<stat name="Tcpmd5User" id="s1-s21" pass="13" fail="7" skip="0">bgpcep-userfeatures.txt.Tcpmd5User</stat>
</suite>
</statistics>
<errors>
<msg time="2026-05-01T00:40:25.411178" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.Bgp Functional Md5' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.503576" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.504327" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.504909" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.505603" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.511250" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:40:54.514171" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:41:46.399025" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.Bgp Ipv6 Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:44:44.017722" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.Bgp Llgr Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.913219" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.914157" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.914771" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.915288" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.921137" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:45:17.924102" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Bgp App Peer Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.003769" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.004496" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.005025" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.005506" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.011326" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.038098" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BgpOperations.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:46:04.044870" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Ibgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.390580" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.391607" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.392346" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.393035" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.399124" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.402422" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BgpOperations.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:47:15.404495" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Ebgp Peers Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:49:46.576813" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.010 Bgp Flowspec' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.824267" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.825048" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.825683" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.826217" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.832032" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.835123" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BgpOperations.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:00.836694" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Ibgp Peer Lsp' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:50:50.027051" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:51:10.425940" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.030 Bgp Functional Evpn' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:54:03.885257" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.040 Bgp Functional Route Ref' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:54:52.301577" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.020 Bgp Functional Multipath' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:55:43.849823" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.060 Bgp Functional Mvpn' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:57:04.481082" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:57:26.271478" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:57:59.177002" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:58:16.584815" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPcliKeywords.robot' on line 15: Suite 'bgpcep-userfeatures.txt.Bgp Policies Default' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:59:05.404252" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-userfeatures.txt.Tcpmd5User' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:59:05.408287" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-userfeatures.txt.Tcpmd5User' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:59:05.408815" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-userfeatures.txt.Tcpmd5User' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:59:05.418341" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'bgpcep-userfeatures.txt.Tcpmd5User' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-01T00:59:05.420273" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-userfeatures.txt.Tcpmd5User' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
